Actualmente para sacar coordenadas de 3DSMax para poder usarlas en OpenGL, hago lo siguiente:
WriteFloat _f -pos.x
WriteFloat _f pos.z
WriteFloat _f pos.y
Es decir, invierto la X, e intercambio Y por Z.
El problema es que no se que hacer con las quaternions...
WriteFloat _f q.w
WriteFloat _f q.x
WriteFloat _f q.y
WriteFloat _f q.z
Como deberia de transformarlas antes de exportarlas para usarlas desde OpenGL? :)
Assias de antemano.
pd. lo de arriba es codigo en maxscript.
Me gustaria exportar las quaternions ya transformadas para poder usarlas en OpenGL.
jejeje... no se cuantas veces me habra pasado que despues de un buen rato intentando algo sin lograrlo,... pongo un post preguntando, y a los 5 minutos lo saco.... (nooo)
En fins... estoy probando asin...
WriteFloat _f -q.w
WriteFloat _f -q.x
WriteFloat _f q.z
WriteFloat _f q.y
... y parece que rula :rolleyes:
Me parece demasiado simple pero bueno, tal vez las rotaciones de OpenGL sean más parecidas a las de MAX que en el caso de Direct3D.
Yo para conseguir el quaternion de MAX para Direct3D tengo que hacer muchas más cosas. Eso sí, no lo hago directamente con quaternions porque para mi al menos no son tan familiares como para eso. En su lugar hago la conversión sobre la matriz (que es algo más racional :D) y luego paso a quaternion.
Saludos.
Weno.... he dicho... "parece que rula"... jejeje todavia no esta bien probado.
Solo por curiosidad, ¿como lo haces para Direct3D?
fn switchYZ v = (
return [v.x, v.z, v.y]
)
fn quat_MAXToD3D q = (
local mat = q as Matrix3
local right = mat.row1
local up = mat.row2
local look = mat.row3
right = switchYZ right
up = switchYZ up
look = switchYZ look
mat.row1 = right
mat.row2 = up
mat.row3 = -look
mat = inverse mat
return (mat as quat)
)
Tal vez (seguramente :)) tengas que cambiar algún signo (por ejemplo quitar el menos del look) y tal vez no calcular la inversa de la matriz.
La verdad es que esa función me dió bastantes quebraderos de cabeza pero hasta ahora ha funcionado en todos los casos. La versión que exporta el quaternion de la cámara es igual sólo que no calcula la inversa...es que no es lo mismo un mesh que una cámara o una luz (utilizan sistemas de coordenadas diferentes)... :D
Saludos.
Ok. Gracias. ;)
Si mi "truco" me falla, ya tengo donde agarrarme.
Pues esta mañana haciendo pruebas mi truco ha "fallado".
Después de !!!mas de 5 horas!!!! pegandome de lexes con las putas rotaciones (tb habia probado el código que has puesto, con mil formas y variaciones)... va y me doy cuenta de que el problema era el gizmo del objeto en cuestion!!!! (nooo) (nooo) (nooo) (nooo)
Con un gizmo ""correcto"" mi "truco" parece seguir funcionando <_<
...odio las mates... (asco) (asco) (asco)
Supongo que con el gizmo te refieres al pivot point que lo has alineado al sistema de coordenadas que te convenía...
Pensé en hacer eso yo también pero la verdad es que preferí no tener que involucrar al grafista en estas cuestiones y encontrar una solución que funcionara sin modificar nada. Eso sí, como dije es un poco follonero porque el sistema de coordenadas difiere entre un mesh (o una luz) y una cámara y tampoco sé a ciencia cierta si existe algún otro caso que difiera de los dos casos anteriores, por lo que lo ideal sería llegar a una fórmula que pasándole los 3 ejes de coordenadas te diga qué conversión realizar (que supongo que se podrá).
Saludos.
Citar
Supongo que con el gizmo te refieres al pivot point que lo has alineado al sistema de coordenadas que te convenía...
Si, me refiero al pivot point.
Pero no lo he alineado al sistema de coordenadas que me convenia; sino al que "tocaba".
Mi problema venia derivado a que por un lado exporto mediante un conversor ASE->MI FORMATO las geometrias, y con un maxscript exporto las animaciones (posicion+rotacion) de "dummies" "linkados" a los objetos; y el dummy en cuestion tenia un gizmo en unos ejes y el mesh lo tenia en otros ejes. Y yo sin darme cuenta :P
Tambien me he dado cuenta de una cosa probando; he creado un cubo y exportado a ASE con el gizmo normal, y tambien el mismo cubo con el gizmo rotado aleatoriamente.
En ambos ficheros ASE, los vertices estan alineados a los ejes de coordenadas (independientemen de que el gizmo no se encuentre alineado). Sin embargo; los vertices no estan en las mismas posiciones y hay un nodo llamado NODE_TM que guarda la rotacion del gizmo. :blink:
Todavia hay alguien que opine que el ASE es facil ? <_<
pd. ¿sabrias decirme como averiguar si el nombre de un nodo tiene una cadena de caracteres (en maxscript)?
Cita de: "Lord Trancos 2"pd. ¿sabrias decirme como averiguar si el nombre de un nodo tiene una cadena de caracteres (en maxscript)?
Puedes utilizar la función findString. Te devuelve el índice del primer caracter de la cadena buscada y si no la encuentra te devuelve undefined.
Ej:
findString "Hola mundo cruel" "cruel"
te devolverá 12.
Saludos.
gracias (ole)