OpenGL第一人称相机 - 旋转directionVector

时间:2016-12-29 09:24:21

标签: c++ opengl camera frame-rate

我正在尝试实现一个工作的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平移部分。

0 个答案:

没有答案