2012年7月29日日曜日

maxScriptで行列を勉強してみた④

今回は、逆行列を使い、基底をワールドとローカル変換し合って座標を変換していく。
こうすることで、あるオブジェクトのローカル情報を元に座標変換する事ができる。
要は別の基底(基準)を元に調整できる事ができるということである。
3dsmaxでいう下の赤枠を切り替えて調整するときあるけど、ここイメージすると良いかな。



















実例1 マトリックスを使い、ボックスのある頂点を、ティーポットのある頂点へ移動する。

1、ボックスとポットを用意する。頂点番号50をターゲットにする。
ボックスの絶対座標はワールド基底からの値で、ローカル座標はローカル基底からの値である。
ボックスのワールド基底をポットのローカル基底に変換するために下記の2つの基底を用意する。
ボックスのワールド基底の変換行列は、transformプロパティでゲットできる。
ポットのローカル基底が必要なので、逆行列で用意しておく。





2、ティーポットのローカル空間でのボックスの頂点50の座標を求める。そのためには、ボックスの基底をティーポットのローカル空間にすればよい。


3、ポットの頂点100のローカル空間座標を求め、ボックスの頂点50へ移動するため移動ベクトルを求める。



4、後は、3で求めたベクトルをmoveメソッドで頂点100に引数として渡してやるだけだ。














実例2 オブジェクトAのローカル空間を元に、オブジェクトBを動かす。

画像のboxのローカル空間を元にSphereを移動します。ここでは、boxのy軸に沿って移動したいと思います。
①変換マトリクスを用意します。
transmatrix [0,5,0]    ----①
これを$Sphere.transform * transmatrix [0,5,0]してもワールド空間でのY軸に沿っての移動になる。

②boxのローカル空間を取得する
inverse $box.transform    ----②
③①の移動変換マトリクスを②を使い変換する
xformmat ① ②
これでboxのローカル空間でのY軸に沿っての移動になる。












2012年7月4日水曜日

nuclearA_test1

初めてvimeoに動画アップしてみた。
画像圧縮で、ディテールがつぶれているのが残念。要検討。
又、VimeoPlusにしないとアップデートに20分くらい待たされるのかな。それも検討。



nuclearA_test1 from notchmen on Vimeo.




今年、corei7-3930k にしたので、とりあえずFumeで限界辺りまで試してみた。
後半につれ、シミュレーション回らなくなったので(落ちはしないが長い)、あきらめた。
もっと、煙のロール具合を見たかったが、これ以上シミュかけるにはメモリ上げないと駄目っぽい。

構成はこんな感じ。

cpu:corei7-3930k
ram:16gb

res:667x667x1067

FumeFx2.1c

こういう、スケール感大きいものの表現てトライ&エラーができないのが痛いな~
fumeはmayaとかに比べると大分速いとか聞いたけど、やっぱりまだまだ。。
あきらめることが多いし。数年後に期待。



2012年7月2日月曜日

maxスクリプトで頂点を選択

ふと、スクリプトからオブジェクトの頂点を選択したいと思って調べてみた。
実力不足から、ヘルプを上手く活用することができないのもあり、引くに引けず数時間かかってしまった。ちっくしょう。
まだ、maxscriptの構造がボヤっとしているからスムーズに行かないのだろう。

とまあ一応解決したのでメモです。
別にこれ使って、ツール作るとかじゃないです。只、気持ちをスッキリさせたかっただけです。

では、この数時間の経緯を追ってみたいと思います。

はじめに、選択しているオブジェクトの頂点の番号を与えてやれば消せるだろうと考えました。
頂点番号5の頂点を消すと考えて、イメージ的にselectVert $ 5 で消せるかなと。
結果、こんなメソッドは定義されてないということでエラーが出ました。
んで、ヘルプを探りました。慣れないのでどう探したら良いのやら。。
とりあえず、vertexやら何やらで検索かけて探しました。こんなんでよいのか不安になりながら。

するとこういったメソッドを発見
↓↓↓↓
deleteVert

これは、オブジェクトの頂点インデックスを指定して削除するメソッドです。

もう後は、deletevertではなくて頂点選択のメソッドを探すだけかなと思いました。上記のselectVertみたいな。

それがない~んです。
あるのは、
getNumVerts  --オブジェクトの頂点数をゲットするメソッド
getVert  --オブジェクトの指定した頂点をpoint3(現在の座標での位置)を返すメソッド

等々。。。


ここで、振り出しに戻り、又検索の嵐。。自暴自棄になってます。成長しないな~。
てか検索、日本語引っかからないのが腹立つ。何か意味があるのかしら??

