Game Development #4 Ground Collision

tank_20120520_split

戦車ゲームのつづき。前回までは砲塔(Y軸)が回るだけで満足していたのですが、デコボコの地形で撃つと狙いが大きく外れてしまうので、砲身(X軸)も回転するようにしました。車体(親)、砲塔(子)、砲身(孫)という関係です。目標座標を車体のローカル空間に落として(逆行列を使います)、そこから計算したY軸とX軸の角度を砲塔と方針に振り分けている感じです。

 

tank_20120520_battle

これで命中精度が格段に上がりました。

 

tank_20120525b_stug

突撃砲モデルを追加。三号戦車の車体を使ってモデリングしたのですぐ出来上がりました。砲塔や砲身に制限角度を設けて、砲塔がない戦車にも対応!

広告

Game Development #4 Ground Collision」への6件のフィードバック

  1. このページを拝見しました。

    その中で一つ疑問があったのですが、「目標座標を車体のローカル空間に落として(逆行列を使います)」という記述がありますね?

    この処理は具体的にどういう逆行列を掛けているのか、という点が知りたい、と思いました。

    もしよければ、詳しく教えていただければ、非常に嬉しいです。

  2. すみません、忙しくてしばらくブログを見ていませんでした。はじめまして!

    XNAでの計算式になりますが、このような感じで計算しています。
    Vector3 worldVec = TargetPosition – TankPosition
    Vector3 localVec= Vector3.Transform(worldVec, Matrix.Invert(TankWorld));

    ワールド空間の戦車と目標を結ぶベクトルを戦車の行列を利用して、戦車のローカル空間のベクトルへと変換しています。その後はベクトルを角度に分解して、砲塔を旋回させる、といった感じです。

    ※詳しく書けば「戦車」というより「戦車の砲」ですね。

    • お忙しい中返信ありがとうございます!

      こちらのブログはいつも参考にさせていただいています。
      今回初めて質問させていただきましたが、これも参考になりました。

      ところで、「戦車の砲のローカル空間」ということは即ち、砲の回転中心を原点とする座標という解釈でいいのでしょうか?
      (また、世の中には砲塔と砲身の回転中心が一致していない戦車もあるので、その場合の解決策というのもあるのでしょうか?)

      再三の質問、申し訳ありませんが、暇なときにでも是非ご教授ください。

      • その解釈で合っていると思いますよ。

        自分のプログラムでは砲塔と砲身は回転中心を分けて計算していますね。車体と砲塔、砲身がそれぞれ行列を持っていて、順に計算していき、砲身の中心座標から目標との角度を計算する、という感じです。

      • すみません、ちょっと間違えていました。
        上に書いたTankWorldという行列は回転のみで構成されてますので、
        もし移動などが入っていたらおかしいことになりますね。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中