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);
}
}