2012年10月27日土曜日

TPで回転周りを考察してみた~spin~

追記 2013/01/05
の記事は全体的にまとまっていません(汗)
ちゃんと理解できたら、追記&整理していきたいと思います。
それなのに記事にしてすみません++
詳しい方からのヘルプ待っています。


今回の記事は、AfterburnをTPで制御してる際に、TPの回転とABの回転を同期したいと思い色々調べました。

これまで、調べたのをメモ代わりに記述していきます。

結論から言うと、海外のフォーラムでのやり取りを参考に調べた限り、激ムズです。てか無理??
ですが、1軸の同期はできました!!
追記 メモ
Spinノードでxyz軸の数値を[1,0,0]などのように1軸を同期することはできる。[0.3,0.5,0.8]などのような各軸が混ざり合った値は駄目。
ABでは、ワールド空間軸からxyzの回転値を取得し回転するのに対して、TPでは軸を任意のに設定し、その軸を元にxyz回転させる模様。。


激ムズ部分について確かなことは言えないのですが、TPのSpinノードによる回転はクオータニオンでクルクル回転していて、ABの回転はオイラーでクルクル回転してるようです。ですので、これらを合わせる必要があると思われます。
まず、オイラーとクオータニオンをなんとなく知ってるようじゃ先に進めません。
ですが、クオータニオンからオイラーの変換とか調べてみると撃沈。

こちらで軽く基礎をつかめましたが、まだまだです。
難しいので、一先ずオイラーとクオータニオンは置いておきます。


まず、TPからABに回転を同期しました。動画をご覧ください。


回転は、TPのSpinノードを使用しX軸を基準に回転させています。
構成を三つに分けてみました。
①大きい矢印が、TPによるパーティクルシェイプです。
②小さい矢印は、TPによる回転と位置の値をParamBlockで矢印モデルのコントローラーのオイラー回転とポジションXYZに割り当てたものです。
③球はABによるものです。
全てばっちり同期してます。
ノードの構成は、下記に添付。


次に、TPのSpinノードで基準軸をランダムにしてみました。
ランダムに回転する方法ってこれですよね??


残念、①が同期していません。
これが、クオータニオンによるがかかわってきてるのかな~と思いました。
つまり、①はクオータニオンで回転してて、②、③はオイラーで回転しているので
これら二つを一致させて回転しないと同期しないということです。



そこで、②の矢印モデルの回転コントローラーをクオータニオンにしてみました。
クオータニオンは方位を表すものなので①のAlignmentを②のクオータニオン値にParamBlockでつなげました。



①と②が同期しました。やはり①はクオータニオンによる回転です。
ってかそれは、常識なのかな。パーティクルの回転はクオータニオンが基本みたいな。
どなたかご教授ください^^


さて、ABと回転が同期できるまで、もう一歩。
なのだが、ABの回転コントローラーをクオータニオンに変化させるなんてことはム~リ~。。
それか、TPのパーティクルの回転をオイラーにするかのどちらかです。なおさらム~リ~。。

ということで、目的は果たせませんでした!!

CG数学の道は、遠すぎる。。


フォーラムで3akさんから教えてもらったSpinのアウトプットデータストリームが特に役に立ったので要チェック!!







こういう難しい問題を、少しでも英語でやりとりできたのは良かった。
英語もがんばるぜ!!

>>benra
Hi Notchmen. I'm very new to TP, but i am familiar with vector math. If my memory serves me well. the Get direction helper should give you the current x y and z vectors of your particle. these are expressed as unit vectors . The dot product of each of these and world x , y ,z vectors will give you the cosine of the angle between each of them. - this angle i think will be your current rotation of each axis away from each world zero unit vectors. To be more clear - dot product between vectors A and B . = A.B = |A| |B| cos theta .
where
theta = the rotation angle.
|A| = magnitude of A = always 1 for unit vectors.

The Particle data helper also has access to the alignment of your particle - but im still too fresh to TP to know how to access that in terms of rotations.



>>3ak
IMO you don't need math to get rotation - wire spin data to vector and you'll get axis of rotation. Wire spin data to scalar and you'll get angular speed in radians per second.

i just don't remember what kind of data suits afterburn. You can export through 2 channels - vector and float or convert to quaternion (but there is no quat data channel in tp).








0 件のコメント:

コメントを投稿