そこで「メッシュ頂点の選択:」という欄がありました!
絶対これやん!
getVertSelection
#[]
空の配列マーク?が返ってきた。
ヘルプだと、現時点における頂点の選択セットを返しますということらしい。
このメソッドは選択されている頂点番号を返すだけのようだ。

駄目だ。。もうそんなメソッドないのか。。

またも、しつこくヘルプを探る。ちょっとヘルプの見方に慣れてきた。
とりあえず、頂点はコレクションに格納されているからコレクションのタイプを見てみた。

するとVertexSelection値というのがあった。

バーと流し見してみたら,

select --VertexSelection 内の頂点を選択します。

を発見。と、発見してみたはいいもののってなんだ?

ヘルプより----------------------------------------------------------------------


VertexSelection は、シーン メッシュ ノードの一連の頂点を仮想配列として表します。
これを使用すると、インデックスで頂点にアクセスしたり、頂点間を繰り返したり、マップされた関数を頂点に適用したりできます。

「Editable_Mesh」も参照してください。

VertexSelection 配列は動的です。メッシュ ノードの頂点や選択された頂点の変更に伴って内容が変更されます。

VertexSelection 値はマップ可能です。



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

では、VertexSelectionを作らなきゃselectできないってことで、用意されているコンストラクタで値を作成してみる。

.selectedVerts  -- メッシュ オブジェクトで現在選択されている頂点です。

.verts -- メッシュ オブジェクトのすべての頂点、読み込み専用です。

この二つが用意されている。
これを使い、作成してみる。

vtx = $.verts
select vtx

できた!!選択したオブジェクトの頂点全部選択できました!!

うわっ、二行とかしょぼ。

頂点番号で指定する場合は

vtx = $.verts
select vtx[#{8}]


コレクションのインデックスで指定する場合は

vtx = $.verts
select vtx[8]


てとこかな。
他にも、いろいろプロパティやら演算子やらあるけど、とりあえずはここまで。

--追記--07/07--
上記の頂点選択スクリプトは何も選択していない状態では効果が見えない。
なので、オブジェクトを一度選択して、さらに頂点レベルに入って選択しなくては効果が見えない。

box001モデルの頂点番号6を選択したいとき

select $box001
subobjectlevel = 1
select $.verts[#{6}]

とする。



まとめ。
なんでこんな時間かかったんやろ。。。
ただ、オブジェクトのプロパティを指定してあげてselectメソッド使うだけなのに。。






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ベクトルになる場合があると思うのですが、それを防ぐ対処法ってあるんですかね?なんとでもなるのかもしれませんが、ベターな方法があれば知りたいものです^^


2012年5月25日金曜日

リニアワークフローのリンク集など

■テラオカさん
http://tiraoka.blogspot.jp/2011/10/blog-post.html
■ヤマギシさん
http://yamagishi-2bit.blogspot.jp/2012/05/aecg.html
■イナガキさん
http://ingk-tr.blogspot.jp/2012/04/ae01.html
■Area
http://area.autodesk.jp/column/tutorial/designviz_essence/4_about_linearworkflow_4/
■3DTotal
http://www.3dtotal.com/index_tutorial_detailed.php?id=1531&catDisplay=1&roPos=1&page=1#.T742i8VKT4Q
■seazo
http://www.seazo.no/linear-workflow
■hiroshisaito
http://hiroshisaito.net/blog/2011/05/after-effects-1.html
■CGやり直し
http://mj31000.blog13.fc2.com/blog-entry-76.html
■color is power(合成の式の説明)
http://elephantplus.blogspot.jp/2011/05/nuke-tutorial-over.html

//個人メモ
いつかまとめたい

・vrayの場合、設定でよく見るのがこちらのCバージョンなのだけど、Aとの違いがわからない。。
違いはCがレンダリング過程で2.2にしてリニアで返すって事なんだろうけど。。レンダリング過程で2.2にする理由って??ノイズが出にくいとか?

・普段は整数型(tga,png)で画像処理してたけど、float型(OpenEXRなど)で画像を処理すると、色が破綻するのを防ぎ階調を保てる。環境による費用対効果にもよるけど、どんどん取り入れていきたい。


・3DCGでレンダリングする場合は,srgbのテクスチャはリニア化して読み込まないと、色が正しく再現されない。

・画像保存時に2.2をかけて保存すると、アンチに影響が出る。

・vrayのレンダリング過程で2.2をかけて1.0で保存すれば、アンチは大丈夫らしい。だけど、リニアのカラー確認ができない。

・ガンマ2.2の環境にする理由。
テクスチャをリニアに変換して読み込みレンダリングするため。
よって正しいテクスチャを元にGIも計算されるから、GIもリアルになる。