我正在开发一个 2D/3D 游戏引擎,可在此处获得:https ://github.com/crakouille/ngengine
库 3D 相机类在 include/video/D3/camera/camera.h 中定义
我将所需的向量存储在 gluLookAt 中:
glm::vec3 _position;
glm::vec3 _target;
glm::vec3 _normal;
在examples/05_3D 中编写了一个FreeFly Camera 实现(扩展了Library 3D Camera),使用了球坐标。它运作良好。
在examples/06_CameraQuat 中,使用四元数编写了另一个FreeFly Camera 实现。我的问题就在那里。
当我在一个轴上旋转时,它工作得很好,但是当我在两个轴上旋转(通过用鼠标做圆圈)时,相机会在目标轴上旋转,这是一个问题。
没有错误(05_3D 示例):
与目标轴旋转的错误(06_CameraQuat)。
这是相机的代码:
自由飞翔.h:
class FreeFly : public nge::video::D3::Camera {
public:
...
void rotateForward(double angle); // rotate around on the forward axis
void rotateLeft(double angle); // rotate around on the left axis
void rotateNormal(double angle); // rotate around on the normal axis
private:
void updateVectRel(); // update _targetRel, _leftRel and _normalRel
glm::quat _quat; // the quaternion which contains the rotations
glm::vec3 _targetRel; // the target vector, normalized, relative to _position
glm::vec3 _leftRel; // the left vector, normalized
glm::vec3 _normalRel; // the normal vector (up), normalized
};
FreeFly.cpp:
#include <06_CameraQuat/FreeFly.h>
#include <glm/gtx/quaternion.hpp>
......
void FreeFly::rotateForward(double angle)
{
glm::quat q2 = glm::angleAxis((float) -angle, _targetRel);
q2 = glm::normalize(q2);
// q2 represents the rotation around the forward axis
_quat = _quat * q2; // adding the rotation to _quat
this->updateVectRel(); // updating the vectors
}
void FreeFly::rotateLeft(double angle)
{
// idem with left axis
glm::quat q2 = glm::angleAxis((float) -angle, _leftRel);
q2 = glm::normalize(q2);
_quat = _quat * q2;//glm::cross(_quat, q2);
this->updateVectRel();
}
void FreeFly::rotateNormal(double angle)
{
// idem with normal axis
glm::quat q2 = glm::angleAxis((float) -angle, _normalRel);
_quat = _quat * q2; //glm::cross(_quat, q2);
this->updateVectRel();
}
void FreeFly::updateVectRel()
{
_targetRel = glm::dvec3(1., 0., 0.);
_leftRel = glm::dvec3(0., -1., 0.);
_normalRel = glm::dvec3(0., 0., 1.);
_quat = glm::normalize(_quat);
_targetRel = _targetRel * _quat;
_leftRel = _leftRel * _quat;
_normalRel = _normalRel * _quat;
_target = _position + _targetRel;
_normal = _normalRel;
}
编辑:
为什么我的相机围绕目标轴旋转?
注意:当我用鼠标顺时针/逆时针方向旋转时,围绕目标轴的旋转也分别是顺时针/逆时针方向。