2012-01-27 21 views
1

私はGLSLを使用して骨格アニメーションを実行しようとしています。各骨について、私は平行移動(x、y、z)と回転(ピッチ、ロール、ヨー)(度)を持っています。私は各骨の4x4行列を構築することができましたが、それはシェーダーのレジスタ空間を大量に取るので、私は骨あたり6つの値を格納するだけですが、これを行う方法はわかりません。GLSL:回転ベクトルを使用した回転?

+0

どうすればいいですか?値を6つの浮動小数点として、または2つのvec3として渡すことができます。これらの値を使ってすべての演算の構成行列を計算する方法がわからないということですか?また、レジスタ内の単一の4x4行列が本当にスペース問題であることは確かですか?私は、各頂点またはピクセルの4x4行列を計算することは、プロセッサを集中させることになると想像しています。それはあなたがしたいトレードオフですか? – user1118321

+0

1つの4x4行列ではなく、1つの骨につき4x4行列です。どのようにするかわからないのは、私が持っている回転vec3を使ってポイントを回転させる方法です。 – Jonathan

答えて

2

どのようにするかわからないのは、私が持っている回転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の行列を計算するためにいくつかの乗算と加算を行う必要があります。そして、すべての後に、まだベクトルを回転させるために実際の行列の乗算を行う必要があります。

+0

もっと効率的なものは何ですか?クォータニオンを使用するか、またはシェーダで回転行列を構成しますか? – Jonathan

+0

@ジョナサン:私の編集を参照してください。 –

+3

'vec3 rotate = v + 2.0 * cross(q.xyz、temp);'はさらに効率的であるべきです(1 DOTと1 MADを避けてください)?それがユニットクワットとあなたのものを必要としているかどうかは分かりませんが(しかし、ローテーションのために非ユニットクワットを使う人は誰ですか?) –