我正在使用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 的组件添加到转换矩阵中以获得飞机的新位置。
我的问题是我的算法没有按照我的预期工作。某些东西计算错误,我移动鼠标后我的飞机飞向错误和随机的方向。
请告诉我如何纠正此算法或给我示例链接如何在 3D 空间中移动对象。
最好的问候, 安顿