クォータニオンを使用してヘリコプターを制御できますか?


9

単純化されたヘリコプター(現時点では立方体)を3Dでシミュレーションしようとしていますが、回転に問題があります。ヘリコプターは3つの軸に沿って回転できます。

  • 後部プロペラを使用してそれ自体で回転する:y軸回転
  • 左または右に傾けて左または右に移動:z軸回転
  • 上下に傾けて後方または前方に移動:x軸回転

各軸を個別に制御できる必要があります。これまでのところ、オイラー角を使用してみましたが、使用する回転順序が何であれ、ジンバルロックまたは一部の軸の「スイッチ位置」にぶつかります。

クォータニオンを使用する必要があるようですが、クォータニオンは方向と角度を使用するため、個々の軸を制御する方法がわかりません。3つの四元数を作成して、それらを乗算する必要がありますか?同じ問題が発生することはないでしょうか?

奇妙なことに、ヘリコプターの3つの軸(親指を上げる= y、インデックス= z、中央= x)を指で表すと、これらの問題にぶつからないようです。どうして?


シーングラフにアクセスできる場合、実行可能な代替策は、各軸にネストされたコンテナを用意し、それを個別に回転させることです。
bummzack

@bummzack、はい、私はこれについて考えました。ただし、3つの回転行列を特定の順序で連結することと同じではありませんか?
sub

あなたは正しい@Subbです。各軸の回転を個別に保存しないようにしてください。どの軸で使用しても、オイラー角と同じ問題が発生します。また、マトリックスとクォータニオンはジンバルロックの影響を受けます。
Maik Semder

@Maik Semder、ヘリコプターのピッチ/ヨー/ロールをどのように制御できますか?
sub

@Subb @ Flip'sと私の答えは基本的にそれを行う方法を教えてくれました。
Maik Semder

回答:


4

マトリックスまたはクォータニオンのいずれかを使用して、ヘリコプターの現在の向きを保存できるはずです。あなたが遭遇している問題は、ヘリコプターにピッチ/ヨー/ロールの変化をどのように適用するかです。

フレームごとにローカルスペースのヘリコプターにピッチ/ヨー/ロールを適用したいと思います。これを行うには、そのフレームのピッチ/ヨー/ロールの変更を取得し、回転行列を作成します(これはオイラー角で実行できます)。次に、この行列によってヘリコプターの以前の方向を回転させます(以前の方向は行列または四元数として表されます)。新しいフレームの向きが表示されます。

ヘリコプターの向きをクォータニオンとして表すことには、クォータニオン間の補間が行列間の補間よりもはるかに簡単であるという利点があります。したがって、将来的に現在の方向があり、希望するときに新しい方向に移動するフレームごとの回転を把握したい場合は、クォータニオン表現の方が使いやすいかもしれません。


これが私が行った方法です。ローカル->ワールド変換を表すマトリックスに増分更新を適用します。マトリックスを正規化することを忘れないでください。数百フレーム後、そうしないと丸みのアーティファクトが表示されます。
Patrick Hughes

また、x / y / z軸を表すために手を使用してジンバルロックの問題が見られない理由に関する最後の質問に答えるために、ピッチ、ヨー、ロールの値を手のローカルフレームに適用している可能性があります。参照。オイラー角を持つ回転行列の作成は、世界のxを中心に回転し、次に結果のy、次に結果のzで始まります(x / y / zの実際の順序は異なる場合があります)。この方法で回転を適用してみると、ジンバルロックがどのように表示されるかを確認できます。
2011

3

基本的に、回転のその他すべての表現を使用できますが、オイラー角です。行列、四元数、軸角度でさえ、あなたが望むことをします。

Should I create three quaternions and multiply them together? Wouldn't I end up with the same problems?

あなたは正しい、あなたは同じ問題に終わるでしょう。重要なのは、オブジェクトの現在の方向(マトリックス、クォータニオン)を保存し、方向を変更するときにデルタのみを適用することです。

yを中心に10度回転させる場合は、デルタマトリックス/クォータニオンを作成し、現在の方向でポスト乗算します(マトリックスにポスト乗算を使用する場合)。逆に乗算すると、オブジェクトのy軸ではなく、世界のy軸を中心にシステムが回転します。

このリソースは非常に有用であると思います。また、ソースコードが付属しており、理論を非常によく説明しています。


-1

あなたが見ているかもしれないと思う問題は、軸の回転と速度のベクトルの違いです(そして、方向を見逃していることも)。ヘリコプターが前方に傾いて前方に移動すると、ヘリコプターブレードの推進力により、X軸にラベルを付けたものに対して垂直な角度で空気が押し下げられます。

あなたは見逃した4自由度を持っています:ブレードの速度は押される空気の量を制御し、ヘリコプターが生成する揚力の量も制御します。

しかし、それでも、通常、「左と右に傾ける」と「上下に傾ける」とは、特定の飛行機のヘリコプターを制御することです。つまり、ヘリコプターが前、後ろ、または横に傾いたときに下向きに飛行するべきではありません。ただし、リフト量を変更する必要があり、速度は、直角三角形の「反対」側で制御されます。ヘリコプターを地面に直線で下(重力)と斜辺(リフト)で接続します。これで、使用する速度ベクトルが得られます。

クォータニオンを使用してこれを行うことができるはずですが、ヘリコプター自体の傾きに基づいてクォータニオン値を設定しないでください。代わりにヘリコプターが生成するモーションのフォースを使用してみてください。


しかし、それは実際には質問に答えていません。考えるために食べ物を追加するだけです。
bummzack

現在、ヘリコプターの回転を使用して、ヘリコプター空間で上向きの揚力ベクトルを変換しています。私は逆を行うべきだ、つまりベクターを直接変更してヘリコプターを回転させる必要があるということですか?
sub

私はあなたが両方を行うべきだと思います、あなたが今していること、そしてブレードの法線に基づいてヘリコプターへの回転の結果の変更を行ってください。つまり、2つの回転があります。1つはブレードに適用され、もう1つはヘリコプターの実際の回転を表します。明らかにすべてが四元数に保存されています。
減速
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.