Камера идет самостоятельно?

0

У меня есть 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)
    );
}
  • 0
    Вы уверены, что правильно рассчитали дельту? И, пожалуйста, сделайте отступ в своем коде правильно и держите имена переменных согласованными.
Теги:
opengl

1 ответ

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;
}
  • 0
    Я только попробовал это, не смотрел, чтобы исправить много: /

Ещё вопросы

Сообщество Overcoder
Наверх
Меню