2009-07-30 14 views
1

私は先例を設定し、その空間回転

オーケー(http://wiki.garrysmod.com/?title=Wire_Expression2)ギャリーのMODで動作をプログラムするために式2を使用しています。 Gmodではブロックがあり、3つの上、下、右のベクトル(これはローカルです。つまり、45度ピッチの場合、前方ベクトルは0.707,0.707、 0)。基本的には、3つのベクトルから、私は地元のピッチ/ロール/ヨーを得ることができるようにしたいと思います。ローカルピッチロールヨーによると、彼らは互いに完全に独立して真の3d回転を可能にするということです。例えば、鼻が床と平行になるように私のクラフトを置くと、X、Y、Zは0,0,0になります。私がそれを床(World and Local Yaw)と平行に90度回すと0、0、90になります。それから180度、180度、0度、90度の順に(World Roll、Local Pitch)既に探索されたクオータニオンですが、私は車を再発明していたと思うので、ここに自分のコードを載せるべきではないと私は信じています。

私はそれをうまく説明していないことは知っていますが、問題はかなり一般的だと思います。誰でも助けることができれば大いに感謝します。

ああ、私もジンブルロックを避けたいと思います。

up/forward/rightベクトルを使用して、各クラフトの前後の回転を本質的に計算する。

単にGmodに固有の実装ではなく、一般的な実装は絶対に問題ありません。

+0

あなたの質問/問題は何ですか?どこで立ち往生しましたか? – Victor

+0

基本的には、船のそれぞれの周りの回転を、前方、上方および右側のベクトルで計算したいと考えています。すなわち、船はローカルピッチ/ロール/ヨー。ワールド空間のベクトル位置から。 – Fascia

+0

あなたは、あなたがそれを行う方法を完全に失っていると言っていますが、あなたはすでに、ジンバルロックを避け、より効率的になるような状況で使用するのに最適なオブジェクトであるクォータニオンを探求しました変換行列よりも)。コードがあなたにとって複雑すぎるということだけですか? – JAB

答えて

0

このような状況では、アプリケーションの実装が期待されているかどうかはわかりませんが、通常、角力を適用することをおすすめします。この点であなたのニーズには十分でしょうか?

もしあなたが必要としているのであれば、エンティティがある特定の位置を指すように角力の方程式を完成させることができました。

EntityVector =エンティティ:massCenter()
レバレッジ=のSQRT((エンティティ:慣性():長さ()^ 2)/ 3)
LookPos = EntityVector - ターゲット:POS()
A = ANG(
toDeg(atanr(LookPos:z()、sqrt(LookPos:x()^ 2 + LookPos:y()^ 2)))、
toDeg(atanr(-LookPos:y()、-LookPos:x ()))、
0)
EntityAngle =((エンティティ:角度() - angnorm(A))* 5 +エンティティ:angVel())* 5
エンティティ:applyAngForce(-EntityAngle *レバレッジ)

この一連の式は、無数のプロジェクトを通して私を助けてくれました

+0

基本的には、他の方向から直接特定の方向に回転したいと思います。そうするために各軸の周りの角力を計算する。 – Fascia