四元数反转向量

时间:2012-06-04 10:35:04

标签: quaternions glm

我正在使用glm :: quaternions围绕某个轴旋转矢量。但是每次调用时,矢量都会反转轴。

以下是围绕侧轴旋转对象的代码:

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 个答案:

答案 0 :(得分: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));
}

(自第一个版本以来,该类经历了相当多的重构,但无论如何都应该清楚这个想法)