1

我正在使用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 空间中移动对象。

最好的问候, 安顿

4

0 回答 0