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 空間でオブジェクトを移動する方法の例のリンクを教えてください。
よろしく、 アントゥン