unity tag script rich prefab from create unity3d transform hlsl cg geometry-surface

unity3d - tag - unity static inspector



Posición de vértice relativa a la normal (2)

Parece que estás tratando de rotar pos por la misma rotación que se transformaría hasta new_up .

Usando la matriz de rotación que se encuentra aquí , podemos rotar pos usando el siguiente código. Esto funcionará en la función de superficie o en una función de vértice adicional, dependiendo de su aplicación:

// Our 3 vectors float3 pos; float3 new_up; float3 up = float3(0,1,0); // Build the rotation matrix using notation from the link above float3 v = cross(up, new_up); float s = length(v); // Sine of the angle float c = dot(up, new_up); // Cosine of the angle float3x3 VX = float3x3 ( 0, -1 * v.z, v.y, v.z, 0, -1 * v.x, -1 * v.y, v.x, 0 ); // This is the skew-symmetric cross-product matrix of v float3x3 I = float3x3 ( 1, 0, 0, 0, 1, 0, 0, 0, 1 ); // The identity matrix float 3x3 R = I + VX + mul(VX, VX) * (1 - c)/pow(s,2) // The rotation matrix! YAY! // Finally we rotate float3 new_pos = mul(R, pos);

Esto supone que new_up está normalizado.

Si el "objetivo normal" es una constante, el cálculo de R podría (y debería) solo ocurrir una vez por cuadro. Recomiendo hacerlo en el lado de la CPU y pasarlo al sombreador como una variable. Cálculo de cada vértice / fragmento es costoso, considere lo que realmente necesita.

Si su posición es un vector-4, simplemente haga lo anterior con los primeros tres elementos, el cuarto elemento puede permanecer sin cambios (de todos modos, en realidad no significa nada en este contexto).

Estoy lejos de una máquina donde puedo ejecutar el código de sombreado, por lo que si cometí algún error sintáctico en el anterior, por favor, perdóneme.

En un sombreador de superficie , dado el eje ascendente del mundo (y los otros también), una posición espacial mundial y una normal en el espacio mundial, ¿cómo podemos rotar la posición del espacio mundial en el espacio de lo normal?

Es decir, dado un vector ascendente y un vector diana no ortogonal, ¿cómo podemos transformar la posición girando su vector ascendente?

Necesito esto para poder obtener la posición de vértice solo afectada por la matriz de rotación del objeto, a la que no tengo acceso.

Aquí hay una visualización gráfica de lo que quiero hacer:

  • Up es el vector ascendente del mundo
  • El objetivo es el espacio mundial normal
  • Pos es arbitrario

El diagrama es bidimensional, pero necesito resolver esto para un espacio 3D.


No probado, pero debería poder ingresar un point inicio y un axis . Entonces, todo lo que debes hacer es cambiar la procession que es un flotador normalizado (0-1) a lo largo de la circunferencia y tu punto se actualizará en consecuencia.

using UnityEngine; using System.Collections; public class Follower : MonoBehaviour { Vector3 point; Vector3 origin = Vector3.zero; Vector3 axis = Vector3.forward; float distance; Vector3 direction; float procession = 0f; // < normalized void Update() { Vector3 offset = point - origin; distance = offset.magnitude; direction = offset.normalized; float circumference = 2 * Mathf.PI * distance; angle = (procession % 1f) * circumference; direction *= Quaternion.AngleAxis(Mathf.Rad2Deg * angle, axis); Ray ray = new Ray(origin, direction); point = ray.GetPoint(distance); } }