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メソッド使うだけなのに。。