私は自分のシーンでgluDisk()
を使ってフラットディスクを描いています。 gluDisk()
は、ディスクが正のZ軸に向くように描画しますが、それは私が持っている任意の法線に直面してほしいです。
明らかに、ディスクが正しく向き合うようにするには、glRotate()
を使用する必要がありますが、回転は何ですか?私はこれがクォータニオンを使用して計算できることを覚えていますが、私は数学を覚えているようには見えません。回転のための四元数演算?
答えて
解決策はかなり簡単で、四角形を必要としません。
ノーマル1からノーマル2への回転軸は、両方とも直交している必要がありますので、のベクトル積をとしてください。
回転量は、ドットプロダクトから容易に得られます。この値は| A |。| B | .cos(theta)ですが、2つの法線ベクトルを正規化しなければならないので、cos(theta)を与えますので、逆余弦を取って回転量を取得してください。
結果のベクトルと角度は、の必須パラメータです。実際の回転行列を自分で計算する必要はありません。
p.s. glRotate()
には角度が必要であることを忘れないでください。しかし、通常のC trig関数はラジアンで機能します。
クォータニオンは、軸を中心とした回転を表します。 <w,x,y,z>
は、w
の大きさとベクトルの大きさとの間のバランスに応じて、ある程度の量の軸の周りを軸として<x,y,z>
を回転します。
<cos θ/2, x*sin θ/2, y*sin θ/2, z*sin θ/2>, where |<x, y, z>| = 1
たとえば、正のY軸に向ける代わりに、X軸を中心に90°回転させる必要があります。ベクトルは<0, 1, 0>
、四元数は<cos 90°, 0, sin 90°, 0>
= <0, 0, 1, 0>
となります。
図形を正のZ軸に向けて回転させるには、ベクトル<x,y,z>
を向けるには、回転ベクトルと回転角を見つける必要があります。回転軸を見つけるには、現在のベクトルの外積と、そのベクトルの必要な位置を取ることができます。
正のZ軸を向いている場合、現在のベクトルは<0, 0, 1>
になります。 <x,y,z>
の場合は、回転軸は<0, 0, 1> x <x, y, z> = <-y, x, 0>
、角度はarctan(sqrt(x^2+y^2),z)
となります。四元数は、任意の軸周り
<cos(θ/2), -y*sin(θ/2), x*sin(θ/2), 0>, where θ = arctan(sqrt(x^2+y^2), z)
回転なる:ラジアン単位ベクトルに角Rを考えるuが= + BJ + CKまたは[A、B、C]、定義を愛:
q0 = cos(r/2)
q1 = sin(r/2) a
q2 = sin(r/2) b
q3 = sin(r/2) c
とこれらの値から回転行列を構築する:
(q0^2+q1^2 - q2^2 - q3^2 | 2*(q1*q2 - q0*q3) | 2*(q1*q3 + q0*q2) )
Q =(2*(q2*q1 + q0*q3) | (q0^2 - q1^2 + q2^2 - q3^2) | 2*(q2*q3 - q0*q1) )
(2*(q3*q1 - q0*q2) | 2*(q3*q2 + q0*q1) | q0^2 - q1^2 - q2^2 + q3^2)
あなたがする必要があるの回転を見つけるには、電流ベクトルとターゲットベクトルとの外積を計算することができます。直交ベクトル(四元数を作成するための回転ベクトル)が得られます。このベクトルの長さは、開始ベクトルとターゲットベクトルが重なるように補正する必要がある角度の罪です。
- 1. 3次元テッセレーションのための四面体の回転
- 2. 四元からOpenGLの回転に
- 3. 四元数から度(0〜360°)の回転から
- 4. 2つの座標系を較正するために2つの四元数の回転差を求める
- 5. 2つの四元数の一様乱数四元数と乗算の作成
- 6. 方向ベクトルを四元数回転に変換する
- 7. 最初と最後に回転した四元数から回転軸を取得する
- 8. 複素数演算のためのC++演算子のオーバーロード
- 9. 三元演算子での複数演算
- 10. 数値演算(浮動小数点演算)のためのPython引数パーサ
- 11. 回転する四角形のタイムライン
- 12. スムーズローテーション - 四元数
- 13. センサー四元数と三次元カメラ四元数の間の変換方法は?
- 14. 円四分円と複数の論理演算子
- 15. numpyの:四元数の乗算のバッチバージョンを作る
- 16. 回転のためのマウス
- 17. 効率的なC++四元数の乗算::マット
- 18. 角2の回転数を止めるための解決策
- 19. 固有ベクトル:回転行列を四元数に変換してから完全に別の行列に戻す
- 20. キャスト演算子のためのSFINAE
- 21. C配列のためのポインタ演算
- 22. 行列/四元数問題
- 23. 数学演算のためのフロートへの変換
- 24. 三元演算子での複素リターン?
- 25. 三元演算子の明確化
- 26. 3次元でのイメージの回転(Matlab)
- 27. 減少関数の演算回数が多い場合は
- 28. 数値演算のためのSpring Criteriaクエリ
- 29. 2つの四元数の「差」
- 30. bsplus:Shinyのプロットの動的な数のための回転台
ありがとうございます。それは完璧に働いた。 – shoosh