砲塔を搭載したプラットフォームのモデルがあります。砲塔には 2 つのバレルがあり、バレルから弾丸を発射しようとしています。
タレット自体は、モデルに含まれるメッシュです。ModelBone.Transform マトリックスを次のように操作することで、タレットを回転させることができます。
turretBone.Transform = Matrix.CreateRotationX(3.14f /2f) * turretMatrix * Matrix.CreateTranslation(turretBone.Transform.Translation);
theModel.CopyAbsoluteBoneTransformsTo(transforms);
ここで、theModelはモデル全体 (プラットフォーム + タレット) を表し、turretBoneはタレットを表すModelBoneであり、turretMatrix はタレットがプレーヤーに面するようにタレットの回転を記述する 4x4 XNA マトリックスを表します。
この部分は完璧に機能します。
今度は、砲塔の銃身の先端から弾丸を発射したいと思います。どういうわけか、銃身の先端の位置が特定できないので、それを弾丸の元の位置として使用します。
方向として turretBone.Transform.Down を使用するので、火の方向は問題ありません。(上/下/その他は相対的であることは知っていますが、バレルがプレーヤーに向かって撃ち落とすトップ ビュー シューティング ゲームのように下を想像してください。つまり、XNA 2D で Y を増やします)。
turretBone.Transform がその親に対して相対的であることは理解していますよね?では、右に 100 単位、下に 400 単位移動したい場合は、どうすればよいでしょうか?
私はこのようなことをしようとしました:
Position + turretBone.Translation + turretBone.Transform.Right * 900f + turretBone.Transform.Down * 400f
タレットから右に 900 単位、下に 400 単位移動します (位置はモデル全体の位置です)。
ただし、これは機能しません。バレルの先端で正しく開始されますが、回転すると完全には追従しません)。
銃身の先端に 2 つの小さな球体を追加し、何らかの方法でワールド空間でそれらの座標を取得して、そこに弾丸の開始位置を配置するという別の解決策を考えました。それを行う方法はありますか?
ありがとう!