日本でハリウッドVFXを制作! 「経産省アイディアボックス」 結果:  
●まとめエントリはこちら ●FAQ ●お問い合わせは左のメールフォームから

2012年8月10日金曜日

質問:「VFXアーティスト? 映像作家?のどちらを選択すべきか」


2年ほど前に「「映像作家」になることについて」というエントリを書いたのですが、それをご覧になった学生さんから質問を頂きました。
ときどき頂く質問なので、ちょっと考えをまとめてみました。
(というか、いろいろやりながら書いていたのでまとまってないかも知れません (^^;) )
 


Q: 「VFXアーティスト」になるのがよいのか、「映像作家」になるのがよいのか? 選択に迷っています。

A: 難しい質問ですねw 逃げるわけではないのですが、
これは自分自身にしかわかりません、そして自分が知っているはずです。
まぁそれがわからないので質問しているんだと思いますが、自分自身に耳を傾けて聞き出すしかないですね。


VFXの映像も、映像作品も、考えるだけではできあがりません。
またスキルアップをするだけだけでも、映像作品はできません。
「こういう作品が作りたい」という目的があり、それを行動に移すからできるのです。
そしてその「行動」の部分に決まり切ったやり方はありません、目的の映像を作るための効率の良い方法があるだけです。


そんなことはわかっているというかも知れません。
一般的なことですが、CGや映像の学校に通うという選択をした人には
学校に行ってコンピュータやソフト、カメラの使い方を学べば、なにかすごい作品が作れるようになるんじゃないか?
という漠然とした希望をもって入学し、卒業しても先生の指示でやった卒業制作が精一杯という人が意外と多いのです。
その卒業制作で自分のやりたい作品がつくれたのなら良いと思いますが、だいたいは漠然と習った映像制作のステップに従いながら思いつきで、こうしよう、ああしようと作っていっただけの物だったたら、その貴重な学生生活の時間はなんだったのかとがっかりすることになるかもしれません。


「よし女子高生が不安に思っていることを光の動きと色で示す映像を作るぞ!」とか、「渋谷にいるスーパー老人をテーマにしたショートフィルムを作るぞ!」という具体的な目標は行動に結びつきます。
「VFXアーティストになるぞ!」とか「映像作家になるぞ!」という目標もつのは楽しいことですが、自分は今これとこれとこれをなんとか作ってみたが、もっとうまく、もっと沢山いろんな作品を作りたいからその道を選択したいというふうであるのが理想的だとは思います。
(VFXアーティストでも、ハリウッド映画などにあこがれて自分もそういう作品にかかわりたいというのは、
立派な目標だとは思います。ハリウッド映画で働いている日本人のほとんどがそうかもしれません。)


有名な映画監督を含め、映像作家として有名な人達は「映像作家」になることだけを目標にしたのではなく、
自分の作りたい映像作品があり、それをずっとやりつづけるには「映像作家」になるのがよいから目標にしたのだと思います。

重要なのは、やりたい(行動に移したい)事であり、それに関連する行動です。

スピルバーグは、どうやれば映画監督になれるのかということにも悩んだかも知れないですが、それよりも自分が何を作りたいものが先にあり、それをどうやれば作れるのかを考え実行し続けて今の地位にいます。
日本でも庵野秀明とか、宮崎駿とか、マンガ家の多くもそういう人が多いと思います。
ティムバートンは元々アニメーターでした。
ハリウッドのVFX業界で働く人の中にも、自分の暇な時間を見つけては、自主制作映画を作る人もすくなくありません。
VFXアーティストだと、自分の時間を使い仕事では出来ないような表現を追求する人も居ます。

最初は稚拙だったり、真似だったり、素人っぽかったりですが、どんな批判されても成功している人達は、
それをやるのが楽しくてしかたがない。だから継続して次々とあたらしい作品を作り続けます。

「スピルバーグのジェラシックパークみたいな映像が作りたい。」とかでもいいので、やりたいことがあり、
絵コンテのやり方は知らないけど、とりあえず広告の裏に自分の撮影したい映像のアイデアを書いてみた。
カメラ無いんで自分のコンデジで撮ってみた。
CG習いたてなんで、へたくそだけどとりあえず恐竜入れてみた。
半年かかったけど何とか出来た。でもなんかつまらんな、次はもっとすごいの作りたいなぁー。
よし次はこうしよう。
この継続で、だんだん自分の考えを入れてオリジナル性がでてきて、世間に認められるというパターンは多いと思います。
ただ1年2年で、それができるひともいるし何年もかかる人も居る。
好きだから、やりたいことだから継続してやれるんでしょうね。


なんか話がそれてしまいましたが、作りたい物があるなら作り続ける事でおのずと道は開けてくるってことですね。
そして職業名で選んでも、作りたい物がなければ、達成出来ません。
職業で選ぼうとしても多分無理です。

まずは自分がなにが作りたいのかを見つけましょう。
この道を志すきっかけとなったことはなんでしょう?
どんなものに影響を受け、どんなものを作りたいと思ったのでしょうか?



ヒント:

「職種」で選択するってのは、ちょっと乱暴な言い方ですが、
小学生が「(日本で一番偉いから)総理大臣になる!」ってのとあまり変わりません。
小学生が総理大臣のやることを知っていてそれがやりたいから、言っているとは思えないですよね。

でも「大きくなったら屋台の金魚すくいのお店の人になりたい!」ってのは
たぶん、なんか屋台で働くことにおもしろさをみつけたんだろうなと推測できますよね。

ついでよくあるのが「パイロットになりたい!」
これはどうでしょうね?微妙です。
飛行機は飛ぶ物であることは知っているし、操縦桿を握ってコントロールする物であることぐらいは知っているでしょう。ようするに行動とその行動が生み出す物はしっているわけです。
ただ仕事としての「パイロットの業務」ってのをすべてしっているわけではありません。
おそらく「VFXアーティストになりたい」「映像作家になりたい」ってのはこの辺りのレベル出はないかと思っています。(自分を含めて)


この段階から一歩進めて、どうすれば選択できるようになるんでしょう?

映像作品ってのは多種多様な物があります。

映画
モーショングラフィックス
実写映像(フィクション? ノンフィクション?)
アニメーション(CG? 人形? クレイ? 手描き? 2D?)
(最近はやりの)プロジェクションマッピング

どんなものが自分が好きなのか、とにかくいろいろ見てみる。
そしてやりたいことを、やってみる。
行動することで、しか見えてこない物もあると思います。
考えるだけ、自分の気持ちを見つめるだけでは見えてこないのです。

作品を作るといっても大作である必要ありません、自分のいまのスキルでできるけど作りたい物でも良いと思います。
そうした作るという行為を通して、好きな物、そうでないものが少しづつ見えてくるとおもいます。
自分が本当にやりたい事というのは、作るという「行動」をし続けないと、見つからない物でもあるのでしょう。

そういう行動をしつづけることで、自分がやりたいことは、VFXアーティストの仕事だったのか、一本の作品としての映像を作ることなのかがみえてくるのでしょうね。


そして本来であれば、この道を進む前に自分の好きなことがある程度わかっているはずです。
それはなんだったのでしょう。




メールにも書かれていましたが、いろいろとこの業界で働いている方達と接触して、話を聞いたり現場を見せてもらうのは、非常にその助けとなると思います。





補足:
VFXアーティストといえども1ショットだけ、CGだけを考えていればよいわけではありません。
CGのことも幅広く、学生の間には学びきれないほどの大量の知識があります。
映像作家と言っても、どんな映像を作りたいのかによって、やりたいこと学ぶべき事は違ってくると思います。
両方とも学ぶべき事はたくさんあり、学生生活で学べることは一部だけだと思います。
限界がある中で、絞り込む方がより効果的になる訳なんですが、もう一つの選択肢もあります。

それはあえて決めずに、両方やるという事です。
学生のうちに両方出来るとは限りませんので、仮にどちらかを選択する事になるかとは思いますが、
それで将来のすべてが決まってしまうことではない。
自分次第でそれは変えることもできるのではないでしょうか?

ただし、就職してお金にならないと生きていけないので、とりあえず食って行けそうなレベルにまでいけそうな法を選択する。
そして、自分のやりたいものを作り続け、数年後になるかも知れませんが、仕事をやっていてふと自分の方向はこっちにしようと思うときが来るかも知れません。

その当たりも、自分次第です。
もしかしたら、そういうときは来ないかも知れません。

やりたいことを実行に移してやりたいものを作る。
その連続の中でしか見つからないのだと思います。


今は無料のソフトも沢山あり、PCも安いですし贅沢を言わなければ、VFXでも映像作品でも、作れる環境はあります。

その環境で、学校で教えてくれることをまっているようなら、もしかしたらそれが問題かも知れません。
多くの学校では、自分のやりたいことは教えてくれません。
絵コンテや、鉛筆画も含めて、ソフトの使い方など、ツールの使い方を教えてくれるだけです。

2012年4月13日金曜日

土埃と煙のリファレンス

Red Bull Dakar 2011 - Carlos Sainz & Marc Coma
http://vimeo.com/26104465

