2012-03-29 21 views
13

Tengo un objeto que primero quiero rotar (sobre su propio centro) y luego lo traduzco a algún punto. Tengo un glm :: quat que contiene la rotación y un glm :: vec3 que contiene el punto al que necesita ser traducido.glm combinar rotación y traslación

glm::vec3 position; 
glm::quat orientation; 
glm::mat4 modelmatrix; <-- want to combine them both in here 

modelmatrix = glm::translate(glm::toMat4(orientation),position); 

Entonces en mi función hago render ..

pvm = projectionMatrix*viewMatrix*modelmatrix; 
glUniformMatrix4fv(pvmMatrixUniformLocation, 1, GL_FALSE, glm::value_ptr(pvm)); 

..y hacer ...

Desafortunadamente el objeto simplemente orbita alrededor del origen cuando solicito una rotación (cuanto más lejos la "posición" desde el origen, más grande es la órbita).

Cuando solicito solo la posición se traduce bien. Cuando aplico solo la rotación, permanece en el origen y gira alrededor de su centro (como se esperaba). Entonces, ¿por qué se vuelve extraño cuando los aplico a los dos? ¿Me estoy perdiendo algo básico?

Respuesta

23

Porque los está aplicando en el orden incorrecto. Haciendo glm::translate(glm::toMat4(orientation),position), que está haciendo el equivalente a esto:

glm::mat4 rot = glm::toMat4(orientation); 
glm::mat4 trans = glm::translate(glm::mat4(1.0f), position); 
glm::mat4 final = rot * trans; 

cuenta que la traducción está en el lado derecho de la matriz, no la izquierda. Esto significa que la traducción ocurre primero, luego ocurre la rotación relativa a la traducción. Entonces la rotación ocurre en el espacio después de la traducción.

Quiere que ocurra la rotación primero. De modo que invierta el orden de la multiplicación de la matriz.

+0

Tenía la impresión de que glm :: translate aplica la traducción al primer argumento de la función. Gracias. – Jubei

+3

@Jubei: * aplica * la traducción a la matriz. Correcto-lo multiplica. Eso significa que la traducción ocurre * primero *, cuando quiere que la rotación suceda primero. –

+0

Gracias por esta respuesta, he estado atrapado en esto un tiempo hoy, pero a pesar de que me di cuenta de lo que estaba haciendo mal, simplemente no pude encontrar ninguna confirmación de que así es como se supone que funcionan las funciones. –