2012-06-04 6 views
1

J'utilise glm :: quaternions pour faire tourner un vecteur autour d'un certain axe. Mais le vecteur inverse l'axe chaque fois qu'il est appelé.quaternion inverse le vecteur

Voici mon code pour faire tourner mon objet autour de l'axe latéral:

void PlayerController::rotateForward(float angle) { 
    angle = (angle*M_PI)/180.0f; 
    fquat rot = fquat(angle, playerObject->getVecSide()); 
    normalize(rot); 
    vec4 newUpVec = rot * vec4(playerObject->getVecUp(), 1.0f); 
    normalize(newUpVec); 
    vec3 upVec3 = normalize(vec3(newUpVec.x ,newUpVec.y, newUpVec.z)); 

    playerObject->setVecUp(upVec3); 
    playerObject->setVecForward(-normalize(cross(playerObject->getVecUp(), playerObject->getVecSide()))); 
    vec3 newPlayerPos = currentPlanet->getPosition() + (playerObject->getVecUp() * radius); 
    playerObject->setPosition(newPlayerPos); 
} 

chaque fois que j'appelle cette méthode, mon haut vecteur est tourné autour de l'axe, mais aussi inversé. Je peux travailler autour de cela en utilisant:

vec4 newUpVec = rot * -vec4(playerObject->getVecUp(), 1.0f); 

mais cela est plus comme le traitement des symptômes au lieu de trouver la cause. Peut-être que quelqu'un ici peut m'aider à comprendre ce que le quaternion fait ici.

Répondre

1

Eh bien voici la réponse, l'initialisation du quaternion a eu tort ...

ces lignes ont été portés disparus:

rotateAround = rotateAround * sinf(angle/2.0f); 
angle = cosf(angle/2.0f); 

donc la version correcte de la méthode ressemble à ceci:

vec3 GameObjectRotator::rotateVector(float angle, vec3 toRotate, vec3 rotateAround) { 
    angle = (angle*M_PI)/180.0f; 

    rotateAround = rotateAround * sinf(angle/2.0f); 
    angle = cosf(angle/2.0f); 

    fquat rot = fquat(angle, rotateAround); 
    normalize(rot); 
    vec4 rotated = rot * vec4(toRotate, 1.0f); 
    normalize(rotated); 
    return normalize(vec3(rotated)); 
} 

(la classe a traversé un peu de refactorisation depuis la première version, mais l'idée devrait être claire de toute façon)