2011年8月30日火曜日

script reel

スクリプトのすすめを書き始めて、前にリールを作ったのを思い出しましました。
最後に本格的に作ったDotImageMakerのファイル作成日時を見ると3年前! あっという間に月日が流れました。
実はHoudiniを本格的に始める前(1年くらい前)までは、 ここから全く進歩していなかったのですがMARZAの同僚の方々のお陰もあってHoudiniで数学っぽい事が勉強でき、maxsciriptのスキルもアップしてきました。
やはり、環境は大事だなとつくづく思います。

2011年8月29日月曜日

thinking particles memo

パーティクルのvelocityのlengthを取得方法
コンディションのdistanceが特殊なvectorしかコネクト出来ないので、
velocityをpoint3で変換しコネクトする。
そのvectorと[0,0,0]とのdistanceでlengthが取得可。

Shape Collision
コリジョンの精度や、変形等具合の調整はgroup側のshape collision opratorで調整。

vRandom
ランダムのアニメーションタイプを決める値に、int型のnew value parが入っているので
アニメーションさせたくない場合は2設定。

scriptのすすめ3 ~showpropertiesとinstance~

今回は、前回のスクリプトを拡張していきましょう。

まず、ポイントを作成する所を少し拡張です。
他のオブジェクトの例も交えながら説明すると、
作成時に、オブジェクトの持っているプロパティの値を指定し作りたい場合は
以下のように書きます。

point size:10
box length:10 width:10 height:10 lengthsegs:3
teapot radius:10


ってな感じです。
指定したいパラメータだけ書けば大丈夫で、書かなかったプロパティはデフォルト値になります。

デフォルト値で作成後、編集という形をとるならば、
boxの例だけをとると

a = box()
a.length=10
a.width=10
a.height=10
a.lengthsegs=3


といった書き方になります。

ですが、オブジェクトのプロパティをスクリプトでどの様に書くか知っていないと指定も出来ませんよね?
UIに書いてある値(英語版の3dsmax)と一緒の場合もありますが、違う場合もあります。


ヘルプでその都度調べても良いのですが、結構面倒ですよね。
ここで、便利なshowpropertiesというスクリプトがあります。

showproperties $


オブジェクトを1つ選択して、実行すると選択オブジェクトの持つプロパティを
リスナーに表示してくれます。


maxscriptで$は特殊な意味をもっていて、選択オブジェクト(1つ)という意味です。
複数選択しているときには使えません。

他にも$は名前でオブジェクトを指定して使う場合にも使います。
例えば、シーンにtepot01とい名前のオブジェクトがある場合、
$teapot01.pos = [10,10,10] 

showproperties $teapot01
の様な書き方が出来ます。

脱線したので、元に戻ります。

前回の選択オブジェクト達に親を作るスクリプトですが、もう少し便利にしてみましょう。

myP = point box:on
for o in selection do
(
    np = instance myP
    np.wirecolor = (color 14 255 2)
    np.rotation = o.rotation
    np.pos = o.pos
    o.parent=np   
)

delete myP
ctrl+Eで実行です。























このスクリプトは、ポイントを1つ作り
選択オブジェクトの数ぶんインスタンスコピーし、それらを回転を合わせ配置し、親とします。

最後のdelete myPとしているのは、最初に作ったmyPは
forループでコピー作成後不要なので消しています。

スクリプトをそのまま日本語訳すると

pointを作ります。それをmyPとします。
forループを選択オブジェクトの回数まわします。
(
    np はmyPのインスタンスコピーです。
    npのワイヤーカラーはcolor 14 255 2です。
    npの回転値は、oの回転値です。
    npの位置は、o(選択オブジェクト)の位置です。
    o(選択オブジェクト)の親は、npです。
)
myPを消します。 

np = instance myP
を少し補足すると、何かのインスタンスコピーを作るとき

instance オブジェクト

と書きます。

他にただのコピー、参照コピーを作るメソッドがあります。

copy オブジェクト
reference オブジェクト

今回はこの辺で、では。

2011年8月22日月曜日

scriptのすすめ2 ~イコールとselection~

自分が、まずスクリプトを覚えようと思ったときに、混乱した1番最初出来事は。

「=」(イコール)の考え方です。
これは、プログラムやスクリプトを少し勉強した事ある人は遭遇すると思うのですが、
i = i + 1ってのがちょいちょい出てきますよね。
これを最初見たときは、ん?? i = i + 1ってイコールじゃないじゃん
2=1+1でしょ? 1=1+1なんてありえないジャン。
じゃんじゃん、うるさいですが、そうやって混乱して分け分からなくなったのを覚えています。

