【问题标题】:quaternion inverts vector四元数反转向量
【发布时间】:2012-06-04 10:35:03
【问题描述】:

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

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

【问题讨论】:

    标签: quaternions glm


    【解决方案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-11
      • 1970-01-01
      • 2013-03-30
      • 2011-10-08
      • 2023-04-06
      • 1970-01-01
      • 2022-10-16
      • 2012-01-26
      • 1970-01-01
      相关资源
      最近更新 更多