1

我正在使用 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);

但这更像是治标不治本。也许这里有人可以帮助我理解四元数在这里的作用。

4

1 回答 1

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

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

于 2012-06-06T00:35:50.527 回答