3Dワールド空間の特定の位置に矢を着陸させる方法


8

私のゲームでは、どこかの地形をマウスでクリックすると、プレーヤーが放物線状にその位置に矢印を発射したいと思います。

矢印には、すべて3Dベクトルを使用した位置、加速度、速度があります。私が見発射の軌道ウィキペディアの記事、私はそれが2D数学を説明しているように私の状況でそれを適用する方法がわかりません。3Dベクトルの解決策があるかどうか疑問に思っていましたか?3Dの状況に関連するリソースはありますか?


5
誰かがより完全な応答を提供できることを期待しているので、私はこれを答えとして書きませんが、2Dソリューションを3Dで使用できます。2Dソリューションは、始点と終点を通る垂直平面に適用されるため、2Dソリューションを取得して回転させ、3D空間のその平面に一致させます。
カイロタン2012

回答:


12

Kylotanのコメントを拡張するには、2D数式を3Dで使用できます。Yが稼働していると仮定します。

X'Y'Z '空間でのターゲットの位置を計算します。X'軸は矢印の飛行方向に平行で、Y '軸は上向き、Z'はX 'およびY'軸に垂直です。

図

X 'とY'を計算したら、実際のXYZ空間に変換し直すことができます

アーチャーは(1,0,1)にいます。彼は(4,0,5)への矢を放ちたいと思っています。X 'は、ソースポイントから宛先ポイントを直接指すため、単位ベクトル(0.6、0、0.8)とします。次に、Z 'は垂直であるため(-0.8、0、0.6)になりますが、矢印はZ'軸で移動しないため、無視します。あなたの問題は、X'Y '空間で(0,0)から(0,5)への矢を撃つ方法を理解することです。

..ここで2D計算を行います。時間変数tに関して、X 'とY'のパラメトリック関数がおそらく必要になることに注意してください。

2つの座標間の変換を抽象化する1つの方法は、変換行列を使用することです。

let archer = Vector3d(1.0,0.0,1.0)
let target = Vector3d(4.0,0.0,5.0)
let travel = target - archer
let transform = Matrix4d.CreateTranslation(-archer) *
                Matrix4d.CreateRotationY(Math.Atan2(travel.Z,travel.X)) 
Vector3d.Transform(archer, transform) // transforms archer to (0,0,0)
Vector3d.Transform(target, transform) // transforms target to (5,0,0)

X'Y'Z 'からXYZに変換し直すと、これは単に逆線形変換になります。

let inverse = Matrix4d.Invert(transform)
Vector3d.Transform(Vector3d.Zero, transform) // transforms (0,0,0) to (1,0,1)

おかげで、なんとか動作させることができました!さまざまな高さで機能させる方法をまだ考えています... :)
Nick

やったー!えーと。これは、座標や三角法の変更に頼ることなく、あらゆる次元で分析的に解決できます。発射体を狙うときに加速を考慮する方法を参照してください例については、playtechs.blogspot.com / 2007/04 / aiming-at-moving-target.htmlご覧ください
Electro
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.