2012-06-04 73 views
1

我使用GLM ::每班四绕某一轴的向量。但矢量反转轴每次它被调用。四元数反转向量

这里是我的代码来绕侧轴我的对象:

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); 
} 

每次我调用这个方法,我起来矢量转身轴,也反转。我可以解决此问题:

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

但这更像是治疗症状,而不是寻找原因。也许有人在这里可以帮助我理解四元数确实在这里。

回答

1

那么这里就是答案,四元数初始化错了...

这些线不翼而飞:

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

因此该方法的正确版本是这样的:

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)); 
} 

(从第一个版本开始,这个类已经经历了相当多的重构,但是这个想法应该很清楚)