SAMt HD - Tour Dakar 2011 - Rent Motorcycle Chile
http://vimeo.com/19554067

Dirt Smoke!
土を巻き上げその土から土ホコリが舞い上がっている様子がわかる。
最初はタイヤの回転数が小さくあまり土が舞い上がってないので後方のみにでている。
回転数が上がってくるとタイヤの上部、そして周囲全体から土埃がまいあがり始める。
http://www.youtube.com/watch?v=g3q85gycC2g



Dust bowl rally cross
これは煙ではなくホコリ(小さな土のつぶ)なので、煙と比較して重いので比較的低位置に留まる。
また土自体が、巻き上げられてからそれが着地するまでの間に煙の発生源となっている。
土を放り投げたときのように、上に巻き上げられて広がったときに重い粒子は重力に引っぱられて落下し、
軽い粒子は煙状になりその場を舞う。
また車の後ろの気流におされて車についていくような動きを見せる。
http://vimeo.com/groups/driftinghd/videos/26252785


OMR Rallyx Aug 1 2010
横滑りのような動きでは、タイヤの回転によって巻き上げられるのもあるが、タイヤが移動していくときに起きる風邪に引っぱられて地面の土がまいあがる動きがある。
またタイヤの側面で削られ前方にはね飛ばされる土による埃
http://vimeo.com/10302567


直進して横滑りが少ない場合はタイヤの後ろに噴出するように土がはき出され少し遅れて土埃が出る。
横滑りの時はえぐれてタイヤの溝にのって巻き上げられた土がフェンダー内で飛び散り跳ね返り土埃を出す。。





舗装道路でのドリフト
http://vimeo.com/28609908

THE HILL - Maxxis Tyres British Drift Championship Round 4
http://vimeo.com/28343146

これらの動画をリファレンスする際で、注意すべきこととしては天候があります。
同じ晴天でも、雨が良く降る時期とかだと湿気が多くて、それほど細かい埃は舞わないことがあります。
たとえ雨が降っていない時期でも、国によってその差があることは考慮すべきです。
たとえば雨が降らない時期が数か月ということが当たり前の地域では、乾燥しているので、比較的細かなほこりが多くなります。

ここで参照したような車の動画だとあまり目立たないですが、人が走るときとか車よりも少ない質量と力で動くようなもの、より近くで見る場合は考慮すると効果的もしくは、発想の自由度が高まるかもしれませんね。








2012年3月19日月曜日

「スカラー」の語源

Melやプログラム言語を勉強していて「スカラー値」という言葉がよく出てくる。

これは最初とまどったがようはベクター(複数の数字が一組になって表現されるもの)などに対して、ひとつの数字 で表される物を指していると理解してからはほぼつじつまが合うので、そのまますすめてきた。
参照1:スカラー,ベクトル,行列

ところでこの「スカラー」という言葉。
英語の発音を聞くとどちらかというと「スケーラー」(音声参照:goo辞書) と聞こえる。

そうメモリとか物差しを意味するスケールとほぼ同じである。

英語表記、発音記号は以下のように「Scal」まではほぼ同じである。
スカラー:Scalar (skéilər
スケール:Scale (skéil

これって同じ所から来ているのかも知れないので語源を調べてみた。

英語版Wikiで見るとラテン語の「Scalaris」から来ており、ラテン語で「はしご(Ladder)」を意味するScalaの形容詞句である。
英語の「Scale(スケール)」も「Scala」から派生している。
記録にある限り数学で最初に「Scalar(スカラー)」の意味として使われたのはフランソワ・ビエトによる、「Analytic Art」(1591年)の中である。

    Magnitudes that ascend or descend proportionally in keeping with their nature from one kind to another are called scalar terms.
(一つの状態から他の状態へ同比率で上昇または降下するその大きさ(等級)をスカラーという用語で呼ぶ)



参照:Online Etymology Dictionary「Scalar」
"resembling a ladder," 1650s, from L. scalaris "of or pertaining to a ladder," from scalae (pl.) "ladder, steps" (see scale (n.2)). Mathematical sense first recorded 1846.




そしてほぼこれと同じ意味で推測されている方が居てWeb上にうまくまとめられていたのでそれを引用しておきたい。
参照:Meta2mathematician's HP 
スカラー scalar

この 「スカラー」 という言葉は大学で線型代数学でも学ばないとなかなか目にしなくなったが, これは scale (スケール) という言葉から発生したものだと思われる。 音楽家が scale といえばそれは 「音階」 のことであるが (こっちはフランス語では gamme, ドイツ語では Tonleiter, Skala, イタリア語では scala, gamma という), (英語では) 同語源の単語 scale, 即ち 「目盛り」 とか 「物差」 とかを意味する言葉である。 つまり, vector が 「大きさと方向を持つ量」 であるのに対し, 「物の大きさ」 を示す量が (物差しで測れる量) scalar なのであろう。

補足だがここでは最初に使ったのは、「William Rowan Hamilton(1805-1865) 」とあるが、上記Wikiによると1846年に英語の用語「scalar」を最初に使ったのが彼である。
(上記、フランソワ・ビエトは同様の意味で使ったが使用したのはラテン語「Scalaris」)

2012年3月4日日曜日

パーティクル101 その4:saveInitialState無しで追加したパーティクルを保存する(2)

今回の内容は、実は「その2:アスキーファイルの分析」よりも前に書いてました。
でも、ファイルの基本的内容を知っていると、今回の内容が理解しやすいので
後回しにさせてもらいました。


<はじめに>
前回、説明しましたとおり、今回の結果は結局は勘違いを元に動いており、
実用的ではないですが、
●アスキーファイルの分析例
●setAttrを使ったパーティクルアトリビュートの設定法

は参考になると思います。
ただし長いです。




<動機>
Expressionによる方法では、開始フレームにおいて追加したいパーティクルを表示することが出来ません。

もういちど「particle」コマンドを使うとどうなるのかおさらいしてみます。
最初からパーティクルをいくつかもたせてparticleShapeを作れば、
開始フレームから最終フレームまでそのままです。
そのファイルを保存して開いても、そのパーティクルが消えることはありません。


適切な表現かどうかはわかりませんがパーティクルの数がしっかりそのノードに記憶されているのです。


なぜそのノードに記憶されているんでしょう?
その記憶をちょこっと修正すれば、そのノード(particleShape)にちゃんと追加したパーティクルの情報を埋め込んでおくことができるんじゃないでしょうか?

なぜそんな簡単というか重要なことができる機能がないのか?(← ここが勘違い。InitialStateがその働きをします。

まぁMayaだから仕方がない。どうやったらできるか考えてみることにしました。

これについても@spx808さんからヒントをもらい、アドバイス通りMayaアスキーファイルを分析してみることにした。
「パーティクルの初期状態はposition0のようにPPアトリビュートの前に0をつけたもので記録されています。
初期状態で存在するパーティクルはid0とnextId0で記録されています。
.maファイルを読むと仕組みが理解できるので解析してmel化することができると思います。」
「m0,id0,nid0,pos0あたりのアトリビュートをセットしてやればなんとかなると思いますがけっこうめんどいです。」

なにぶん、アスキーファイル、パット見て「あっここだ!」とさらさらっと修正するほどなれてませんので、
ステップを明確にして、少しづつ解析していきました。




<分析手順>
1)4つの異なるシーンを作成。)
パーティクル個数が
(a)ゼロ
(b)1個(原点)
(c)1個(座標1,1,1)
(d)二個(原点と座標1,1,1の位置)
2)それぞれアスキー形式(.ma)で保存
3)アスキーファイルを開きParitcleShapeに関連する部分を切り出し比較。
※この切り出したものは最後に画像ファイルとしてまとめて掲載してあります。


それによりわかったのはファイル内では
●particleShape はcreateNodeコマンドで作られている
●各アトリビュートがsetAttrで設定されている
●異なっている部分は以下のアトリビュート


pos0
vel0
acc0
nid (パーティクルが存在する時のみ)
nid0 (パーティクルが存在する時のみ)
bt0
ag0
lifespanPP0




ヘルプ「particle」ノードの項目で各アトリビュートを調べどんな内容が設定されているのか調べてみます。
まずは「pos0」からです。


<pos0>
pos0: 「各パーティクルにおける初期状態のposition(位置)」
注意すべきは「pos」というアトリビュートもあるという点、違いはpos0は初期位置であるという点
(@spx808さんのアドバイスにもありますが、アトリビュート名の後ろに「0」がついているのは
初期状態を記録しているアトリビュートの意味です。)


作例の4つのファイルを比較すると以下のようになる。
(a)個数ゼロ:       setAttr ".pos0" -type "vectorArray" 0 ;
(b)原点に1個:     setAttr ".pos0" -type "vectorArray" 1 0 0 0 ;
(c)座標1,1,1に1個:     setAttr ".pos0" -type "vectorArray" 1 1 1 1 ;
(d)原点と座標1,1,1に計2個:  setAttr ".pos0" -type "vectorArray" 2 0 0 0 1 1 1 ;


なるほど、「1 0 0 0」「2 0 0 0」というところで、どうやら個数と座標値がセットされているらしい。
では具体的にはどのようにしてセットされているのかを見ていきたい。


