0

砲塔を搭載したプラットフォームのモデルがあります。砲塔には 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 つの小さな球体を追加し、何らかの方法でワールド空間でそれらの座標を取得して、そこに弾丸の開始位置を配置するという別の解決策を考えました。それを行う方法はありますか?

ありがとう!

4

1 に答える 1

0

2番目の方法(バレルの先端に球を配置する方法)を使用して問題を解決しました。

Matrix world = transforms[sphereBone.Index] * any_other_transformation_applied

電話した後

theModel.CopyAbsoluteBoneTransformsTo(transforms);

トリックをしました。

ありがとう。

于 2012-07-03T13:51:59.407 に答える