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).








2012年10月15日月曜日

TPで障害物をかわすテスト01

Joe氏のDVDを参考に、群集の勉強中~。
一応,、円柱を避けています^^ まだ、完全に避け切れていないですが。。。





にしても、時間かかるわ~。
でもまあ、この群集は、かなり数式使っていたり、アイデア満載で勉強になるから大丈夫。
そのアイデアを一つ上げるとすると、パーティクルをある方向に移動させたいときに、パーティクルをサンプルとして方向を得る方法がある。こんな感じ→→
これで、結構パーティクルの動きを制御できると思う。だが、これをプロシージャルに行うには数学が必要になってくると思う。
パーティクルを動かす、こういうアイデア、数式はツールが変わっても生きてくると思うので、くじけづ食らいついていきたい。
目指すは、Boidシステム!!

2012年10月14日日曜日

TPでベクトルから螺旋表現するにはcross pruduct !!

こちらの動画に対して、iGouさんとのtwitterのやり取りで螺旋表現をクロスベクトルでやったらできますね~とか言ってできなかったら駄目なのでやってみた。

とりあえず、現時点のベロシティにcrossベクトルをaddしたらできた。
一点、注意するのが、crossベクトルを計算するために使うベクトルを用意する必要がある。
やり方としてはこちらを元に作成した。
ビームエフェクトとかに使えるかな~。。



2012年10月12日金曜日

Iteratorで同心円状にパーティクルを配置

Iteratorの基本を米岡さんがまとめてくれています!
自分で記事書かないと覚えないので、メモ程度に作成してみました。

又、今回パーティクルの配置に使用したエクスプレッションについてはこちらにちょこっと書いています。

2012年10月11日木曜日

CGの数学メモ

これまで、TPでパーティクル触ってるうちに学んだものを整理、メモしてみた。

当然のごとく間違って解釈している事もあるかと思うので、その時は突っ込みのほうお願いします。
こちらも、手法見つけるたびに更新していきたいと思いまする。
又、TPのエクスプレッションの記事と、ダブルとこもあるが気にしない。


ベクトル


■ベクトルは方向と大きさを持った値

■空間での、あるポイントのワールド位置座標は原点からのベクトルの成分値である

■ベクトルAの|A|の意味は大きさを表す記号。
絶対値は、全てをプラスにするという意味に思われがちだが
本来の意味は「始まりから終わりまでの距離」である。

■ベクトルの足し算、引き算で何ができるか?
基礎はこちらが、すんごくわかりやすいです^^
線分上の点を求めることができる→こちらの「ベクトルの加算を用いて~・・」のところ
ベクトルの加算で、動きを滑らかな軌道にする事ができる。こちら
ベクトルの減算で、2点のベクトルを求める事ができる。TPで言う、C distanceノードと思えばよい。こちら

■内積は何ができるのか?

-----------------------------------------------------------------------------------


●二つのベクトルのなす角が求まる。
内積の公式、A*B=|A||B|cosθより
cosθを求めればよい。
--追記2012/10/11-
角度として、値を求めるならarccosθとする。
cosθ=0.5の場合、arccosθ=60度
------------------

●ベクトルの投影の長さ(大きさ)が求まる。
A*unit(B)=投影の長さ
画像
-----------------------------------------------------------------------------------
条件命題

●二つのベクトルの垂直チェック

A*B=0ならば垂直

●二つのベクトルの角度情報(二つのベクトルのなす角をθとする)

A*B>0のとき、θ<90度
A*B<0のとき、θ>90度
-----------------------------------------------------------------------------------


■外積は何ができるのか?
はじめに、AxBで表されるxはcrossという。よってクロス積とも言われる。
結果はベクトル値だが、二次元の場合だとスカラー値になる。

●二つのベクトルに対して、垂直なベクトルが求まる
右手の法則により、垂直の向きを割り出す!
AxBが上向きなら、BxAは下向きになる。
右手の手首を、ベクトルA,Bの交点に置き、親指は立てながら人差し指から薬指までベクトルAの向きに合わせる。んで、4本の指をベクトルBに曲げたとき親指の指す方向がAxBになる。

●二つのベクトルのなす角が求まる。(内積使ったほうが早いとのことだが、時と場合による)
外積の公式、|AxB|=|A||B|sinθより
sinθを求めればよい。

●ベクトル同士の交点を求める
こちらがすばらしい記事になります。


●ベクトルと点の距離を求める
画像|AxC|/|B|



2012年10月8日月曜日

ベクトルの合成で弧を描きならターゲットに移動


ターゲットに向かって、弧を描きながら到達する表現をベクトルの合成を使って行いました。
元ネタは、Joe氏のDVDです。 パートとしては、09_SquirlArt_Crowdsの一部分になります。
一気にやりたいところなのですが、一つ一つ噛み砕いていくのに精一杯です。

手抜きになりますが、一応解説。




いい感じに、曲線の軌跡を残していますね。
これは、ベクトルを毎フレーム足しあわすだけで表現できます。
その足しあわすベクトルは、パーティクルのベロシティとターゲットへのベクトルになります。

イメージ↓↓適当すぎてすんません。




















緑ベクトル、青ベクトルの割合で弧を調整することができます。
青ベクトルを大きくすれば弧は大きくなります。ベクトルを大きくするには、スカラー値をかけてやるんでしたね。
今回、スカラー値は0~1の値に正規化しています。これは、単に解かりやすくするためです 。最終的にDrectionInputにいくので正規化されます。



















大分、説明を省いた部分がありますが、大事なところは、ベクトルの合成による表現です。
上記のように、ベクトルの合成を毎フレーム行うことで、じわじわとターゲットにベクトルが向くので結果、曲線が表せる ということになります。

今後もこういった、数学的な引き出しをどんどん増やしていきたいところです。

2012年10月6日土曜日

TPでジオメトリの最短点の検出

ジオメトリの最短点を検出し、パーティクルを飛ばす方法です。
他には、こちらの2ページ目のような使い方ができるようです。
以前は、サーフェースのpointを得るにはIntersectでray飛ばして、hitポイントを得ることしかできなかったと思うのですが、TP5からはジオメトリのPointDataを取得できるので便利になったかなと思います。

ですが現状、他に「こういう使い方ができる!」って いう一押しが思いつかないです。
ですので、メモ的な感じで紹介します。

簡単な動画を作ってみました。
緑の点が、パーティクルから視たジオメトリの最短点のポイントデータになります 。