<setAttrの使われ方>
setAttrはアトリビュートに値を設定するコマンド。
まずはCGWorldの「Mel for Designers」のサポートページがわかりやすいのでそちらを参考にしてSetAttrの全体像をつかむ事にする。

「ノードのプロパティを指定した値に設定します。
構文: setAttr ノード名.プロパティ名 設定値
例:pCube1のスケールYを6.0に設定します。
setAttr pCube1.scaleY 6.0 ; 」



今回、アスキーファイルに書き込まれているsetAttrの行には、
●ノード名が無く
●プロパティー名が「" "」でくくられて".pos0"となっている。

この理由はヘルプから見つけることは出来なかった。

そこで勝手に推測してみることにする。
●ノード名が無い理由 --> 「すでに対象ノードが選択されているから」
この一連のsetAttrの直前には「createNode」 コマンドが実行されている。
コマンドが実行されて最後に作られたノードは選択状態になる。
この場合は、「particleShape」が選択状態になっている。
それに関係するコマンドを続けて実行するので、わざわざノード名を指定する必要がない。
それで、プロパティー名のみを指定しているということだと思われる。

●「" "」でくくられている理由 --> 「文字列であることを明記するため」
これも推測。これは文字列を示すためのMel内の基本的な決まり事である。
実際には使わなくても良いが、明確にするために使っているのだろう。


これらを実証するために「Mel for Designers」の例を元に試してみます。

pCube1を作成して以下の5つの条件でsetAttrコマンドを実行してみました。

実験1)ノード名.プロパティー名を「" "」でくくる。
setAttr "pCube1.scaleY" 6.0 ; をpCube1を選択しないで実行
--> 正常動作

実験2)ノード名.プロパティー名を「" "」でくくらない。
setAttr pCube1.scaleY 6.0 ; をpCube1を選択しないで実行
--> 正常動作

実験3)ノード名なし、.プロパティー名だけを「" "」でくくる。。
setAttr ".scaleY" 6.0 ; をpCube1を選択しないで実行
--> エラー // Error: setAttr: No object matches name: .scaleY //

実験4)同条件
setAttr ".scaleY" 6.0 ; をpCube1を選択してから実行
--> 正常動作

実験5)同条件
setAttr .scaleY 6.0 ; をpCube1を選択してから実行
--> 正常動作

以上の実験から、以下のことがわかります
● プロパティー名がなければ対象が選択されていないと動作しない。

● プロパティー名だけの表記でも動作する。
● プロパティー名は文字列であるが「" "」で囲んでも囲まなくてもよい。




<-type "vectorArray">
さて、元のアスキーファイルにあるsetAttrに戻ります。

最後の数字は設定値である事はわかるが、
数字の前に「-type "vectorArray"」というフラグが使われている、これは何でしょうか?

ヘルプファイルで調べてみます。
オンラインヘルプ:setAttr

「-type フラグは、非数値型のアトリビュートを設定するときのみに必要となります
    {TYPE} はスペースで区切られた任意の数のタイプ(TYPE)の値を意味します。
    [TYPE] はタイプ(TYPE)の値がオプションであることを意味します。」


「1 0 0 0」は数値ではないか?という思ってしまうかもしれないが、
アトリビュートの「型」としては違う。
ここではアトリビュートとしては「配列」という形式になるのだが、
「配列」自体は数値を入れる入れ物ではあっても、「数値」そのものではなく「入れ物」である。
それで非数値型アトリビュートということになっているらしい。
こういうのは言葉の遊びのように思えてきて初心者には、どうでもいいことのように感じる事があるが、コンピュータでは明確に処理の仕方が異なってくるので、あきらかに違うのである。


この非数値型の他の種類も含めてオンラインヘルプに表で示してある。

-type vectorArray」の所を見てみると
「ベクトルの可変長配列」ということなので
1)ベクトルの配列
2)配列の数は固定ではない。

ことがわかる。
パーティクルの数が増えればそのベクター値を格納するところ(配列)を、それに応じて増やせるということになる。

値についての箇所は以下のようになっている
値の構文 :    int {double double double}
値の意味 :    numberOfArrayValues {xValue yValue zValue}

とある。
Integer(整数)により配列の数を指定し、xyzの値を次に指定するという形式を取ることがわかる。
実際にはこの「{ }」の括弧は使われるわけではないので、この文章の中でデータの違いを示すためのものであろう。



今回の各テストシーンにおける「pos」アトリビュートに設定される配列数と値は以下のようになっている。

(a)個数ゼロ:       setAttr ".pos0" -type "vectorArray" 0 ;
配列数:ゼロ

(b)原点に1個:     setAttr ".pos0" -type "vectorArray" 1 0 0 0 ;
配列数:1、値 0 0 0

(c)座標1,1,1に1個:     setAttr ".pos0" -type "vectorArray" 1 1 1 1 ;
配列数:1、値 1 1 1

(d)原点と座標1,1,1に計2個:  setAttr ".pos0" -type "vectorArray" 2 0 0 0 1 1 1 ;
配列数:2、値 0 0 0 と 1 1 1


ここから考えると
●配列数はパーティクルの数と同じ
●パーティクルの各座標値が、その後にスペースをはさんで続く、カンマなどの区切りはない


パーティクル数(スペース)x1(スペース)y1(スペース)z1(スペース)x2(スペース)y2(スペース)z2 ・・・
という具合になる。


<-type "doubleArray">
さてsetAttr ".mas0" -type "doubleArray" 0 ; の部分をみると
「-type "doubleArray"」というフラグが使われている。

先ほどとは違うので、これも後のために調べておくことにす
オンラインヘルプ:setAttr

ヘルプを見ると「倍精度浮動小数点数の可変長配列
1)倍精度浮動小数点数の配列
2)配列の数は固定ではない。

ということになる。

.mas」(mass)は質量を示しているアトリビュートだが、各パーティクルの初期質量を倍精度小数点の数値で指定いると言うことになる。

値の構文     int {double}
値の意味     numberOfArrayValues {arrayValue}

Integer(整数)により配列の数を指定し、値を次に指定するという形式を取ることがわかる。
先ほどのvectorArrayと比べると値は一つなのでわかりやすい。

●配列数はパーティクルの数と同じになる。
●パーティクルの各初期質量が、その後にスペースをはさんで続く、カンマの区切りはない。


パーティクル数(スペース)a(スペース)b(スペース)c(スペース)d(スペース)e・・・
という具合になる。


さてここまででパーティクルにおけるsetAttrの使われ方がわかったので、
今度は各アトリビュート名ごとに調べていく。
「pos0」についてはすでに見たので、それ以降について調べてみる。



<vel0>
vel0:これも「vel」プロパティーと混同しないように要注意。
パーティクル毎のVelocity(方向性を持った速度)の初期値
デフォルト値:空
オンラインヘルプ:パーティクル

(a)個数ゼロ:       setAttr ".vel0" -type "vectorArray" 0 ;
配列数:ゼロ、値:なし

(b)原点に1個:     setAttr ".vel0" -type "vectorArray" 1 0 0 0 ;
配列数:1、値: 0 0 0

(c)座標1,1,1に1個:     setAttr ".vel0" -type "vectorArray" 1 0 0 0 ;
配列数:1、値: 0 0 0

(d)原点と座標1,1,1に計2個:  setAttr ".vel0" -type "vectorArray" 2 0 0 0 0 0 0 ;
配列数:2、値: 0 0 0 と 0 0 0

デフォルトで作成されたものはVelocityはゼロであることがわかる。



<acc0>
acc0:これも「acc」プロパティーと混同しないように要注意。
パーティクル毎のAcceleration(加速度)の初期値
デフォルト値:空

(a)個数ゼロ:       setAttr ".acc0" -type "vectorArray" 0 ;
配列数:ゼロ、値:なし

(b)原点に1個:     setAttr ".acc0" -type "vectorArray" 1 0 0 0 ;
配列数:1、値: 0 0 0

(c)座標1,1,1に1個:     setAttr ".acc0" -type "vectorArray" 1 0 0 0 ;
配列数:1、値: 0 0 0

(d)原点と座標1,1,1に計2個:  setAttr ".acc0" -type "vectorArray" 2 0 0 0 0 0 0 ;
配列数:2、値: 0 0 0 と 0 0 0


デフォルトで作成されたものはAccelerationもゼロ



<mas0>
mas0:これも「mas」プロパティーと混同しないように要注意。
パーティクル毎のmass(重さ)の初期値
デフォルト値:空


(a)個数ゼロ:       setAttr ".mas0" -type "doubleArray" 0 ;
配列数:ゼロ、値:なし
(b)原点に1個:     setAttr ".mas0" -type "doubleArray" 1 1 ;
配列数:1、値: 1

(c)座標1,1,1に1個:     setAttr ".mas0" -type "doubleArray" 1 1 ;
配列数:1、値: 1

(d)原点と座標1,1,1に計2個:  setAttr ".mas0" -type "doubleArray" 2 1 1 ;
配列数:2、値: 1 と 1





