我正在使用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);
但这更像是治疗症状而不是找病因。也许周围的人可以帮助我理解四元数在这里的作用。
答案 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));
}
(自第一个版本以来,该类经历了相当多的重构,但无论如何都应该清楚这个想法)