Transformando un plano 3D utilizando una matriz 4x4.
plane (3)
Esta pregunta es un poco antigua, pero me gustaría corregir la respuesta aceptada.
No necesitas convertir tu representación plana.
Cualquier punto se encuentra en el avión Si
Se puede escribir como producto de punto:
Estas buscando el avion transformado por tu matriz 4x4 .
Por el mismo motivo, debes tener
Asi que y con algunos arreglos
TLDR : si p=(a,b,c,d)
, p'' = transpose(inverse(M))*p
Tengo una forma hecha de varios triángulos que se coloca en algún lugar del espacio del mundo con escala, rotar, traducir. También tengo un plano en el que me gustaría proyectar (ortogonal) la forma.
Podría multiplicar cada vértice de cada triángulo en la forma con la matriz de transformación de objetos para averiguar dónde está ubicado en coordenadas mundiales, y luego proyectar este punto en el plano.
Pero no necesito dibujar la proyección, y en cambio me gustaría transformar el plano con la matriz de transformación inversa de la forma, y luego proyectar todos los vértices en el plano (transformado inverso). Ya que solo me obliga a transformar el plano una vez y no a cada vértice.
Mi avión tiene una normal (xyz) y una distancia (d). ¿Cómo lo multiplico con una matriz de transformación 4x4 para que quede bien?
¿Puedes crear un vec4 como xyzd y multiplicarlo? ¿O tal vez crear un vector xyz1 y luego qué hacer con d?
Necesitas convertir tu plano a una representación diferente. Una donde N es la normal, y O es cualquier punto en el plano. Lo normal ya lo sabes, es tu (xyz). Un punto en el plano también es fácil, es tu N normal por tu distancia d .
Transforma O por la matriz 4x4 de la manera normal, esto se convierte en tu nueva O. Necesitará un Vector4 para multiplicar con una matriz de 4x4, establezca el componente W en 1 (x, y, z, 1).
También transforme N por la matriz 4x4, pero establezca el componente W en 0 (x, y, z, 0). Establecer el componente W en 0 significa que sus normales no se traducirán. Si su matriz se compone de más que solo de traducción y rotación, entonces este paso no es tan simple. En lugar de multiplicar por su matriz de transformación, tiene que multiplicar por la transposición de la inversa de la matriz, es decir, Matrix4.Transpose(Matrix4.Invert(Transform))
, hay una buena explicación sobre por qué here .
Ahora tiene un nuevo vector normal N y un nuevo vector de posición O. Sin embargo, supongo que lo quieres en forma xyzd de nuevo? No hay problema. Como antes, xyz es su N normal, todo lo que queda es calcular d. d es la distancia del plano desde el origen, a lo largo del vector normal. Por lo tanto, es simplemente el producto puntual de O y N.
¡Ahí tienes! Si me dices en qué idioma estás haciendo esto, con gusto también lo escribiré en el código.
EDITAR, en pseudocódigo:
El plano es vector3 xyz
y el number d
, la matriz es una matriz matrix4x4 M
vector4 O = (xyz * d, 1)
vector4 N = (xyz, 0)
O = M * O
N = transpose(invert(M)) * N
xyz = N.xyz
d = dot(O.xyz, N.xyz)
xyz
d
representan el nuevo plano
Notación
-
n
es una normal representada como un vector fila (1x3) -
n''
es la normal transformada de n según la matriz de transformaciónT
-
(n|d)
es un plano representado como un vector fila (1x4) (conn
la normal del planod
la distancia del plano al origen) -
(n''|d'')
es el plano transformado de(n|d)
según la matriz de transformaciónT
-
T
es una matriz de transformación principal de columna (afín) (4x4) (es decir, la transformación de un vector de columna t se define comot'' = T t
).
Transformando una n normal :
n'' = n adj(T)
Transformando un plano (n | d) :
(n''|d'') = (n|d) adj(T)
Aquí, adj es el complemento de una matriz que se define como sigue en términos de la inversa y determinante de una matriz:
T^-1 = adj(T)/det(T)
Nota :
El agregado generalmente no es igual a la inversa de una matriz de transformación T. Si T incluye una reflexión, det (T) = -1, ¡invirtiendo el orden de bobinado!
La re-normalización de n ''no es matemáticamente necesaria (pero puede ser numéricamente dependiendo de la implementación) ya que el determinante cuida la escala.Gracias a Adrian Leonhard.- Puede transformar directamente el plano sin descomponer y recomponer primero un plano (normal y punto).