<id0>
id0:これも「id」プロパティーと混同しないように要注意。
パーティクル毎のAcceleration(加速度)の初期値
id:各パーティクルのユニークなID
id0:パーティクル毎の初期ID値
(正直言うと違いがよくわからないが、ここではid0ということで)
デフォルト値:空


(a)個数ゼロ:       setAttr ".id0" -type "doubleArray" 0 ;
配列数:ゼロ、値:なし

(b)原点に1個:     setAttr ".id0" -type "doubleArray" 1 0 ;
配列数:1、値:0
(c)座標1,1,1に1個:     setAttr ".id0" -type "doubleArray" 1 0 ;
配列数:1、値:0

(d)原点と座標1,1,1に計2個:  setAttr ".id0" -type "doubleArray" 2 0 1 ;
配列数:2、値:0 と 1



<nid>
nid:「nextID」 次に利用可能なID
デフォルト値:0(ゼロ)
これは配列ではないので値だけ。

(a)個数ゼロ:       該当しない
値:    該当しない

(b)原点に1個:     setAttr ".nid" 1;
値:1

(c)座標1,1,1に1個:     setAttr ".nid" 1;
値:1

(d)原点と座標1,1,1に計2個:  setAttr ".nid" 2;
値:2




<nid0>
NextID(nid)の初期値
デフォルト値:0(ゼロ)
これも配列ではないので値のみ

(a)個数ゼロ:       該当しない
値:    該当しない

(b)原点に1個:     setAttr ".nid" 1;
値:1

(c)座標1,1,1に1個:     setAttr ".nid" 1;
値:1

(d)原点と座標1,1,1に計2個:  setAttr ".nid" 2;
値:2


最初のフレームでパーティクルの数がすでに決定している場合、
当然ながら<nid>と<nid0>は同じ値をとると思われる。



<bt0>
bt0:「birthTime0」
パーティクル毎のバースタイム(発生時間)の初期値。
デフォルト値:空

(a)個数ゼロ:       setAttr ".bt0" -type "doubleArray" 0 ;
配列数:ゼロ、値:なし

(b)原点に1個:     setAttr ".bt0" -type "doubleArray" 1 0.041666666666666664 ;
配列数:1、値:0.041666666666666664

(c)座標1,1,1に1個:     setAttr ".bt0" -type "doubleArray" 1 0.041666666666666664 ;
配列数:1、値:0.041666666666666664

(d)原点と座標1,1,1に計2個: setAttr ".bt0" -type "doubleArray" 2 0.041666666666666664 0.041666666666666664 ;
配列数:2、値:0.041666666666666664 と 0.041666666666666664

そのパーティクルの発生時間の初期値
この長い小数点数はどこから来たかというと、フレームを秒数表示した物。
今回は24fpsで作成したシーンなので、
1(秒)÷24(フレーム)=0.041666666666666664
すなわち1フレーム目で発生していることを示している。



<ag0>
ag0:「age0」
パーティクル毎の年齢、初期値

デフォルト値:空

(a)個数ゼロ:       setAttr ".ag0" -type "doubleArray" 0 ;
配列数:ゼロ、値:なし

(b)原点に1個:     setAttr ".ag0" -type "doubleArray" 1 0 ;
配列数:1、値:0

(c)座標1,1,1に1個:     setAttr ".ag0" -type "doubleArray" 1 0 ;
配列数:1、値:0
(d)原点と座標1,1,1に計2個: setAttr ".ag0" -type "doubleArray" 2 0 0 ;
配列数:2、値:0 と 0

このケースの値は、いずれもパーティクル発生時「0歳」に設定されている。

setAttr ".lifespanPP0" -type "doubleArray" 2 3.4028234663852886e+038




<lifespanPP0>
なぜかヘルプにはのってない。
これは「0」部分を除きカスタムアトリビュートと同じ名前であるが...別にカスタムアトリビュートになにか設定するわけではないし、アトリビュートエディター内のlifespanPPの所に何も表示されていない。

ヘルプの「パーティクル アトリビュートのリスト」によると以下のような説明である。
「lifespanPP:パーティクルが消滅するときをパーティクル単位で設定します。」


アトリビュート名の後ろに0があるケースはそれが初期値であることを示す。
よって「lifespanPP0」は寿命の初期値であるというのは想像がつく。


ブログ「memlog」さんによると、
「lifespanPP [寿命]
各パーティクルの寿命。
例えばlifespanPP = 1とすると、1秒後に消滅する。
おそらく、age > lifespanPPとなった瞬間に、消滅するのだと思われる。
この値をゼロにすることで、パーティクルを任意のタイミングで消滅させることが可能」



シーンファイルの設定はデフォルトのままなのでMayaのGUIからアトリビュートエディターの設定を見るとLifeSpanの設定は以下の通りである。
LifeSpan:Live Forever
この状態での各シーンの設定は以下のようになっている。

(a)個数ゼロ:       setAttr ".lifespanPP0" -type "doubleArray" 0 ;
配列数:ゼロ、値:なし

(b)原点に1個:     setAttr ".lifespanPP0" -type "doubleArray" 1 3.4028234663852886e+038 ;
配列数:1、値:3.4028234663852886e+038

(c)座標1,1,1に1個:     setAttr ".lifespanPP0" -type "doubleArray" 1 3.4028234663852886e+038 ;
配列数:1、値:3.4028234663852886e+038

(d)原点と座標1,1,1に計2個: setAttr ".lifespanPP0" -type "doubleArray" 2 3.4028234663852886e+038 3.4028234663852886e+038 ;
配列数:2、値:3.4028234663852886e+038 と 3.4028234663852886e+038


ためしに
LifeSpan Mode: Constant
LifeSpan:1

で設定したがこれら値は変化無し。

アトリビュートエディターのLifespanPPに以下のエクスプレッションを設定してみた
CreateExpression:particleShape1.lifespanPP = 0.1;
しかし、上記のsetAttrの値に変化は無かった。


名前からするとパーティクル毎の寿命の初期値であることは間違いないのだが。

これは@honeking さんとのTwitterでのやりとりで解明した。

まず、ヘルプの「finalLifespanPP(flp)」には以下のように書かれている。
「finalLifespanPP(flp)はlifespanPPの値をコピーして利用する。
LifeSpanモードが「None」の時は、フロート最大値が使われる」




上記のアスキーファイル内にある「3.4028234663852886e+038」という数字は、実はフロート値の最大値なのである。
参照サイト:「変数の扱える最大値の周辺」
「3.40282347e38 が float の最大値である。」

ヘルプを見ても「finalLifespanPP0(注意:初期値を示す「0」が後尾にあり)」というのは存在しない
LifeSpanモードが「None」の時の値をどこからか持ってくる必要がある。
そしておそらくその為の値「floatの最大値」を格納する場所が「lifespanPP0」なのだと思われる。
ようするにデフォルトの「Live Forever」の値は、ここからとってきていると考えることが出来る。

これは実際の数としてはかなり巨大な数なので、実質、永久に存在していると考えて間違いないだろう。そもそもMayaのタイムレンジをそこまで設定できるのかどうかもわからないし、そこまでの長尺のショットなどあり得ないだろう。
ようするにこれはこれで有効なのだ。


スクリプトエディターで「Echo AllCommand」にして観察しながら、アトリビュートエディターでLife Foreverモードにすると
setAttr "particleShape1.lifespanMode" 0;
が実行されていることがわかる。
ヘルプでは「None」と書いているが「0(ゼロ)」の事だと思われる。



------------------
<イニシャルステートを使わない、パーティクルの追加方法>
以上の分析からパーティクルを追加してかつそれを初期値として保存するためには以下のような
Melでアトリビュート値を設定する事になる。

以下はパーティクルを追加する場合に変更する必要がある場所:
(参考スクリプトは今回作成したアスキーファイルより引用)

setAttr ".pos0" -type "vectorArray" 1 0 0 0 ;

ポジション: 配列数、値(座標値xyz = 任意)
setAttr ".vel0" -type "vectorArray" 1 0 0 0 ;
速度: 配列数、値(速度値xyz = 0 0 0)

setAttr ".acc0" -type "vectorArray" 1 0 0 0 ;
加速度: 配列数、値(加速度値xyz = 0 0 0)

setAttr ".mas0" -type "doubleArray" 1 1 ;
質量: 配列数、値(質量=1)

setAttr ".id0" -type "doubleArray" 1 0 ;
ID: 配列数、値(ID、ゼロから始まり配列数が2以上だと 1 2 3 ・・・と増加する)

setAttr ".nid" 1;
NextID: 値(id0の最後の値の次の数、基本的に他の配列「数」と同じになるはず)

setAttr ".nid0" 1;
NextID: 値(nidと同じ)

setAttr ".bt0" -type "doubleArray" 1 0.041666666666666664 ;
バースタイム: 配列数、値(フレーム1からの場合 0.041666666666666664 )

setAttr ".ag0" -type "doubleArray" 1 0 ;
Age(年齢): 配列数、値(発生時の年齢:0)

setAttr ".lifespanPP0" -type "doubleArray" 1 3.4028234663852886e+038 ;
寿命初期値: 配列数、値(最大値 3.4028234663852886e+038)




これを参考に実際に行うためのスクリプトを作ってみる。
1)空のパーティクルShapeを作成
particle; 

