我正在尝试实现一个工作的fps相机。我阅读了很多在线教程和论坛帖子,但我仍然没有让它正常工作。 我没有使用glm或任何其他库来做这件事,我希望自己去理解它,希望如此。
我有一个相机类,它基本上得到了位置矢量,一个目标矢量和一个向上矢量。
我想,如果我将在给定的鼠标输入上旋转相机的方向向量,它应该做正确的事情。 它确实如此,但仅限于我的对象位于原点的情况。如果它的位置让我们说在x = 10,那么看起来立方体将围绕他自己的轴旋转。 如果我只是带着W,A,S,D走动,那么这个观点似乎很好。
我已经尝试了很多,阅读了相机移动与世界移动(这有点让我更加困惑这一切)。
有谁知道问题出在哪里?
在mainLoop中调用的更新函数:
void Camera::updatePosition(int viewport_width, int viewport_height) {
yaw += mouseSpeed * InputHandler::mouseDeltaX;
pitch += mouseSpeed * InputHandler::mouseDeltaY;
InputHandler::mouseDeltaX = 0;
InputHandler::mouseDeltaY = 0;
vector<float, 3> camDir = vector<float, 3>(-cos(yaw), sin(pitch), sin(yaw));
vector<float, 3> right = normalize(cross(_up, camDir));
movementSpeed = MOVEMENT_SPEED_MAX;
if (InputHandler::wPressed) {
_pos += camDir * movementSpeed;
}
if (InputHandler::sPressed) {
_pos -= camDir * movementSpeed;
}
if (InputHandler::dPressed) {
_pos -= right * movementSpeed;
}
if (InputHandler::aPressed) {
_pos += right * movementSpeed;
}
if (InputHandler::escPressed) {
exit(0);
}
_target = _pos + camDir;
calcViewMatrix();
}
ViewMatrix计算:
void Camera::calcViewMatrix() {
vector<float, 3> w = normalize(_pos - _target);
vector<float, 3> u = normalize(cross(_up, w));
vector<float, 3> v = cross(w, u);
vector<float, 4> row1 = vector<float, 4>(u.x, v.x, w.x, 0);
vector<float, 4> row2 = vector<float, 4>(u.y, v.y, w.y, 0);
vector<float, 4> row3 = vector<float, 4>(u.z, v.z, w.z, 0);
vector<float, 4> row4 = vector<float, 4>(-dot(u, _pos), -dot(v, _pos), -dot(w, _pos), 1);
_viewMatrix = matrix<float, 4, 4>();
_viewMatrix = matrix<float, 4, 4>::from_rows(row1, row2, row3, row4);
}
我将mvp矩阵加载到着色器,计算如下:
mvp = P * V * M;
modelMatrix曾经是一个定位于原点的单位矩阵,或者只是一个x或z平移部分。