2012年6月14日木曜日

TPのエクスプレッションメモ

TPのエクスプレッションで値を操作する手法などをメモしていこうと思います。随時更新ってことで{%ピクトハカセhdeco%}

こういうのは、なるべく多く引き出しがあると良いですね。
とりあえず、考えるより引き出しを多くしていきたいです!

後、関数が使えるとこは関数使っています。関数ヘルプ←式の使い方で検索

※スカラー値の変換であれば、Value To Timeノード+Floatノードを使えば、グラフで変換できるので便利!!←詳細は米岡さんのブログに記されています。
今後ノードのパラメータ上でグラフが扱えることに期待。

はじめに、、
ベクトルについて
①ベクトルは方向と大きさのみを持った値
②空間での、あるポイントのワールド位置座標は原点からのベクトル値である


■スカラー演算

●値の範囲を「0~1」に変換。値を正規化する。

---------------------------
Input値
lifespan = 200
age = 0,1,2,・・・・,200
---------------------------

age/lifespan
---------------------------
Output値
0,0.1,0.2,・・・・,1
---------------------------

※正規化とは、値を利用しやすくすること。
例えば、範囲が「23~343」のような任意の値を「0~1」の範囲に値を変換し利用しやすくしたりすること。




●値の「0~1」を「1~0」に反転する

---------------------------
Input値
a = 0,0.1,0.2,・・・・,1
---------------------------

1-a
---------------------------
Output値
1.0,0.9,0.8,・・・・,0
---------------------------




●任意の数の比率をフロート値で求める
---------------------------
Input値
a = 30
b = 70
---------------------------

a/a+b =x
b/a+b =y
---------------------------
Output値
x=0.3
y=0.7
---------------------------



●値の「0~1」を0.5を最大値とし、0.5以上は0に減っていくようにする

---------------------------
Input値
a = 0,0.1,0.2,・・・・,1
---------------------------

0.5-(abs(a-0.5)) //absは絶対値
---------------------------
Output値
0,0.1,0.2,・・・,0.5,0.4,0.3,0.2,0.1,0
---------------------------

●三角関数で曲線を表現する

上手く説明できないのでメモです。
sin(a*b)*c+d

a:位相
a=0,1,2,・・・∞

b:周期
c:振幅
d:初期位置


xにcos、yにsinで円を表現することができる。
さらにzに位相(時間など)を加えることにより、上方に向かう螺旋を表現できる。
a,b,c,dにそれぞれ任意の値を入れ、(x、y、z)に上記の式を入れることにより、様々な曲線を表現できる。
もちろんcosでも良い。

パーティクルを動かすというより、パーティクルの配置に使うほうが良いか。。
動かす場合は、Positionオペレータでフレームごとに位置を与えていく感じ。
よってベロシティが簡単にとれないので、パーティクルを動かすには不向き?
ということは、ベクトルで動かすほうが良い?
すみません、すげー基本的なことかもですが混乱気味なのでダラダラと、とりあえずメモしました。

●オブジェクトを地面に転がせる際に回転を同期させる
1軸 degreerad((X_Position)/(Radius*pi))*360

3軸 quaternionを使用

https://vimeo.com/album/2630843/video/80532054


●剰余を使ってエクスプレッションの値を繰り返す
http://sidefx.jp/doc/ref/expression_cookbook.html

■ベクトル演算

●単位ベクトルを求める
---------------------------
Input値
v1(任意の名前) //ベクトル値

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

unit(v1)
---------------------------
Output値
v3(任意の名前) //v1,v2に対する直角のベクトル
---------------------------


●二つのベクトルに対する直角のベクトルを求める。これを外積という。

---------------------------
Input値
v1(任意の名前) //ベクトル値
v2(任意の名前) //ベクトル値
---------------------------

v1xv2
---------------------------
Output値
v3(任意の名前) //v1,v2に対する直角のベクトル
---------------------------

●二つのベクトルのなす角を求める。これを内積という。値はスカラー値になるので注意。


---------------------------
Input値
v1(任意の名前) //ベクトル値
v2(任意の名前) //ベクトル値
---------------------------

acos(v1*v2)
---------------------------
Output値
v3(任意の名前) //v1,v2のベクトルのなす角(スカラー値)
---------------------------



●ベクトルの加算を用いて、ある二点(A,B)を結ぶ線上に位置するポイントのワールド位置座標を取得する。

画像


ベクトルを加算する前に、v2の値を決める。
①線分ABの単位ベクトル(方向)を取得する。(TPでいうと、点A,Bをポジションとする、DistanceノードのDirection値)
②ベクトルの大きさを用意する。(スカラー値)
③①と②を乗算することで、大きさと方向を持ったベクトルv2ができあがる。
---------------------------
Input値
v1(任意の名前) //ベクトル値
v2(任意の名前) //ベクトル値
---------------------------

v1+v2
---------------------------
Output値
v3(任意の名前) //原点から線分AB上を終点とするベクトル
---------------------------

●ベクトルの減算を用いて、ある二点(A,B)のベクトルを作成する。distanceノードがあるのであまり使い道ないかもだが。。。






















●反射ベクトル
Input値
v1(入射ベクトル) //ベクトル値
v2(衝突サーフェスの法線) //ベクトル値
---------------------------

(-1*2*(v1*v2)*v2-v1)+v1
(2*(v2*v1)*v1-v2)
---------------------------
Output値
v3(反射ベクトル)
---------------------------



■条件式

if(式,真,偽)
例:if(pos.z>50,1,0)→Zポジが50以上なら、真、以外は偽


2012年6月4日月曜日

TPでパーティクルをサンプルとし障害物を避けてみる。

前回、外積を使用し障害物を避けてみた。
今回は、パーティクルをサンプルし障害物を避けてみる方法をやってみる。
参考は、お馴染みのJoe Scarr氏のDVDより。
このパーティクルをサンプルにする方法は、多方面で応用が利きそうなので要チェック!?

簡単な動画を作ってみた↓↓




ミサイルが赤のパーティクルをサンプルし、障害物を避けている。

詳細は近日。。



2012年6月1日金曜日

パーティクルの衝突の超基礎 #TPJP

先に一言。この記事見たからって、外積が把握できるという内容ではございあせん。
外積の詳細は別のとこでお願いします~

今回記事にしたのは、自身が外積について一つ引っかかったからです。



box(v1)とロケット(v2)の方向を取得し、外積をつかってboxをかわすように、設定してみた。

それがこちら↓↓

v1 x v2





もし、v1、v2が平行ならば、ゼロベクトルになるはず。そうなるよう設定してみた。

だがなっていない↓↓

v1 x v2




デバックで値を確認してみた。

画像


法線のyに意図しない数値はいってる!!ゼロベクトルになっていない!!
もちろん、max上の回転値はall0です!
なのに法線がずれている。。

boxを新しく作り直してみた!!

画像

ゼロベクトルになるとこんな↓↓




では、どのタイミングで意図しない数値が入った??
一度boxを回転して、回転(0,0,0)と入力で戻すと駄目らしい。0ベクトルには戻れず、何かしら値が入っている。
なぜなら、maxちゃんの0.0って表示は小数点を第何位まで表示すると0になっていない>o<
0.00005213みたいな。。


まあ、結果boxを避けてほしいので0ベクトルにならず良いのだが、気持ち悪い。


んで、気になったのが、このような衝突をセットアップする際、万が一にも0ベクトルになる場合があると思うのですが、それを防ぐ対処法ってあるんですかね?なんとでもなるのかもしれませんが、ベターな方法があれば知りたいものです^^