我已经使用opengl 3制作了一个3D摄像头,但是当用鼠标环顾四周时它有效但我已经尝试重新加工系统但是无法修复它。下面是输入函数,我正在使用。我已经删除了一些缩短这篇文章的意见。
编辑我认为我错误地陈述了我的问题,发生了什么事 相机似乎只是自行熄灭,很难控制。他们仍然是一个抖动,但让相机漂移是让我感到难过的。
void Camera::GetInput()
{
int Screenx;
int Screeny;
glfwGetWindowSize(&Screenx, &Screeny);
static double lastTime = glfwGetTime();
double currentTime = glfwGetTime();
float deltaTime = float(currentTime - lastTime);
int xpos, ypos;
glfwGetMousePos(&xpos, &ypos);
glfwSetMousePos(Screenx / 2, Screeny / 2);
// Compute new orientation
horizontalAngle += mouseSpeed * deltaTime * float(Screenx / 2 - xpos);
verticalAngle += mouseSpeed * deltaTime * float(Screeny / 2 - ypos);
glm::vec3 direction(
cos(verticalAngle) * sin(horizontalAngle),
sin(verticalAngle),
cos(verticalAngle) * cos(horizontalAngle)
);
glm::vec3 right = glm::vec3(
sin(horizontalAngle - 3.14f / 2.0f),
0,
cos(horizontalAngle - 3.14f / 2.0f)
);
glm::vec3 up = glm::cross(right, direction);
// Move forward
// Strafe left
if (glfwGetKey('A') == GLFW_PRESS){
position -= right * deltaTime * speed;
}
float _fieldOfView(50.0f);
float _nearPlane(0.01f);
float _farPlane(1000.0f);
float _viewportAspectRatio(Screenx / Screeny);
ProjectionMatrix = glm::perspective(_fieldOfView, _viewportAspectRatio, _nearPlane, _farPlane);
ViewMatrix = glm::lookAt(
position, // Camera is here
position + direction, // and looks here : at the same position, plus "direction"
up // Head is up (set to 0,-1,0 to look upside-down)
);
}
答案 0 :(得分:0)
我的直觉告诉我你在这里滥用static
存储限定符。
由于这是C ++,lastTime
将在您第一次调用Camera::GetInput (...)
时初始化,这是唯一一次为其分配值。通常,名为deltaTime
的变量应该是自上次相机更新以来经过的时间量,而不是自第一次调用Camera::GetInput (...)
以来经过的时间。
在类函数中在此范围内使用static
变量对我来说是错误的。如果您有两个此类的实例,则它们都将使用在lastTime
第一次调用时建立的Camera::GetInput (...)
值。
你从这个函数中调用glfwGetWindowSize(&Screenx, &Screeny);
这一事实对我来说意味着Camera
隐含地是一个单身人士。否则,那些将被传递参数或至少以较不直接的方式获得。
lastTime
的值。void Camera::GetInput()
{
// [...]
ViewMatrix = glm::lookAt(
position, // Camera is here
position + direction, // and looks here : at the same position, plus "direction"
up // Head is up (set to 0,-1,0 to look upside-down)
);
//
// This will fix your problem
//
lastTime = currentTime;
}