Войти
ПодсказкиСтатьи

Вращение камеры для автогонок\леталок и т.д.

Автор:

Сейчас вдруг осенило как сделать так чтобы камера была прикреплена к, например, корпусу автомобиля.

Раньше я думал что достаточно просто указать родителя для камеры - Корпус - , но камера вращалась не так как следует. К примеру Yaw(рыскание) всегда был в одной плоскости.
Сначала я использовал собственные значения для хранения поворота камеры. На основе этих значений создавал viewMatrix, умнажал на родительскую - и ничего.

А ведь всё так элементарно просто.
Объект имеет матрицу вращения (обычно вместе с позицией объекта). ViewMatrix это и есть матрица вращения, и она крутит все объекты на экране. Значит, если установить viewMatrix камеры worldMatrix объекта, то при повороте корпуса авто вправо, будет казаться что камера повернулась влево. Значит нужно инвертировать новую view матрицу.

Mat4 g_cameraInitRotation; // установка поворота камеры при инициализации
void camera_OnUpdate(Game_Camera* camera)
{
  Mat4 P;
  math::makePerspectiveRHMatrix(
    P,
    camera->GetFOV(),
    camera->GetAspect(),
    camera->GetNear(),
    camera->GetFar() );
  camera->SetProjection(P);
  
  // WORLD матрица корпуса с учётом матриц всех предков
  Mat4 V = g_body->GetGlobalMatrix();
  auto bodyPosition = V[3];
  V[3] = v4f(0.f,0.f,0.f,1.f);
  
  V.invert();

  // поворот камеры так как она стояла при инициализации
  V = g_cameraInitRotation * V; // правильнее изначально смоделировать модель с нужной ориентацией
  
  // установка на нужную позицию на корпусе
  bodyPosition = math::mul(bodyPosition, V);
  V[3] = -bodyPosition;
  V[3] +=  -camera->GetLocalPosition();
  V[3].w = 1.f;

  camera->SetView(V);
}

Вот и всё 🤦🏼‍♂️

#камера

17 октября 2020 (Обновление: 20 окт. 2020)