-
2 Archivos adjunto(s)
Animación de una torreta
Hola. Tengo una duda, que no he visto que se haya resuelto por aquí:
Tengo una nave espacial, y en esta tengo varias torretas. Las torretas se componen de dos objetos (la torreta en sí y los cañones)(como un tanque). Con jerarquías, tengo todo funcionando perfectamente. El problema surge cuando intento aplicar IK, para poder poner un objetivo y que la torreta apunte siempre a este.
Después de investigar mucho, para torretas de tanques he visto que lo que se ha hecho es que la torreta apunte a un punto con constraint at, y que este esté siempre en el plano X/Y. Este punto, obtiene sus coordenadas de la posición X/Y del verdadero objetivo. El cañón, simplemente apunta (también con constraint at) al verdadero objetivo.
Esto funciona muy bien, hasta qué sales del plano. Si inclinas el plano sobre el que debería girar la torreta, todo se estropea.
La solución que se me ocurre es obtener la proyección ortogonal del verdadero objetivo sobre el plano imaginario en el que gira la torreta (en vez del X/Y universal). Cómo se logra eso, es lo que no tengo ni idea.
Sé que está explicado muy mal, y por eso voy a poner alguna imagen para mostrar el problema. Espero su ayuda humildemente.
Posdata: Uso 3D Max Studio 2014.
Edito: imágenes explicativas:
Archivo adjunto 197421
Archivo adjunto 197422
-
1 Archivos adjunto(s)
Animación de una torreta
Bueno, ayer me vino la inspiración y lo conseguí.
Hice 3 puntos extras para obtener el plano donde la torreta debe estar apoyada, y luego a usar matemáticas: Proyección ortogonal del objetivo sobre el plano creado por esos 3 puntos. Esto me obligó a realizar mi primer MaxScript. Luego, los ejes de los objetos deben estar ajustados de tal forma qué según se enlacen, queden apuntando en la dirección correcta con la configuración inicial, exceptuando el campo Select Upnode. Si configurando ese no va, luego al rotar empezaba a hacer cosas raras. (aunque cambiases los ejes.)
El código aplicado al ayudante es:
Código:
T1=P1.pos, y*P2.pos, z+P1.pos, z*P3.pos, y+P2.pos, y*P3.pos, z;
T1-=P1.pos, y*P3.pos, z+P1.pos, z*P2.pos, y+P2.pos, z*P3.pos, y;.
T2=P1.pos.x*P3.pos, z+P1.pos, z*P2.pos.x+P2.pos, z*P3.pos.x;
T2-=P1.pos.x*P2.pos, z+P1.pos, z*P3.pos.x+P2.pos.x*P3.pos, z;.
T3=P1.pos.x*P2.pos, y+P1.pos, y*P3.pos.x+P2.pos.x*P3.pos, y;
T3-=P1.pos.x*P3.pos, y+P1.pos, y*P2.pos.x+P2.pos, y*P3.pos.x;.
Ter=P1.pos.x*P2.pos, z*P3.pos, y+P1.pos, y*P2.pos.x*P3.pos, z+P1.pos, z*P2.pos, y*P3.pos.x;
Ter-=P1.pos.x*P2.pos, y*P3.pos, z+P1.pos, y*P2.pos, z*P3.pos.x+P1.pos, z*P2.pos.x*P3.pos, y;.
T=(T1*PQ.pos.x+T2*PQ.pos, y+T3*PQ.pos, z+Ter)*-1;
t/=(T1*T1)+(T2*T2)+(T3*T3);.
x=PQ.pos.x+T1*t;
y=PQ.pos, y+T2*t;
z=PQ.pos, z+T3*t;.
[ x, y, z ]
Donde P1, P2 y P3 son los puntos que definen el plano, y PQ es el objetivo.
Aquí una prueba qué hice:
Archivo adjunto 197485