2)setAttrを使い1,1,1の場所に一つのパーティクルを作成。

setAttr ".pos0" -type "vectorArray" 1 1 1 1 ;
setAttr ".vel0" -type "vectorArray" 1 0 0 0 ;
setAttr ".acc0" -type "vectorArray" 1 0 0 0 ;
setAttr ".mas0" -type "doubleArray" 1 1 ;
setAttr ".id0" -type "doubleArray" 1 0 ;
setAttr ".nid" 1;
setAttr ".nid0" 1;
setAttr ".bt0" -type "doubleArray" 1 0.041666666666666664 ;
setAttr ".ag0" -type "doubleArray" 1 0 ;
setAttr ".lifespanPP0" -type "doubleArray" 1 3.4028234663852886e+038 ;



これでパーティクルが一つ追加される。
(パーティクルが表示されない場合は、タイムスライダーを動かし、初期フレームに戻る必要がある。)


ではさらに2,2,2の位置にもう一つ追加してみる。
追加と書くと新しいパーティクル1つの情報だけをスクリプトで実行するようなイメージを持ってしまうが、 実際には既存のパーティクル、今回追加するパーティクルの両方をsetAttrで設定する必要がある。
簡単に言えば、二つのパーティクルを設定するためのsetAttrで各アトリビュートを上書きする事になる。


3)setAttrを使い1,1,1 2,2,2の場所に2つのパーティクルを作成。

setAttr ".pos0" -type "vectorArray" 2 1 1 1 2 2 2 ;
setAttr ".vel0" -type "vectorArray" 2 0 0 0 0 0 0;
setAttr ".acc0" -type "vectorArray" 2 0 0 0 0 0 0 ;
setAttr ".mas0" -type "doubleArray" 2 1 1 ;
setAttr ".id0" -type "doubleArray" 2 0 1 ;
setAttr ".nid" 2;
setAttr ".nid0" 2;
setAttr ".bt0" -type "doubleArray" 2 0.041666666666666664 0.041666666666666664;
setAttr ".ag0" -type "doubleArray" 2 0 0 ;
setAttr ".lifespanPP0" -type "doubleArray" 2 3.4028234663852886e+038 3.4028234663852886e+038;



これで二つパーティクルが追加された。

ーーーーーーーーーー

<勘違いに気がついた>
アスキーファイルでパーティクルがどのように記述されているのかがわかったので、
Emitでパーティクルを一つ追加しInitalStateで保存した場合のアスキーファイルも比較してみることにした。

createNode particle -n "particleShape1" -p "particle1";
    addAttr -ci true -sn "lifespanPP" -ln "lifespanPP" -dt "doubleArray";
    addAttr -ci true -h true -sn "lifespanPP0" -ln "lifespanPP0" -dt "doubleArray";
    addAttr -ci true -sn "lifespan" -ln "lifespan" -at "double";
    setAttr -k off ".v";
    setAttr ".gf" -type "Int32Array" 0 ;
    setAttr ".pos0" -type "vectorArray" 1 0 0 0 ;
    setAttr ".vel0" -type "vectorArray" 1 0 0 0 ;
    setAttr ".acc0" -type "vectorArray" 1 0 0 0 ;
    setAttr ".usc" yes;
    setAttr ".scp" -type "string" "particleEmit_startup";
    setAttr ".mas0" -type "doubleArray" 1 1 ;
    setAttr ".id0" -type "doubleArray" 1 0 ;
    setAttr ".nid" 1;
    setAttr ".nid0" 1;
    setAttr ".bt0" -type "doubleArray" 1 0.041666666666666664 ;
    setAttr ".ag0" -type "doubleArray" 1 0 ;
    setAttr ".irbx" -type "string" "";
    setAttr ".irax" -type "string" "";
    setAttr ".icx" -type "string" "";
    setAttr ".cts" 1;
    setAttr ".lifespanPP0" -type "doubleArray" 1 3.4028234663852886e+038 ;
    setAttr -k on ".lifespan" 1;



これを見ると、自分がsetAttrのスクリプトを使って設定したのと同じ結果になっているということがわかる。

ようするにInitalStateを使うということはsetAttrでちゃんと初期値を設定しているということであった。
各アトリビュートを設定する必要は無かったと言うことだ。
InitialStateを使うとキャッシュのように別ファイルとして保存されるというのは全くの思い違いで幻想であった。


メニューからInitalStateをクリックすると「saveInitialState」コマンドが実行され、
SaveInitialStateはアトリビュートの設定きちんと上書き保存している。
そしてファイルにはきちんと記述として残る。


------------
これで一度、パーティクルをシーンに作成、追加する方法の基本は終わりとします。
パーティクルを増やすにはEmitterで行うのが一般的ですが、それはまたいろいろなテクがあるし、そればっかりやってもつまらないので、それらは適宜必要なときにやってみることにします。

あと以下にこれまでの「パーティクル101」へのリンクと
今回使用したアスキーファイルの画像ファイルを添付しておきます。
 この「パーティクル101」シリーズは、自分が充分に知っていることを初心者にわかりやすく書いた物ではありません。
自分が知らないことが多すぎるので初心者に立ち戻り、知っていること知らないことを明確にしながら知らないところがわかるように、調べ、それで「わかったこと」、「調査過程」を他の人にも(できるだけ)わかりやすいようにまとめただけです。

---------------
これまでの「パーティクル101」シリーズ 
その1:パーティクルの作成
その2:アスキーファイルの分析
その3:saveInitialState無しで追加したパーティクルを保存する(1)


 今回使用したアスキーファイルからの抜粋。
  (a)ゼロ




(b)1個(原点)
 



(c)1個(座標1,1,1)
 


(d)二個(原点と座標1,1,1の位置)

2012年2月29日水曜日

パーティクル101 その3:saveInitialState無しで追加したパーティクルを保存する(1)

<はじめに>
最初に結論を述べておきますと今回の、こころみは勘違いから始まっており、さほど実りある物ではありませんでした。(個人的には長年、気に掛かっていたところが明白になりすっきりしましたがw)



参考になるとすればアスキーファイルの分析手順。
setAttrコマンドでパーティクルのアトリビュートを設定する方法がわかるぐらいでしょうか。
(いずれも次回、説明します。)

「勘違い」というのは、
●パーティクルの初期設定はパーティクルキャッシュのように初期状態を別ファイルに保存しており、ファイルを開くときに読み込んでいる(と思っていた。実際はそうではない)
●そのためプロジェクト設定が間違っているとか、バグで読めないとかになるのは嫌だから確実にファイル内に設定を組み込みたい。
●そのため「saveInitialState」は使わない方法を見つけたい
というところです。

これはただの取り越し苦労であったことは次回にわかりますが、結論を先に言うと
saveInitialState」(メニューでは Solvers > Initial State )を実行した時点で
particleShapeアトリビュートに初期状態は組み込まれる」とうことです。








<Expressionを利用する方法>
 Expressionを使えばMelを毎回実行しなくとも、自動的に設定したスクリプトを実行してくれます。
 これで最初のフレームでパーティクルがEmitされるようにすればいいはずです。

でやってみました。
詳しいことは省略しますが、ParticleShapeのPerParticleAttributeからCreateExpressionを追加しました。
が一つ追加したいだけなのになぜか大量のパーティクルが生まれてしまったり、二度と生まれなかったりで挫折しました。

Twitterで@spx808さんにヘルプをお願いし、以下のアドバイスをいただきました。

「if (frame==2)emit -pos 0 0 0; とか。
パーティクルのシェイプノードに入れるとパーティクルの数だけ実行されてしまうので

単独のエクスプレッションにするといいと思います。」

まさにおっしゃる通りのことが起きていましたw
よく考えたらそうですね、PerParticleAttributeなのでパーティクル毎に発生します。


というわけで、アドバイスに従ってやりなおしました。
これまでのように「particle」コマンドでparticleShapeを作成し
メニューから windows > animation > Expression Editor で単独のエクスプレッションを作成。
(注:このプロジェクトの開始フレームは「1」です)

でも上記のままのエクスプレッションではエラーになります。
// Error: A particle object flag must be specified with the -object flag. //
// Error: An execution error occured in the expression expression1. //


どのパーティクルシェイプに追加すべきかという-object(-o)フラグが無いからです。
正解は
if (frame==2) emit -o particle1 -pos 0 0 0;
となります。

ところでこれだとパーティクルが出現するのはフレーム2からで、フレーム1では表示されません
例外は最初にこのエクスプレッションを「Create」もしくは「Edit」ボタンを押した時だけです。
タイムフレームを進めてフレーム1に戻って、再び再生してもフレーム1では表示されません。


その理由はヘルプ「エクスプレッションが実行される頻度」にあります。
「エクスプレッションは、アニメーション時間またはフレーム番号が変わるたびに実行されます。」

ようするにフレーム1ではエクスプレッションがまだ実行されていないのです。

そのためフレーム1では初期状態が表示されます
このケースでは、particleShape1の初期状態はパーティクル数ゼロです。
(初期状態が異なる場合はそれに応じた数のパーティクルが表示されます)

