如何将3d世界矩阵转换成飞机?

时间:2016-09-04 12:28:09

标签: c++ matrix directx translate-animation kinematics

我正在使用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)。然后我围绕保持飞机轴线的单位矢量创建一个旋转矩阵。 rotate是R矩阵。之后我计算出保持飞机轴线的新单位矢量。最后,我将flightDirection的组件添加到翻译矩阵中,以获得飞机的新位置。

我的问题是我的算法没有像我预期的那样工作。有些事情在计算错误,我的飞机在移动鼠标后飞向错误的随机方向。

请告诉我如何纠正这个算法,或者给我一个示例如何在3D空间中移动对象的链接。

最诚挚的问候, 安通

0 个答案:

没有答案