こんな事で混乱したのは自分だけかも知れませんが。。。

i = i + 1を説明すると、
=(イコール)の前と後ろの i は同じ意味では無く、始めの i は i+1の結果なんです。

って少しややこしいので、前回のスクリプトで説明します。
1行目はまずは、置いておいて

p = point()
p.pos = o.pos
o.parent = p


を日本語訳すると

p は新しいpointです。 (maxで何かオブジェクトを作るときはこの様に書きます。ボックスならbox())
pの位置は、oの位置です。
oの親は、pです。


てな感じになります。(スクリプトはプログラムと言うより、殆ど箇条書きに近いです。)

=(イコール)は算数で習った、イコールというよりも日本語の「は」と同じ意味で捉えると分かり易いかと思います。

そして、「.(ドット)」は「の」と置き換えられます。
maxscriptでは、オブジェクトが持つプロパティ(ポジション、マテリアル、モディファイヤ、コントローラーなどなど様々)の情報はドット指定していく場合が殆どです。

次に、一番大事な1行目の
for o in selection do
です。

これは、forループの1種なのですが、forループは何かと言うと
何回も同じ処理を書くのを省く為に用意されているものです。

たとえば、boxを10個作るのに、

box()
box()
box()



って10回書きませんよね。これでは、手でやってるよりシンドイので。
書き方は

for i = 1 to 10 do
(
box()
)


これで、boxが10個出来ます。(全部同じ場所に出来てしまいます。スクリプトのデフォルトそうなので)
ちなみに、i = 1 to 10と書いてありますが、この i は何の文字列もよいです。
j でも bb でも hello でも。


そして、スクリプトの基本が分かり、次に何を知りたかったか。
それは。
「複数選択したオブジェクトたちを、1発でバーっとアレコレしたい!」
でした。

それが、
for o in selection do
(
ここにアレコレしたい処理を書く。
)

これです。
これが知りたいのに、全然ヘルプに載ってない!(よく調べると載っているかも)

スクリプトやプログラムを勉強してると、if 文の使い方なんて最初方で出てきますが
if文の使い方全然知りたくないんです、知ってもあんまり意味無いというか
もっと後でいいです。if文ももう何もかも。

何故、この様に書くのか? 
最初はこれをもう呪文の様に、「そう書くんだ!」と記憶するのみで良しとします。説明すると配列やらなにやらの話になってしまうので、それはのちに説明できたらと思います。
実際、自分も最初その様に始めました。

もう一つ、oというのは選択オブジェクト(1つ)と覚えていてもらえたらと思います。
forループの中で、選択オブジェクトが順番に1つづつ
アレコレの処理がされていくと覚えてもらえたらと思います。

このoも実は、何の文字でも良いです。objでも、kkkでも。
仮に、objとして書き直すと、こんな感じです。

for obj in selection do
(
    p = point()
    p.pos = obj.pos
    obj.parent = p
)


objという、選択オブジェクト1つづつにfor以下の処理が毎回行われるという事になります。

自分自身が書く、スクリプトの殆どはこれと大差ありません。
行いたい処理を、箇条書きしてそれとforループでまわす。これが基本だと思います。


前回、拡張していくと書きましたがちょっと長くなりすぎたので、今回はこの辺で。
では、また。

2011年8月19日金曜日

scriptのすすめ1

突然ですが、
「scriptのすすめ」
ってなスクリプトのTipsを始めてみようと思います。

まずは、maxscriptから。その後、RealFlow、Houdiniのpythonなんかを続けていてたらと思います。
いつまで続けられるか分かりませんが。

maxscript EdgeRot from sugiggy on Vimeo.

エッジを基準に、面がバラバラに回転しています。
何も面白くないですが、手でやろうとするとかなりシンドイです。まず面をバラバラに動かすのと、エッジの向きの回転軸で回転させる為に、ベクトルと回転の仕組みをスクリプトで書いています。
のちに詳しく解説できたらと思います。

自分自身は、元々大学時代にプログラミングなど挫折した人で、以前はスクリプトなど
書きたいとか書けるとか微塵も思っていませんでした。
ある事をきっかけに6年前くらいから書き始めたんですが、始めたら便利さに驚き
あっという間に仕事効率がアップしました。慣れると開発時間も殆どかかりません。

