ラベル 3dsMax の投稿を表示しています。 すべての投稿を表示
ラベル 3dsMax の投稿を表示しています。 すべての投稿を表示

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月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年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もリアルになる。




2012年1月26日木曜日

3dsmaxのスペースワープのプラグイン

BlurPartForce

■概要
 BlurWindとRandom Walkという2つのスペースワープからなるスペースワーププラグイン。BlurWindは、標準の風スペースワープに粘度を設定することによりパーティクルに与えた力を緩やかに止めることができるスペースワープ、Random Walkはスペースワープの周りを虫がぶんぶん飛び回るような動きを与えるスペースワーププラグインです。


HallucinoよりBlurPartForce で検索


2012年1月9日月曜日

TPのパーティクルをソースにしたときの不具合

FumeのRadiusをParticleAgeで小さくなるようにしていますが、消える瞬間元のサイズに戻ってしまいます。。PFでは正常に動作します。



この現象は僕だけなのでしょうか??

------追記-------

とりあえずSubSamplingを2000以上にしたら直りました。。理屈がようわかりませんが(泣)
PFではデフォで大丈夫なんですけどね。。
なので根本的な解決にはなっておりません。


------追記-------

もう一つの解決策。
パーティクルの寿命がきたら、別グループに送る。


2012年1月6日金曜日

FumeFxでシミュレーションからレンダリングまでを自動化するスクリプト

Fumeでなんか自動化するスクリプトないかな~とふらついてたところ良いの発見したのでメモ。
てか自分で調べて書け!と自分に一喝!

簡単にどんなスクリプトかというと、ワンボタンでデフォルトキャッシュからウェーブレット、ポストキャッシュへとシュミレーションしてレンダリングまでするスクリプトです。

順番を整理すると、

① デフォルトモードでシュミレーションをかけ、デフォルトキャッシュを出力する。
② ウェーブレットモードでシュミレーションをかけ、ウェーブレットキャッシュを出力する。
③ ②のキャッシュに切り替え、ポストモードでポストキャッシュを出力する。
④ レンダリングをする。

をワンボタンでやってくれるスクリプトとなっております。

※ワンボタンで全てやってくれるので、各キャッシュのパラメータ等はあらかじめ設定しておく必要がある。

スクリプトにするとこんな具合である↓↓
--------------------------------------
$FumeFX001.selectedcache =0 //キャッシュをデフォルトキャッシュへ
$FumeFX001.runsimulation 0 //デフォルトモードでシュミレーション起動
$FumeFX001.runsimulation 2 //ウェーブレットモードでシュミレーション起動
$FumeFX001.selectedcache =1 //キャッシュをウェーブレットキャッシュへ
$FumeFX001.runsimulation 3 //ポストモードでシュミレーション起動
render framerange:#active outputfile:rendoutputfilename
--------------------------------------



詳細、ダウンロードはAllan氏のサイトにあります~


---追記---

こっちのほうが優れています→FumeFX Sim +




2011年11月19日土曜日

Fumefxのパラメーターにアクセスする!~Outputパス編~

メモするの忘れてた~
tweetでゲットした情報はすぐメモする癖つけないと、探すのが面倒だし削除されるから気をつけないとな。。

fumeのヘルプ観たのですがではよく分からなかったので助けを求めたところ、
kobataro101さんがフォーラムで見つけて教えてくれました~感謝です{%笑いwebry%}
フォーラムの存在も知らず、なんかすいません{%がっかり(orZ)webry%}

とりあえずこれでいけました↓

-----------------------------------------------------------------
$FumeFX01.setPath "f:\\temp\\ffxSim_0000.fxd" #(#default ,#match)

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

#以降がよく分かりませんでした。ですがこれないと駄目なようです。
まあグリッドサイズを合わせるかなんかでしょうということでスル~。。



2011年10月23日日曜日

Batch Renderメモ

あるものを複数のカメラからレンダリングする場合やオブジェクトごとにレンダリングを分ける場合はバッチレンダリングを使用しレンダリング管理すると非常に楽だ。

つまりレンダリングしたい素材ごとにシーン状態、レンダリング設定(プリセット)、カメラ設定、保存設定を登録できる。
いちいちレンダリングするために保存先変えたり、カメラ変えたりしなくて済む。
詳しい設定方法などはヘルプに載っていると思いますので省きます。

とまあ便利は便利だが、色々と不便さも兼ね備えている。

・現状不便だと感じたところ
①名前のソートが出来ない。
②選択が一つ一つしかできない
③間違って消してしまったとき、ctrl+Zが使えない

②を解決する方法としてBatch Render Assistantのスクリプトを使うと解決。


上のリンクのscriptspotに他にも使えそうなパッチレンダ系のスクリプトありそうだが、どうなんだろ??
誰かオススメのバッチレンダがあれば教えてください{%ピクトハカセhdeco%}
とりあえず上記①の不便さを解消したいっす!!


