私は自分のシーンで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. 方向ベクトルを四元数回転に変換する
- 4. 最初と最後に回転した四元数から回転軸を取得する
- 5. 複素数演算のためのC++演算子のオーバーロード
- 6. 円四分円と複数の論理演算子
- 7. 効率的なC++四元数の乗算::マット
- 8. 行列/四元数問題
- 9. C配列のためのポインタ演算
- 10. 減少関数の演算回数が多い場合は
- 11. 2つの四元数の「差」
- 12. 回転イメージ(元の位置に戻す)
- 13. 添字演算子の一時変数の回避
- 14. 球の回転ベクトルの計算
- 15. SPSS:回転ファクタからFSCOREを計算するための構文
- 16. GPUでの整数演算とビット演算の実行
- 17. マグニチュードを得るためのクイック関数/演算子| x |変数の名前
- 18. 複数のインクリメント演算子
- 19. y(x)関数の算術演算R
- 20. 指数値の算術演算
- 21. 行列を基にした2次元点の回転
- 22. CまたはC++の小数の算術演算?
- 23. C#の演算子の演算順序
- 24. Android Logcatの回転サイズと回転数のパラメータ
- 25. JS:私の仕事のために三項演算で複数の戻り
- 26. ビット演算子または演算子|メモリブロックを整列するためのCの使用
- 27. 回転数がビルドエラー
- 28. ベクトルの線形インデックスのためのMatlabのハッシュ演算子
- 29. C++の浮動小数点演算での丸めの問題を回避する方法は?
- 30. 演算子if演算子
ありがとうございます。それは完璧に働いた。 – shoosh