同じ理由で、「frame == 2」を「frame == 1」に変えてもフレーム1でパーティクルは表示されません。


※「frame == 1」でタイムラインをすすめてもパーティクルは表示されません。
最初にエクスプレッションが実行される時(フレーム1から2へ進むとき)は、フレーム数は「2」になっており、それ以降も同様に「frame == 1」の条件が成り立つ機会がないからです。
このような場合は、「frame >1」にすれば条件が一致するようになりパーティクルが表示されます。


この方法を利用すれば、初期フレーム以外の好きなタイミングでパーティクルを出現させることが出来ます。
例:フレーム15でパーティクルを追加する。
if (frame==15) emit -o particle1 -pos 0 0 0;

2012年2月27日月曜日

パーティクル101 その2:アスキーファイルの分析

前回「パーティクル101 その1:パーティクルの作成」では、
コマンドでパーティクルを作成、追加する方法を試しましたが、今回は
実際にはMayaのファイルでどのような形になっているのかを調べてみました。
これにより、各コマンドがどのようなことを行っているのかが、わかると思います。

前回やったのは以下の通りです。
1)「particle」コマンドでパーティクルをparticleShapeに作成
2)「emit」コマンドparticleShapeにパーティクルを後から追加
3)「saveInitialState」コマンドで追加したパーティクルを維持


パーティクルの作成にはステップ1、既存のparticleShapeに追加するにはステップ2と3を行う必要があります。


<「particle」コマンドで何が実行されているのか?>
まず「particle」コマンドで何が行われているのかを確認してみます。
以上のステップで何が行われているのかをアスキーファイルで確認します。
1)新規ファイルを.ma(アスキー形式)で保存(例:empty.ma)
2)新規ファイルにparticleコマンドを実行して.ma形式で保存

(particle; だけで-posフラグはつかいません)

これをテキスト・エディタで開いて内容を比較します。(例:particle.ma)
※ windowだと右クリックにて編集をックリックすれば「ワードパッド」で開けます。
「メモ帳」だと改行されないので見づらくなります。
ワードパッドである必要はありませんが改行をサポートしたテキストエディタが便利でしょう。


<最初のファイル:何も作成しない空のファイル>
まず最初のファイルを
最初にfileinfoなどが並び後に
「createNode」コマンド、「setAttr」コマンドが並んでいます。

たとえば最初のcreateNodeはこのようになっています。
createNode transform -s -n "persp";
これは「persp」カメラのtransformノードを作成するものです。
ためしに「persp」を「persp1」に変えて実行し
outlinerでDisplay > Shapesをonにして確認すれば
createNode transform -s -n "persp1";
「persp1」というtransformノードが作成されるのがわかると思います。
(※カメラは作成されません)
(※ちなみに「persp」のままで上記コマンドを実行すると前の「persp」ノードが上書きされるようです)


このcreateNodeの後にはsetAttrコマンドがいくつか続き、このtransformノードのアトリビュートを設定しています。

さて次のcreateNodeコマンドを見てみます。
createNode camera -s -n "perspShape" -p "persp";
これにより「perspShape」というカメラが「persp」trasnformノード内に作成されます。
今回は二つのコマンドを実行してみます。
まず「persp」を「persp1」にして実行
createNode camera -s -n "perspShape" -p "persp1";
これで「persp1」内に「perspShape」というカメラShapeノードが作成されることがわかります。

次に「perspShape」を「perspShape1」に変えて実行
createNode camera -s -n "perspShape1" -p "persp1";
これで「persp1」内に「perspShape1」というカメラShapeノードが追加されます。

続く「setAttr」コマンドはこのShapeノードのアトリビュート設定です。



以上から通常何かを作成する(Create)コマンドを実行すると
●transformノードの作成
●そのtransformノード内にShapeノードを作成

という順に二つのcreateNodeコマンドが実行されてることがわかると思います。
(例外もあるかもしれませんが、パーティクルやロケータ-などでは少なくともそのようです)

継続してファイルを見ていくと以下、top、 front、 sideとカメラの作成が続いています。
mayaがファイルを開く度にこれらのコマンドが順次実行されてそれらのカメラが作成されているのです。



<2つ目のファイル:Particleコマンドを実行しただけのファイル>
さて2つ目のファイルを開き1つ目のファイルとの違いを確認します。
とりあえず目につくのは
createNode transform -n "particle1";
createNode particle -n "particleShape1" -p "particle1";

の二行で、以下はparticleShape1のアトリビュートを設定する「setAttr」が続く事がわかります。

「particle」コマンドを実行すると言うことは、
この二つの「createNode」コマンドと、一連の「setAttr」が実行されることであると言うことがわかります。



<Emitコマンドで何が実行されているのか?>
ではシーンにEmitコマンドで、1つだけパーティクルを追加したときにアスキーファイルがどう変化するのかしらべてみます。
まず新規にシーンを作成し以下を実行します
particle;
emit -o particle1 -pos 0 0 0;


これで原点に一つのパーティクルが作成されます。
Initial Stateを実行せずに、このままアスキー形式で3つ目のファイルとして保存します。

.maファイルをテキストエディタで開き、「setAttr」の部分を比較してみます。
先ほどの2つ目のファイルとまったく変わらないことがわかります。
これをMayaで開き直すと、表示されるパーティクルは無い事がわかります。

これが意味するところはEmitコマンドでは、シーン内にパーティクルは追加されるものの、
保存時には初期状態、すなわちパーティクルゼロの状態のままで保存していることがわかります。

おそらくMayaはファイル保存するときに初期状態を保存するということだと思われます。


なのでEmitコマンドでパーティクルを追加しても初期状態として保存しなければ、
その実行結果は残らないと言うことです。



<「saveInitialState」コマンドで何が実行されているのか?>
では新規シーンで以下を実行し、アスキー形式で4つ目のファイルとして保存します。
particle;
emit -o particle1 -pos 0 0 0;
saveInitialState particle1 ;


これにより、「setAttr」の部分が変わったことがわかると思います。
「saveInitialState」コマンドはこの「setAttr」の値を変えていると言い替えることも出来ると思います。
このファイルをMayaで開き直すと最初からパーティクルは1つだけ表示されます。


<結論>
以上の事からファイルには、以下のことが保存されていることがわかります。
●パーティクルのトランスフォームとシェイプ・ノード の作成
●各アトリビュートの設定
そして、
emitとsaveInitialStateは特に新たなコマンドとして、ファイルに保存されるのではなく、
●その結果だけがアトリビュートの設定として保存される。
ということがわかります。

追記:
最終的にファイルに保存されるコマンドとそうではないものがあるので、その辺りを使い分けるといろいろ便利かも知れない。

2012年2月25日土曜日

翻訳:Subsidize Me (私に助成金の支給を)

最近のハリウッド映画の製作は、諸外国の助成金をあてにして作られるというビジネスモデルに移行しつつありますが、その助成金はいったいどうつかわれているのか。
アーティスト側からは見えにくい制作者側からの裏話。
VFX Foundationのブログ「Occlude」からの記事です。
このVFX Foundation はアーティストでもありCGスーパーバイザーでもあるJoe Harkins 氏により運営されていると思われます。

 Joe氏は最近、大統領をはじめとした政府にむけて「各国のVFXへの助成金がアンフェアであり、それによりアメリカの仕事が無くなっている。VFX取引組織をつくるべきだ」という署名のサインを求めて話題になりました。(現在も署名は受付中)
嘆願書のページ
IMDBのページ:Joe Harkins


この助成金の話、助成金に助けられている国、そもそもハリウッド映画の仕事が舞い込んでくることがない国では、なんのことやらと思われるかも知れません。
アメリカだけの問題じゃないの?と思われるかも知れません。
 実際の所、今は対岸の火事で住んでいますが、将来的には映画制作、VFXの仕事の根幹に関わる問題かも知れません。

注:以下の翻訳は意訳であり、正確性には欠けるところがあります。
私の英語能力に限界があるので所々怪しいところがありますし、誤訳がある可能性もあることをご了承下さい。
(訂正:Feb/25/2012)


Subsidize Me (私に助成金の支給を)
(注:上記タイトルには原文の掲載されているOccludeへのリンクを張ってありますが現在アクセス不可になっているようです。
VFX Foundationのサイトにはアクセスできるようですがツイッターアカウントも消されています。
何が起きているのかわかりませんが、ここ数日で何らかのトラブルがあったのかも知れません。
復帰したときのためにリンクURLはそのままにしておきます。)




VFX Soldierのサイトに「VFXの助成金がどのようにスタジオにながれていくか」というおもしろい投稿があります。
これにスタジオ・サイドから見た私の意見を追加してみたいと思います。

実際に、そこに書かれている通りで、我々は助成金を得ていますが、違う面もあります。
そのお金はプロデューサーやスタジオには入りません。

では、どのようにそれが機能しているかを説明しましょう。

