私はGLSLを使用して骨格アニメーションを実行しようとしています。各骨について、私は平行移動(x、y、z)と回転(ピッチ、ロール、ヨー)(度)を持っています。私は各骨の4x4行列を構築することができましたが、それはシェーダーのレジスタ空間を大量に取るので、私は骨あたり6つの値を格納するだけですが、これを行う方法はわかりません。GLSL:回転ベクトルを使用した回転?
答えて
どのようにするかわからないのは、私が持っている回転vec3を使ってポイントを回転させる方法です。
シンプル:しないでください。
yaw-pitch-rollは、アニメーションシステムの場合、、特にの向きをエンコードするのはひどい方法です。代わりにクォータニオンを使用してください。これは3ではなく4つの値であり、回転のコードはよく知られています。
また、sin
およびcos
のような重量のある操作を必要としません。
必要な労力を比較して比較したい場合は、数学を考慮してください。
四元q
、位置v
を考えると、あなたはそれを回転させ、これを実行する必要があります。
vec3 temp = cross(q.xyz, v) + q.w * v;
vec3 rotated = v + 2.0*cross(q.xyz, temp);
数学の公平なビットです。今、YPRのケースであなたがしなければならないことを考えてみましょう。
vec3 cosYPR = cos(ypr);
vec3 sinYPR = sin(ypr);
これはすべてではありません。しかし、それはでも十分です。です。それは3つのcos
と3つのsin
操作です。これらはであり、高速ではありません。操作です。それだけではおそらく、クォータニオン/ベクトル回転計算全体と同じくらい長くかかるでしょう。しかし、これを実行した後、3x3の行列を計算するためにいくつかの乗算と加算を行う必要があります。そして、すべての後に、まだベクトルを回転させるために実際の行列の乗算を行う必要があります。
もっと効率的なものは何ですか?クォータニオンを使用するか、またはシェーダで回転行列を構成しますか? – Jonathan
@ジョナサン:私の編集を参照してください。 –
'vec3 rotate = v + 2.0 * cross(q.xyz、temp);'はさらに効率的であるべきです(1 DOTと1 MADを避けてください)?それがユニットクワットとあなたのものを必要としているかどうかは分かりませんが(しかし、ローテーションのために非ユニットクワットを使う人は誰ですか?) –
- 1. ロドリゲスのベクトル回転式
- 2. Three.js 90度ベクトルの回転
- 3. CGAffineTransformを使用したUIViewの回転
- 4. キーを使用したオブジェクトの回転
- 5. 回転変換を使用したViewPager
- 6. JSONを使用した回転スライダー
- 7. LWJGL回転:回転しません
- 8. Python回転ファイルハンドラが回転しない
- 9. CSSが回転して回転する
- 10. Java 3Dを使用してベクトルを回転する
- 11. Opencv Animation回転行列を使ったオブジェクトの回転
- 12. ヘリックスツールキット、新しい回転ベクトルの取得
- 13. Pixasticを使った回転
- 14. unity3dで回転行列を適用してgameObjectを回転
- 15. グラフィックス(2D)回転:x軸を回転
- 16. インタフェース内のボタンを回転/回転
- 17. 回転ベクトルセンサーの使用
- 18. 回転軸ベクトルを結合する
- 19. ベクトル(配列)を回転する
- 20. 回転した要素をJavaScriptの回転方向に移動
- 21. libgdxタッチパッドを使用してプレイヤーを回転方向に回転させよう
- 22. 回転時のキーボード回転UIView
- 23. UIView animate - 回転、スケールアップ、回転、スケールダウン
- 24. 楕円の回転/回転グループ
- 25. して回転
- 26. 回転
- 27. 球の回転ベクトルの計算
- 28. 回転ベクトル(Rxyz)のAruco Ros Convention
- 29. glulookatを使用してカメラを回転
- 30. OpenGLカメラまたは「ビューマトリックス」に回転ベクトルを適用する
どうすればいいですか?値を6つの浮動小数点として、または2つのvec3として渡すことができます。これらの値を使ってすべての演算の構成行列を計算する方法がわからないということですか?また、レジスタ内の単一の4x4行列が本当にスペース問題であることは確かですか?私は、各頂点またはピクセルの4x4行列を計算することは、プロセッサを集中させることになると想像しています。それはあなたがしたいトレードオフですか? – user1118321
1つの4x4行列ではなく、1つの骨につき4x4行列です。どのようにするかわからないのは、私が持っている回転vec3を使ってポイントを回転させる方法です。 – Jonathan