Контроль ошибок вращения камеры DirectX?

0

Я использую мышь для управления поворотом камеры в моей программе (с использованием DirectX 9.0c). Мышь X управляет камерой для поворота вокруг вектора Up, а Y Y управляет вращением вокруг правого вектора. Катуляция вращения такова, как показано ниже: void Camera::RotateCameraUp(float angle) { D3DXMATRIX RoMatrix; D3DXMatrixRotationAxis(&RoMatrix, &vUp, angle); D3DXVec3TransformCoord(&vLook, &vLook, &RoMatrix); D3DXVec3TransformCoord(&vRight, &vRight, &RoMatrix); } void Camera::RotateCameraRight(float angle) { D3DXMATRIX RoMatrix; D3DXMatrixRotationAxis(&RoMatrix, &vRight, angle); D3DXVec3TransformCoord(&vLook, &vLook, &RoMatrix); D3DXVec3TransformCoord(&vUp, &vUp, &RoMatrix); } void Camera::RotateCameraUp(float angle) { D3DXMATRIX RoMatrix; D3DXMatrixRotationAxis(&RoMatrix, &vUp, angle); D3DXVec3TransformCoord(&vLook, &vLook, &RoMatrix); D3DXVec3TransformCoord(&vRight, &vRight, &RoMatrix); } void Camera::RotateCameraRight(float angle) { D3DXMATRIX RoMatrix; D3DXMatrixRotationAxis(&RoMatrix, &vRight, angle); D3DXVec3TransformCoord(&vLook, &vLook, &RoMatrix); D3DXVec3TransformCoord(&vUp, &vUp, &RoMatrix); } void Camera::RotateCameraUp(float angle) { D3DXMATRIX RoMatrix; D3DXMatrixRotationAxis(&RoMatrix, &vUp, angle); D3DXVec3TransformCoord(&vLook, &vLook, &RoMatrix); D3DXVec3TransformCoord(&vRight, &vRight, &RoMatrix); } void Camera::RotateCameraRight(float angle) { D3DXMATRIX RoMatrix; D3DXMatrixRotationAxis(&RoMatrix, &vRight, angle); D3DXVec3TransformCoord(&vLook, &vLook, &RoMatrix); D3DXVec3TransformCoord(&vUp, &vUp, &RoMatrix); } Предполагается, что вращение вокруг вектора "Вверх" или "Вправо" не должно приводить к вращению вокруг вектора "LookAt", но если я на некоторое время нахожусь вокруг мыши и останавливаю его в начальной точке, происходит поворот вокруг вектора "LookAt". Я думаю, что это из-за ошибки во время сглаживания, но я не знаю, как ее устранить или контролировать. Есть идеи?

  • 0
    Возможно, вы захотите попробовать повернуть около (0, 1, 0) в первом методе.
  • 0
    @NicoSchertler: На самом деле, я хочу вращаться вокруг vUp, но не (0,1,0). Я объяснил свою ошибку при ответе на cdoubleplusgood. Спасибо за помощь
Теги:
camera
directx

1 ответ

0
Лучший ответ

Это распространенная проблема. Вы применяете много оборотов, и со временем погрешности округления суммируются. Через некоторое время три вектора vUp, vLook и vRight больше не нормализуются и ортогональны. Я бы использовал один из двух вариантов:

1. Не храните vLook и vRight; вместо этого просто сохраните 2 угла. Предполагая, что x правильно, y вершина, z вернулась, сохраните a) угол между вашей осью обзора и xz-плоскостью и b) угол между проекцией вашей оси обзора на xz-плоскость и ось z или x-Axis. Обновите эти углы в соответствии с движением мыши и вычислите vLook и vRight от них.

2. Установите y-компонент vRight 0, так как vRight должен находиться на xz-плоскости. Затем повторите ортонормировку векторов (вы знаете, что векторы должны быть перпендикулярны друг другу и иметь длину 1). Поэтому, после вычисления новых vLook и vRight, примените следующие исправления:

vRight.y = 0
vRight = Normalize(vRight)
vUp = Normalize(Cross(vLook, vRight))
vLook = Normalize(Cross(vRight, vUp))
  • 0
    Спасибо за совет. Я обнаружил, что ошибка, которую я сделал, заключается в том, что «вращение вокруг вектора вверх или вправо не должно приводить к вращению вокруг вектора взгляда». Фактически, после поворота вокруг vUp для угла альфа и затем поворота вокруг vRight для угла бета, мы можем вернуться к исходному состоянию только вращением вокруг vRight для угла -бета и затем вращением вокруг vUp для угла -альфы, но не вращением вокруг vUp для угла -альфа, а затем вращается вокруг vRight для угла -бета. Поэтому, когда я обводю мышь и возвращаюсь к исходной точке, камера не может вернуться в исходное состояние.
  • 0
    Да, Нико уже дал правильный ответ. Я пропустил этот момент. Тем не менее, денормализация векторов также может быть реальной проблемой.

Ещё вопросы

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