プロデューサーはある映画をスタジオに売る前に、それに関する取引、予算、時間配分、などをまとめます。
提案される予算は、スタジオからグリーンライト(Goサイン)をもらうための物で、それはスタジオにより上限が決められ(原文:which is capped by the studio)ます。
例えば、スタジオは「あなたが70億円で提案している巨大ロボットの映画ですが、50億円でなんとかなりませんか?」などと言ってきます。
プロデューサーはなんとか方法を見つけだすと、スタジオに戻り「50億でなんとかしましょう」と言います。
それでスタジオはその撮影と全てのシステムがOKであるとグリーンライトをつけます(Goサインを出します)。もちろんこれほど容易な事ではありませんが、概略はわかると思います。

ではプロデューサーはどうやってその映画制作を50億円で可能にしたのでしょうか?

そこが各政府による助成制度が関係してくるところです。

この巨大ロボット映画は60億円では作れないでしょう、当然50億円じゃ不可能です。
でも25%の助成金があれば、そのプロデューサーはその映画を作るのに70億円を使えるようになるのです。なぜなら最終的にはそのお金がスタジオに戻ってくるからです。

スタジオの支払いは彼らが最初に望んだ通り、正味50億円にとどまっています。
70億の危険は減り、リスクも減ります。

20億はどこへ行ったのでしょうか?
それは実際のところ、その映画に関連する全ての人達、労働者、土地、アーティストの懐へ入ったのです。
その助成金が適用された場所で費やされたのです。
該当地域の収入となり、普段は何もないところに映画の仕事ができ、人々が生活できるようになるのです。

では政府は、ここからどのような利益を得るのでしょうか?
政府は通常、これを「税金控除」という形態で行い、現地の企業は通常よりも少ない税金ですむのです。
これが意味するところはその25%の助成金は、税収入に換算して交付する政府の懐から来ています。
州自体は実際にお金を費やしているのではなく、消費を少なくしているのです。
もちろんこれは別の方法で経済に影響します、公共サービスに必要なお金を減らしたりそれと似たような事です。
最終的には、その経済地域でより多くのお金が費やされ、より多くの税金が支払われ、それゆえに短期でプラスの経済効果が得られるのです。


VFX業界においても変わりありません。
助成金をうける資格をもつ現地のVFXスタジオにお金は流れます、それはそのVFXスタジオが全額受け取る事を意味します。
もしスタジオが$7.50を費やすとしても、25%の払い戻しを受けます。

VFXスタジオは$10分の作業に$10を支払ってもらう事が出来ます。
VFXスタジオは$8や$9分の仕事に$10を払ってもらうのが理想的ですが、これは現在の入札モデルでは起こりえません。
会社は仕事を得る為により安い値をつけ、いくつかのケースでは仕事を得続ける為に損失を受け入れる事もあるほどです。

さて助成金は悪い事でしょうか?
もしあなたが継続的な仕事を望むルイジアナのカメラオペレーターなら違うでしょう、しかしあなたがロサンゼルスのカメラオペレーターならどうなるのでしょう?

荷物をまとめて引っ越しをする....助成金があるところへ移り続けるのがあなたの新しいライフスタイルです。

これはもし助成金が適用される場所が、低賃金でそれに従いあなたの給料が下がるということがなければさほど問題ではないでしょう。
そうなんです、引っ越ししてどこかで1年ほど仕事をし、前よりも少ない給料を受け取るのです。
しかしあなたは雇用され、そこで生活できるのです。

でも、それが終わったらあなたは次の仕事を見つけなくてはなりません。

次の仕事で、「最後の仕事でいくらもらっていたか」を聞かれたらどうしますか? なかなか悩むところです。

いくつかの場所での労働法は、カリフォルニアに居る時ほどにはよくないということを言うつもりはありません。
確実なのは助成金はスタジオへ行くという事です、しかしそれが疲弊した人々のところへ行くというわけでもありません。
スタジオは70億円の巨大ロボット映画を50億ドルで作れる、ただそれだけです。

1年後、別の巨大ロボット映画のプロデューサーが、隣のスタジオに彼のアイデアを売り込みにいったとします....。

スタジオ:「なるほど。でもちょっと待ってください。それに70億ドル出す訳には行きません。通りの向かい側にいる男は巨大ロボットアクション映画を50億ドルで作りましたからね。我々は45億ドルしか出せませんね。」

プロデューサー:「大丈夫、我々はモントリオールで作成しますから」

スタジオ:「すばらしい!決まりです!」


ーーーーーーーー
VFX SOLDIERからの追加コメント部分
ここに欠けている大きな点はVFXの施設もまた「引っ越し」しなくては行けないという点です。
そしてスタジオのヘッドを雇い、リクルートし、設備を借り、コンピュータを購入しなくてはなりません。
引っ越しを打診されるVFXアーティストとスーパーバイザーは引っ越し、ホテル代、渡航費用、税金などのコストをカバーするだけの昇給を求めます。
グリーン・ランタンはおそらくすべてニューメキシコで作られた用にみえますが、
その仕事はカルバーシティーで仕上げられ、WBは25%の助成金をえるために、そのプロジェクトに9億円を余分に支払わなくてはなりませんでした。

2012年2月24日金曜日

パーティクル101 その1:パーティクルの作成

パーティクル101の「101」は入門者向けであることを示しています。
詳しくはWikiの説明を読んでみて下さい。
Wikipedia:
「アメリカ合衆国の大学では、101は基礎あるいは入門科目の番号になっていることがある。転じて、あるものが入門者向けであることを示す。この用法はアメリカ合衆国以外では一般的でない。」

最近は転職のために、Houdiniの勉強を中心にしているのですが、MayaのParticleを仕事で使う機会も増え、またTwitterで経験者の話を聞いてみるとMayaのParticleをMelで操作するのは基礎を習うには良いとのアドバイスもあったので、少しづつやってみようかと思いました。

この「パーティクル101」はそうした中でわかったことなどを記録していくシリーズです。
(どこまで継続するかは不明です)

基本的にはパーティクルを数値と計算で操作する(ようするにエクスプレッション)部分をメインに学習することをかんがえています。


<パーティクルの作成>
パーティクルの操作においてはまずパーティクルをシーン内に持つ必要があります。
コントロールするためにはその対象がないとなにもできません。

メニューからやると簡単なんですが、それではMelの勉強にならないのでMelだけでやってみます。
またEmitterを使うと簡単に大量発生させられますが、
自分の意図で厳格に個数と位置を決めてパーティクルを発生させる方法をまずとります。
目指すは完全なコントロールです。



まずスクリプト・エディターで以下のように入力してEnterを押し実行します。
particle;

Particle1(トランスフォーム)ノードとparticleShape1ノードが作成されます。
particleShape1ノードのGeneral Control Attributesを開くと
Count: 0
すなわちパーティクルの数はゼロであることがわかります。
ParticleShapeノードはあれど実際のパーティクルはゼロです。


Particleのノードだけでなくシーン内に実際のパーティクルを作るには、Emitterと接続するかその位置を指定する必要があります。

位置を指定するには-positionフラグを使います。(短縮形 -p)
使い方は下記のようにxyzの座標値をスペースをはさんで指定してやります。
-p x y z
例1)-p 0 0 0
例2)-p 1 1 1

では原点からY軸方向へ1つ移動した位置へパーティクルを一つ作ってみます。
particle -p 0 1 0;

これにより図のようにパーティクルが作成されます。




先ほどのようにParticleShapeノードのGeneral Control Attributesを見ると
Count: 1となり
パーティクルが一つ作成されたことがわかります。

複数のパーティクルを作成するには、それぞれのポイントを指定してやります。
particle -p 0 1 0 -p 1 1 0;

この辺りの詳しいことはHP:Digital Matrixの「Particle」に書かれています。


ではこれを応用して複数のパーティクルをX軸上に並べるスクリプトを作ってみます。

原点0 0 0 から初めて1づつX軸上のプラス方向へずらして配置します。
0 0 0
1 0 0
2 0 0

・・・・
という具合です。


まずはDigital Matrix の説明を参考にやってみましょう。

このやり方は基本はループ処理で、particleコマンドの -pにいれる座標値を作ってやるものです。

{
int $i;
float $x, $y, $z;
string $points ="";

    for ($i =0; $i < 3; $i++)
    {
        $x =$i;
        $y=0;
        $z=0;
        $points =$points + "-p" + " "+ $x + " " + $y + " " + $z +" " ;
    }
print $points;
eval ("particle" + $points);
}

print コマンドでスクリプトエディターに$points変数の値が表示され
-p 0 0 0 -p 1 0 0 -p 2 0 0
画面には3つのパーティクルが表示されます。




<後からパーティクルを追加するには>
 今回はparticleコマンドでパーティクルを作り、将来的にはそれにインスタンサーをつけたりその場で回転させたり、別々に移動したりと言うことを考えています。
その為にはパーティクルID毎に別々の制御をすることを考えていますが、場合によってはパーティクル数が足りないことに途中で気がつくかも知れません。
particleコマンドでは、パーティクルの数は最初から決めておく必要があり、後から追加するわけにはいきません。
パーティクル数を増やした、particleコマンドをもう一度実行すると、 新しparticleShapeが作成され、追加されることはありません。

パーティクルを追加するには、emitコマンドを使います
オンラインヘルプ:emitコマンド


まず新しいシーンファイルで以下のようにテストしてみます。   
1)以下のコマンドを実行してParticleShapeノードを作成
particle;
ここではパーティクルの数はゼロです。

