У меня есть opengl 3, сделанный 3D-камерой, которая работает, но имеет дрожание при просмотре с помощью мыши, я пробовал переработать систему, но просто не могу ее исправить. Ниже представлена входная функция, которую я использую. Я отключил часть ввода, чтобы сократить этот пост.
EDIT. Думаю, я неправильно сформулировал свой вопрос, что происходит, что камера, похоже, просто отключается сама по себе, ее трудно контролировать. Их до сих пор дрожит, но с камерой просто дрейф - это то, что меня обмахивает.
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)
);
}
Моя кишка говорит мне, что вы злоупотребляете классификатором 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;
}