Как трансформировать трехмерную мировую матрицу, чтобы управлять самолетом?

Я программирую простую игру полета в DirectX. Я смоделировал самолет и успешно импортировал его в игру. Я сделал контроллер ввода успешно. Я успешно повернул налево, направо, вверх и вниз.

Я планировал иметь 3 вектора, сохраняющих ось крена, тангажа и рыскания самолета во время полета.

DirectX::XMFLOAT3 flightDirection, flightRight, flightUp;

Начальные состояния векторов:

flightDirection(0.0f, 0.0f, 1.0f);
flightRight(1.0f, 0.0f, 0.0f);
flightUp(0.0f, 1.0f, 0.0f);

if (newPointerPosition.x != pointerPosition.x || newPointerPosition.y != pointerPosition.y)
{
xPointer = (newPointerPosition.x / resources->GetLogicalSize().Width) - 0.5f;
yPointer = (newPointerPosition.y / resources->GetLogicalSize().Height) - 0.5f;
rollAngle = xPointer;
yawAngle = xPointer;
pitchAngle = yPointer;

XMStoreFloat4x4(&roll,XMMatrixRotationAxis(XMLoadFloat3(&flightDirection), rollAngle));
XMStoreFloat4x4(&pitch, XMMatrixRotationAxis(XMLoadFloat3(&flightRight), pitchAngle));
XMStoreFloat4x4(&yaw, XMMatrixRotationAxis(XMLoadFloat3(&flightUp), yawAngle));

rotate = DirectX::XMMatrixMultiply(XMLoadFloat4x4(&pitch),  DirectX::XMMatrixMultiply(XMLoadFloat4x4(&yaw), XMLoadFloat4x4(&roll)));

auto d = XMVector3Transform(XMLoadFloat3(&flightDirection), rotate);
position.x = XMVectorGetX(d);
position.y = XMVectorGetY(d);
position.z = XMVectorGetZ(d);
XMStoreFloat3(&flightDirection, d);

temp = DirectX::XMVector3Transform(XMLoadFloat3(&flightRight), rotate);
XMStoreFloat3(&flightRight, temp);

temp = DirectX::XMVector3Transform(XMLoadFloat3(&flightUp), rotate);
XMStoreFloat3(&flightUp, temp);

pointerPosition = newPointerPosition;
}
translation._41 += position.z*0.01f;
translation._42 += position.y*0.01f;
translation._43 += position.x*0.01f;

world->Transform(XMLoadFloat4x4(&scale), rotate, XMLoadFloat4x4(&translation));

Так что это мой алгоритм. Во-первых, положение мыши устанавливает угол поворота (угол ограничен -0,5f < угол < 0.5f). Затем я создаю матрицы вращения вокруг единичных векторов, которые держат ось самолета. поворот — это матрица R. После этого я вычисляю новые единичные векторы, которые сохраняют ось самолета. Наконец, я добавляю компоненты flightDirection в матрицу перевода, чтобы получить новую позицию самолета.

Моя проблема в том, что мой алгоритм не работает так, как я хотел. Что-то вычисляется неправильно, и мой самолет летит в неправильных и случайных направлениях после того, как я перемещаю мышь.

Пожалуйста, скажите мне, как исправить этот алгоритм, или дайте примерную ссылку, как выполняется перемещение объекта в трехмерном пространстве.

С уважением,
Antun

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]