後、気をつけたいのがレンダーエレメントをプリセットで保存して使用する場合だ。
commonタブで保存先が指定されている場合(チェックボックス有無問わず)、レンダーエレメントの保存先を決めてプリセット保存し、ロードするとcommonタブでのファイル名を元にエレメントのファイル名が変更される。
なので、エレメントをプリセット保存する場合はRenderOutputFilename = ""でcommonタブでのファイルパスを空にしてやらなければいけないようだ。とりあえず、バッチレンダを使うときは空にしたほうが良い。



maxバージョンアップしても改善されないし、使いやすくならないのが不思議に思う。。




2011年10月3日月曜日

ベクトルの正規化について

Zで行こう!さんのサイトでスクリプトを勉強してたら、ベクトルの正規化というものが出てきた。エフェクトアーティストたるものこれは見逃せないことだと思い色々と調べてみた。高校時代の数学ことなんて全く覚えてません。{%泣くwebry%}

まずベクトルの正規化を学ぶにあたって、以下のお題を進めながら学んでいこうと思う。


お題:3D空間に存在する球(sphB)を球(sphA)に接するように移動する

デカルト座標で示すとこんな感じ。分かりやすく2Dで考えていきます。

画像


この図から見るように、moveメソッドに引数として赤の矢印のベクトル値を渡してやれば、OKだ。


①赤いベクトルの大きさを求める。
大きさをsph_distanceとすると、
sph_distance = (distance sphA.pos sphB.pos)-(sphA.radius+sphB.radius)
となる。

②赤いベクトルの単位ベクトル(方向)を求める。
①の大きさのベクトルを求めるとなると、大きさ1となる単位ベクトルが必要になる。
なぜなら、ベクトルは大きさと単位ベクトルの積で表されるからである。

画像

こんな感じかな{%トホホwebry%}

単位ベクトルが必要ということで、それを出すにはnormalize を使う。赤いベクトルの単位ベクトルをsph_unit_vectorとすると、
sph_unit_vector=normalize (sphA.pos-sphB.pos)
となる。

③上記のように①*②で赤いベクトルの値が求められる。
赤いベクトルをsph_vectorとすると、
sph_vector = sph_distance*sph_unit_vector

④最後にmoveメソッドに③を渡してやればOKだ。
move $sphB sph_vector


以上、ベクトルを使った移動を見てきたが、ベクトルの正規化という言葉が出てきてない。
ベクトルの正規化というのは②で見られるようにベクトルを単位ベクトル化するということである。
メソッドで言うと、normalize  がそれにあたる。




2011年9月10日土曜日

選択したモノに対して、スケールoo倍の親ポイントをつける

sblogさんのとてもわかりやすい記事を参考に、初スクリプト作ってみました~{%万歳webry%}

単にループでやりたいこと並べただけですが。。
また、バウンディングボックスの値をとるところが自信ないです{%がっかり(orZ)webry%}
[.max: Point3,.max: Point3]と[nodeLocalBoundingBox ]の違いが良くわからんし。
なんとなくlocalって書いてある後者を使ったけど。。このことかな。。

今のとこスクリプト作ってて時間かかるのはヘルプであれこれ探すことだから早く見慣れたいわ~


画像



----------------------------------------------------
--選択したモノに対して、スケールoo倍の親ポイントをつける


for obj in selection do
(
obj.pivot=obj.center --基点を中心へ。
p = point()        --ポイント作成
p.box=on --box表示on
p.wireColor= (color 0 255 0) --ワイヤーカラーの指定
p.rotation = obj.rotation --ポイントの回転値をオブジェクトの回転値にあわせる
p.pos = obj.pos --ポイントのポジションをオブジェクトの位置にあわせる
bb = nodeLocalBoundingBox obj --バウンディングボックスの最大ポイントと最小ポイントを取得
bbmax = bb[2] --バウンディングボックスの最大ポイント
bbmin = bb[1] --バウンディングボックスの最小ポイント
p.size=distance bbmax bbmin --上記二つの長さ
p.size=(p.size)*1.5 --ここでポイントのサイズを最終指定。
obj.parent = p --オブジェクトの親をポイントにする
)



--更新履歴:2011/09/11
--ポイントの回転も選択したものにあわせる


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


2011年9月8日木曜日

オパシティで抜いたオブジェクトの、vrayvelocity素材の出した方

思いつきでテストをやってみたらいけそうなのでメモ!

以前調べたところ、elementのvrayvelocityはopacity対応してないみたいでした。
だけど、vrayDissplaceModを使い、vrayvelocity素材を出すことに成功!チョイ裏技?
肝はvrayDissplaceModのパラメータにあるWater levelにチェックをすること。詳細は以下の動画を見ればわかる。

また、板ポリの位置をずらさないために、vrayDissplaceModのAmount0.1,Shift-0.1,Water levelにチェックし-0.0以下にする。これで位置はずれないはず。

だけど、テクスチャディテールがあれば重くなるかもです。




ここに紹介されていた機能を参考にしました!
他にも目から鱗な機能ばかりでした。vrayDissplaceMod恐るべし!
↓↓



2011年8月6日土曜日

FumeFxでトルネードファイヤー



発見したのがfootoolsのForce Viewerである。そのままビュー上でフォースの影響を視認できるプラグイン。
これは使えそうだ!{%拍手webry%}

http://www.footools.com/3dsmax_plugins.html

http://www.maxuser.com/plugins/