2)以下のコマンドを実行します。
emit -o particle1 -pos 0 0 0;
これでパーティクルが一つ作成されました。
先ほどのようにParticleShapeノードのGeneral Control Attributesを見ると
Count: 1
となっています。


3)しかしこの方法には実は落とし穴があります。
emitコマンドは実行されるとパーティクルを発生させます。
しかしアニメーションが再生された後、初期フレームに戻ったとき、それはparticleShape1の初期状態に戻ります。すなわちここではパーティクル数ゼロになります。




<後から追加したパーティクルを保持する>
emitコマンドで追加したパーティクルを初期状態で保存しておくにはDynamicsメニューから
solver > InitialStates
でパーティクルの初期状態を保存します。

同じ事を実行するコマンドは以下の通りです。
saveInitialState particle1 ;

初期状態を解除するには、以下を利用する事が出来ます。
clearParticleStartState particle1;
(ただしこれはすべてにおいて、パーティクル数をゼロにします。)

情報元



では初期状態を保存するコマンドを組み込んだMelを作ってみます。

すでにparticleShapeは作られているという前提なので、先に
particle;
を使いparticleShape1を作った後に以下を実行します。


{
int $i;
float $x, $y, $z;
string $points ="";

    for ($i =0; $i < 3; $i++)
    {
        $x =$i;
        $y=0;
        $z=0;
        $points = "-pos" + " "+ $x + " " + $y + " " + $z +" " ;
        print $points;
        eval ("emit" + "-o particle1" +  $points);
    }
saveInitialState particle1;
}

メモ: バウハウスの「トリアディック・バレエ」

バウハウスのオスカーシュレンマーにより創作された「トリアディック(トリアディッシュ)バレエ (Das Triadische Ballett)」
 



トリアディック・バレエ(現代美術用語辞典)
「トリアディック(triadisch)とは、3という数字を重要視するシュレンマーがダンスの創作原理として用いた、さまざまな三つ組の総称である。
形と色彩と空間の一体、
三次元(高さ・奥行・幅)の一体、
球・立方体・円錐の一体、
赤・青・黄の一体、
ダンス、衣装、音楽の一体などをさす。

作品は三部構成で、
第一部はイエローの舞台におどけた道化芝居、
第二部はピンクのたれ幕を用いた荘厳で祝祭的な舞台、
第三部は黒い空間に神秘的で幻想的な舞台であり、
構成がクラシックバレエに類似していると評された」



トリアディック・バレエ(関心空間)
「トリアディック・バレエのトリアディックという言葉は、もともとギリシャ語で「3つ巴」を表す言葉で、シュレンマーはこの「3」という数字を特別に考えていたようです。「3」を基準として、展開するダンスーー形と色彩と空間・ダンスと衣装と音楽の三位一体ーーというのが、トリアディック・バレエの基本で、その論理の上に表現が重なって、この作品が生まれたのだと思います。」


今見るとまぁ、奇妙な衣装を着た退屈な踊りにしか見えないかもしれませんが今から約90年前(大正時代)に公演されたことを想像するとちょっとおもしろく感じられるかも知れません。

うまれて初めて、その一部を垣間見れたのはSONYのビデオテープのCMでした。
※SonyのCMは削除されたらしいので、新たに別の動画を追加しました。

以後ときどき思い出してはネット上に転がっていないか探していたが、数年前に探したときもほとんど無かった。(以前のブログ記事「トリアディック・バレエ」)
しかし徐々に知名度があがりネットが普及するにつれ今では数多くの動画を見つけることができるようになったので記録としてまとめておきたいと思います。
バレーの初演は1922年なのでカラー映像のものは復元公演と言うことになると思うのだが。
(実際には1916年に2原色のカラーフィルムが開発され、1932年に3原色が開発され、普及したのは1935年)


第一部:Amarillo (1970年)



第二部:Rosa (1970年)


第三部:Negro


BAUHAUS - Triadisches Ballett / Triadic Ballet
これは上記と同じソースのようですが、オスカーシュレンマーの簡単な説明の後に3部を続けてみせています。
画質は上記の物より劣ります。



Das Triadische Ballet, 1989
こちらは1989年公演のもの。
キャラクターの造形も雰囲気も1970年のものと異なっていますね。
特にそこまで厳格に決められている物でもないのか、それともこれは独自の演出にかえたものなのか?
(多分、後者でしょう)


これは第三部の一部分
白黒っぽいですが色もありますね。
ただ解像度が低いだけなのか、それともかなりかなり昔の映像なのかは判断不可



当時なぜSONYのビデオテープのCMにつかわれていたかよくわかります。
三原色の三位一体を表現したトリアディック・バレエは主題としてピッタリだったわけですね。
後はまぁダンスがくるくる回っててテープの回転みたいってのもあるようですがw
たしかこのCMには、別バージョンがあったような気がするのですが、見つけられなかった。



トリアディック・バレエはシュレンマーの代表作ではあるが、他にも様々なダンスを創作している。
『空間の踊り』
『金属の踊り』Tanz in Metall、
『形態の踊り』Formentanz、
『書割りの踊り』Kulissentanz、
『身振りの踊り』Gestentanz、
『棒の踊り』Stäbetanz、
『積み木遊び』Baukastenspiel、
『輪の踊り』Reifentänze、
『婦人の踊り』Frauentanz、
『仮面のコーラス』Maskenchor
など
(参照元:舞台空間と身体の編成への序説 柴田 隆子氏)


それらの一部は以下のサイトで動画をいくつか見ることができる。
BAUHAUS DANCES





『身振りの踊り』(Gestures Dance)





その他リンク:
Mechanische balletten
音楽CD情報「オスカー・シュレンマーによるバレエ『トリアディック・バレエ』のための音楽
Google画像検索「Triadisches Ballett



2012年2月23日木曜日

「三宅裕司のえびぞり巨匠天国」で印象に残った作品

三宅裕司のえびぞり巨匠天国

当時、番組で見た作品で衝撃を受けた作品のいくつかを見つけたのでまとめ。

当時はビデオカメラも家庭に普及していた頃だが、まだまだ高価で10万以上はしたと思う。
そして編集機器はまだまだ一般的ではなくせいぜい二台のビデオデッキでダビングしながら編集するという方法しかない。
ビデオでの合成はむずかしいので、こういった自主制作映像の合成では、まだまだ8mmカメラが使われて居た時代である。
この番組でもビデオの映像、8mmの映像が混在していた。


PULSAR


自分は見たことないが、その後ロボットパルタという番組をつくられたらしい。
すでにパルタっぽいロボットが使われているw

以下にPULSARの作家、保田 克史氏の作品が見れるリンクあり。
平成10年度[第2回]文化庁メディア芸術祭 受賞作品 「快動力 REAL」



POWER

制作にはコピー機を使ったとのことだが。
おそらく8mmで撮影した物を紙焼きし、それをさらにコピー機に掛け、コピー機の拡大縮小機能をつかって自在なズームを表現していると思われる。
(当時のコピー機はすでに拡大縮小は自由自在だった)



PAPER

これはアニメーションもすごいが発想がすごい。
上記POWERと同じ方

フルバージョン



こちらは同じ作者の1995年の作品。
NY大学のGreyアートギャラリーのページで、Papersという作品が公開されている。
全9分の作品のうち22秒だけだがこのページの画像をクリックすると見ることが出来る。


その後もいろいろ活動は続けられているようです。
desktop


The Books



これはえび天とは関係ないがYoutubeで見つけた動画。
上記のPAPERと同じ音楽(Differencia:坂本龍一)で作ったイメージ映像。






(Feb25/2012更新)

メモ:ピカソから7つの助言

元: DDN Japan

1. 必ずできると信じろ
「思いついたことは出来る。思いつかないものは出来ない。これは避けがたく、明白なことだ。」


2. 限界を超えろ
「私はいつも自分の出来ないことをする。どうやればいいのかわかるからだ。」


3. 「その時」を待つな
「インスピレーションは常に存在する。見つけに行くんだ。」


4. 動け
「明日に引き伸ばせば、それは死んでしまう。」
「行動がすべての成功の鍵だ。」


5. 正しく問え
「他の人間はなぜそうなったかを問う。私はいつも何ができるのか、なぜできないのかを問う。」


6. ジャッジせず、隠された美を見ろ
「我々は脳をブン投げて、ただ目だけで見ることができればいいのだが。」


7. 遅すぎるなんてことはない。
「若さと年齢は無関係。」

2012年1月19日木曜日

オブジェクト位置をパーティクルのポジションから取得する

条件:particle1、pCube1がシーンに存在すること。

以下の内容を実行するか、エクスプレッションとして入力する。
(エクスプレッションにすればアニメーションの進行に合わせてオブジェクト位置も移動する)


{
float $particlePosition[] = `xform -q -t -a -ws particle1.pt[0]`;
setAttr "pCube1.translateX" $particlePosition[0];
setAttr "pCube1.translateY" $particlePosition[1];
setAttr "pCube1.translateZ" $particlePosition[2];
}

※上記のスクリプトではパーティクルIDが「0」のケース