どのような人が覚えるべきか?
ここは個人的な考えですが、
将来、大きなプロジェクトをまとめる人材になりたいと思う人や、エフェクト系の仕事をやりたい人、そしてジェネラリスト。
特に日本には多くのジェネラリストがいますが、埋もれずにレベルアップしていくにはスクリプトは必須であると思います。
飛びぬけたセンスがあれば必要ありません、でも出来たらもっと良いですね。
(最近では僕の周りのモデラーの方もスクリプトを勉強しています。)

CGアーティストはアートの能力はもちろん持っていないといけませんが、
大きい仕事になればなるほど、効率が仕事の中の比重として大きくなり、責任となってきます。
(なので海外ではパイプラインを作り効率を上げています。)
そこで全体に関わるツールや、制作方法を考えるのにスクリプトの知識がとても活きてきます。
TDにツール制作を依頼する場合も、自分で書いた事があるか無いかでは頼み方に大きな差が出てきます。
アーティスト目線からの仕様で、ツールが出来ればより使いやすいパイプライン、ツールが出来上がっていくと思います。

スクリプトというと、すぐにintだとかfloatだとかクラスやらなんやら、型がどうだこうだとかの話になりがちですが、最初のうちにはそれらを知らなくて大丈夫な進め方を出来たらと思います。

勉強の仕方としては、
1.「最初のうちは時間はかかるが、無理してでも書く!」
最初はどうやって書いてよいか分からず、調べたり、考えたりで
「これなら手でやったほうが早ぇー!!」なんて思ったりしますが、
ぐっと我慢し書くべしです。そうで無いと覚えられません。

自分自身、未だに10個くらいのオブジェクトに似たような作業を行う場合
手でやってしまう事もありますが、途中で「あぁ書いて置けば良かった。。」
なんて思うことは多いです。
その後必ず、ちょっとした修正や変更をしたりする事しばしばです。

2.「maxscriptのヘルプと友達になる」
ヘルプはある程度かける様になった今でも使います。語学と一緒で、言語の全ての言葉を記憶は出来ないので、
書いたこと無い機能を作る場合は必須です。
maxsciptのヘルプは初心者にとっては不親切です。
かなりプログラミング用語が使われていて、最初のうちは良く分かりませんでした。

「ヘルプのヘルプが欲しいぜ!」って思った事もしばしば。
が、ここは我慢です。分からない用語はスルーです。
色々サンプルが載っていたりするので、自分の書きたい機能はどう書くのか分かれば良しとします。
検索の仕方もコツがあるのですが、ここは明文化するのが難しく慣れとしか言えない感じです。
ガンガン使って慣れてください。
初級者を抜け出すにはまずはヘルプを使い方がマスター。出来れば、その先はずっと楽でしょう。

最近はmaxscriptのヘルプは英語版が付き、のちに日本語版ヘルプが出るという感です。
2012からはWebになっています。
http://docs.autodesk.com/3DSMAX/14/JPN/Rampage%20MAXScript%20Guide/index.html

2012以前はchmファイルです。個人的にはこっちの方が好きです。
http://www.autodesk.co.jp/adsk/servlet/index?siteID=1169823&id=13137514&linkID=14171177


大分前置きが長くなりましたが、
最初のスクリプトはこちら!

for o in selection do
(
    p = point()
    p.pos = o.pos
    o.parent = p
)

えっ! これだけ!!

選択したオブジェクトに親のポイントを作ります。
スクリプトエディターに貼り付けて、実行(Ctrl+E)してみてください。

ゆっくり進めます。暖かい目で見守ってください。
次回はこのスクリプトの解説と、それを拡張して行けたらと思います。
では。

2011年8月16日火曜日

Houdini12

久々のブログ更新です。 夏休みって事でひとまず友達と呑んだくれ。
そして観ていなかったDVD観てダラダラするなどしてます。

HoudiniReel2011


今さらですがHoudini12、ついに発表されましたねー
以前ブログで、TPとHoudiniに付いて書いていたことが現実に!
なんとbullet搭載!!そしてPyroもGPUベースで140倍faster!なんとclothまでも150倍faster!
ジオメトリーエンジンも更新され、全体的にも高速化、メモリ節約もされてます。
詳細はコチラ↓と言った感じですが、
http://www.sidefx.com/index.php?option=com_content&task=view&id=2005&Itemid=66

とりあえず、大興奮のバージョンアップです。今まだかつてこんなバージョンアップは見たことない。
ついに日本でもHoudini復活の狼煙があがったのでは!?
10月にベータ版らしいですが、待ち遠しい。