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

2010年10月29日金曜日

入門用プログラミング言語 2

以前このブログの「入門用プログラミング言語」(2010年6月6日)でいろいろな入門言語を紹介したがいくつか新しい物を見つけたので追加しておきたい。


-------------
プログラミン
-------------

プログラミン
「プログラミン」は、プログラムを通じて、 子どもたちに創ることの楽しさと、 方法論を提供することを目的とした、ウェブサイトです。(「プログラミンについて」より)

文部科学省が子供でもプログラミングの基本概念を理解できるように、作ったWebベースのソフトウエア。
以前紹介したScrachに似た感じだがもっと単純化されているように見える。

 


参照リンク
サイト:プログラミン作品ギャラリー
サイト:子どもだけにはもったいない!? ブラウザでカンタンにプログラミングできる『プログラミン』
サイト:今なら間に合う!?「プログラミン」で夏休みの自由研究
ブログ:SUGIMOTO Tatsuo 「プログラミン


-------------
MS Small Basic
-------------
マイクロソフトが公開しているBasic言語
Kidsコーナーにあるところからも子供でも理解出来るように単純化されていることがわかる。

以前Basicに触れたことがあるので、ひょっとしたら取っつきやすいかも知れない。
入門用といえどもゲームが作れたり、いろいろとできる事は多いようだ。


参照リンク
サイト:超簡単「Small Basic」でプログラミングを始めよう! 
サイト:日本語化担当者が語るSmall Basic活用術
サイト:超簡単プログラミング「MS Small Basic」が正式版で無料公開、サンデープログラミングにどうですか?


-------------
Kojo
-------------
 Scalaという言語を学ぶために作られており、Turtleグラフィックスを標準装備する入門言語
 残念ながら資料は英語のみ。



参照リンク
サイト:Scala言語を学ぶやさしいツール「Kojo」が無償公開

メモ:プログラムの基本,変数/関数/スコープを押さえよう (IT pro)

IT pro
第6回プログラムの基本,変数/関数/スコープを押さえよう
黒板の例がわかりやすい。
変数を「箱」ではなく、関連付けた情報のみだしのように説明しているのは好感がもてる。

第7回 関数の便利な仕組み,「引数」と「戻り値」を理解する

2010年10月28日木曜日

迷路作成を簡単にするためのMelスクリプト


仕事で迷路を作ることになったのですが、ちょうど良い機会と思いMelで作ってみることにしました。
といっても迷路を自動生成するアルゴリズムなど実装できる実力はないので、迷路を作る作業を助けてくれるヘルパーです。
(機能)
●支柱と壁を自動作成
●壁をランダムに配置。
●壁を全体に配置する機能
●後から自由に壁を付け足せる。

(入力値)
●高さ
●壁の幅
●迷路全体のサイズ(柱の数で指定)
●壁をX方向のみ配置
●壁をXとZ方向に配置
●上記においてランダムのモードが選択できる。
(制限)
●壁の厚みは入力不可。
●グリッド数で迷路のサイズを指定不可。

(説明)
[Place Pillars]というボタンをクリックすると指定したサイズ、方法で自動的に柱と壁を配置します。
壁がほしいところへ追加するには、柱を選択(複数選択可)し、[-Zwall (North)] [+Zwall (South)][-Xwall (left)][+Xwall (right)]のいずれかをクリックします。



結果的には一日かけてもまだエラーがあり、自宅作業で朝4時半までかけて完成させました。
結論から言うと、ここまで時間をかけただけの意味があるのかというと、個人的にはいろいろと学べましたが、企業的にはほとんどないかもしれません。
ただ、これから先迷路が変更になった場合は、簡単に作成できるという潜在的メリットはあります。
(今回勉強になったこと)
いろいろと新しいことを勉強しました。
1)move コマンドでpivotを移動する方法

2)同(move)コマンドの中で変数と文字列を組み合わせるために( )を使う方法
例) move 0 -2.5 0 ($wall[0]+".scalePivot") ($wall[0]+".rotatePivot") ;

3)If文で二つ以上の条件式を論理演算する方法

4)四捨五入のやり方(ランダムに1か0の値を得る為に使用、0.5を加算するのがポイント)
 $rand = floor(rand(0,1)+0.5);

5)$distが8のとき、float $wAdjust = ($dist+1)/2 では4になってしまう、これを補正するにはいくつかの方法がある。自分で思いついたのは、float $wAdjust = ($dist+1)*0.5;
Twitterで質問した所いくつかの方法があることを教えて頂いた。
(助けてくださった方々、大変ありがとうございました。)
質問用につくったのが float $int =(8+1)/2; という混乱を招きやすい奇妙な変数名を使っていた。
 そのためここでは変数名は$numと変更させて頂き紹介します。
基本的には右辺では整数計算がされ、代入時に浮動小数点になるらしく、Pythonなど他の言語でも同様のことが起きるということらしい。解決するには以下のようにする。
  float $num =(8+1)/2.0;
float $num =(8.0+1)/2;
  float $num =(float)(8+1)/2;
  float $num =float(8+1)/2;
 float $num =(8+1)/float(2);
このいずれかの方法で4.5が返ってくる。 ちなみにfloat()もしくは(float)を使う方法を「型キャスト」と呼ぶらしく、元々C言語で使われていた物らしい。

6)Xformでベクトル値から値を使うには
xform -ws -t $position.x $position.y $position.z -2.5; ではエラーになる。
xform -ws -t ($position.x) ($position.y) ($position.z -2.5); としなくてはいけない。

7)ラジオボタンを使ってみた。すっかり忘れていたが-valueフラグはないので、どのボタンを選択しているかは、-selectを使用する。
int $wWall = `radioButtonGrp -q -select withWall`;
8)トグルボタンも使ってみた。こちらは-valueでOK

9)出来るだけグローバル変数を使わないようにするために、それぞれのプロシージャー内でコントロールからの値を取得するようにした。

他に、できた柱と壁をグループ化したかったのだが、グローバル変数を使う必要もあり、今回は省略した。

{
if(`window -exists mazeBuildingHelper`)
deleteUI mazeBuildingHelper;
window -title "Maze Buliding Helper" -widthHeight 500 700 mazeBuildingHelper;
columnLayout;
//set distance betweern pillars
text -label "Disntace between pillars. (ie: 4 :Pillar is placed at each 5 unit.)";
intFieldGrp -numberOfFields 1 -label "distance" -value1 4 -extraLabel "Unit" -enable1 true distanceNum;
//set hight of the wall.
text -label "Hight of the wall. ";
intFieldGrp -numberOfFields 1 -label "hight" -value1 5 -extraLabel "Unit" hightNum;
//size of the Maze
text -label "Entire size of the Maze. (Number of pillars) ";
intFieldGrp -numberOfFields 2 -label "sizeX (pillars)" -value1 10 -value2 10 -extraLabel "sizeZ (pillars)" sizeNum;
//wall with pillars.
radioButtonGrp -numberOfRadioButtons 3 -label1 "Pillars only" -label2 "Pillars + wallX" -label3 "Pillars +WallX,Z" -select 3 withWall ;
// checkBox -label "with Wall" -value false withWall;
checkBox -label "randomize" -value true randomize;
// button
button -label "Place Pillars" -command "placePillars";
// individual wall placement.
text -label "----------------------------------------------------";
text -label "place a wall for pillar";
button -label "-Zwall (north)" -command "zWall1" zBtn1;
button -label "+Zwall (south)" -command "zWall2" zBtn2;
text -label" ";
button -label "-Xwall (left)" -command "xWall1" xBtn1;
button -label "+Xwall (right)" -command "xWall2" xBtn2;
text -label " ";
showWindow mazeBuildingHelper;
global proc zWall1() {
$name =`ls -sl`;
int $size = `size($name)`;
for($k=0; $k<$size; $k++) {
int $dist =`intFieldGrp -q -value1 distanceNum`;
int $hight =`intFieldGrp -q -value1 hightNum`;
float $adjust =($dist+1)/2.0;
select $name[$k];
vector $position =`xform -q -ws -t`;
$wall = `polyCube -w $dist -h $hight -d 1 -n wall`;
move 0 -2.5 0 ($wall[0]+".scalePivot") ($wall[0]+".rotatePivot");
rotate -r -y 90;
xform -ws -t ($position.x) ($position.y) ($position.z -$adjust);
select -r $name;
};
}
global proc zWall2() {
$name =`ls -sl`;
int $size = `size($name)`;
for($k=0; $k<$size; $k++) {
int $dist =`intFieldGrp -q -value1 distanceNum`;
int $hight =`intFieldGrp -q -value1 hightNum`;
float $adjust =($dist+1)/2.0;
select $name[$k];
vector $position =`xform -q -ws -t` ;
$wall = `polyCube -w $dist -h $hight -d 1 -n wall`;
move 0 -2.5 0 ($wall[0]+".scalePivot") ($wall[0]+".rotatePivot");
rotate -r -y 90;
xform -ws -t ($position.x) ($position.y) ($position.z +$adjust);
select -r $name;
};
}
global proc xWall1() {
$name =`ls -sl`;
int $size = `size($name)`;
for($k=0; $k<$size; $k++) {
int $dist =`intFieldGrp -q -value1 distanceNum`;
int $hight =`intFieldGrp -q -value1 hightNum`;
float $adjust =($dist+1)/2.0;
select $name[$k];
vector $position =`xform -q -ws -t`;
$wall = `polyCube -w $dist -h $hight -d 1 -n wall`;
move 0 -2.5 0 ($wall[0]+".scalePivot") ($wall[0]+".rotatePivot");
xform -ws -t ($position.x-$adjust) ($position.y) ($position.z);
select -r $name;
};
}
global proc xWall2() {
$name =`ls -sl`;
int $size = `size($name)`;
for($k=0; $k<$size; $k++) {
int $dist =`intFieldGrp -q -value1 distanceNum`;
int $hight =`intFieldGrp -q -value1 hightNum`;
float $adjust =($dist+1)/2.0;
select $name[$k];
vector $position =`xform -q -ws -t`;
$wall = `polyCube -w $dist -h $hight -d 1 -n wall`;
move 0 -2.5 0 ($wall[0]+".scalePivot") ($wall[0]+".rotatePivot");
xform -ws -t ($position.x+$adjust) ($position.y) ($position.z);
select $name;
};
}
//-------global proc "generate maze"-----------
global proc placePillars() {
int $dist =`intFieldGrp -q -value1 distanceNum`;
int $hight =`intFieldGrp -q -value1 hightNum`;
int $sizeX = `intFieldGrp -q -value1 sizeNum`;
int $sizeZ = `intFieldGrp -q -value2 sizeNum`;
int $wWall = `radioButtonGrp -q -select withWall`;
int $randOn = `checkBox -q -v randomize`;
for ($j=0; $j<$sizeZ; $j++) {
float $placeZ = $j*($dist+1);
float $adjust =($dist+1)/2.0;
float $wallPlaceZ = $placeZ-$adjust;
for ($i=0; $i<$sizeX; $i++) {
float $placeX = $i*($dist+1);
float $wallPlaceX = $placeX+$adjust;
//create a Pillar
$pillar = `polyCube -w 1 -h $hight -d 1 -n pillar` ;
move 0 -2.5 0 ($pillar[0]+".scalePivot") ($pillar[0]+".rotatePivot") ;
move -x $placeX -y 2.5 -z $placeZ;
select -cl;
//create a wall_X
if ((($wWall == 2)&&($i <$sizeX-1))||(($wWall == 3)&&($i <$sizeX-1))) {
$rand = floor(rand(0,1)+0.5);
if (($randOn == true)&&($rand ==1)){
$wall = `polyCube -w $dist -h $hight -d 1 -n wall` ;
move 0 -2.5 0 ($wall[0]+".scalePivot") ($wall[0]+".rotatePivot") ;
move -x $wallPlaceX -y 2.5 -z $placeZ;
select -cl;
} else if ($randOn == false) {
$wall = `polyCube -w $dist -h $hight -d 1 -n wall` ;
move 0 -2.5 0 ($wall[0]+".scalePivot") ($wall[0]+".rotatePivot") ;
move -x $wallPlaceX -y 2.5 -z $placeZ;
select -cl;
};
}; //end "if" Wall_X
//create a wall_Z
if (($wWall == 3)&&($j > 0)) {
$rand = floor(rand(0,1)+0.5);
if (($randOn == true)&&($rand ==1)){
// $wallPlaceX= $wallPlaceX -$adjust;
$wall = `polyCube -w $dist -h $hight -d 1 -n wall` ;
move 0 -2.5 0 ($wall[0]+".scalePivot") ($wall[0]+".rotatePivot") ;
rotate -r -y 90;
move -x ($wallPlaceX-$adjust) -y 2.5 -z $wallPlaceZ;
select -cl;
} else if ($randOn == false) {
$wall2 = `polyCube -w $dist -h $hight -d 1 -n wall` ;
move 0 -2.5 0 ($wall2[0]+".scalePivot") ($wall2[0]+".rotatePivot") ;
rotate -r -y 90;
move -x ($wallPlaceX-$adjust) -y 2.5 -z $wallPlaceZ;
select -cl;
};
}; //end "if" Wall_Z
}; //end "for" loop PlaceX
}; //end "for" loop PlaceZ
} // end global proc placePillars()
}

2010年10月25日月曜日

エフェクト関連の知識習得に関する線引き (その2:補足)

先日「エフェクト関連の知識習得に関する線引き」というエントリを書いて、どの程度まで科学的理論や数学的な部分に深入りすべきかということについて、現時点での私の考えをまとめました。

そのエントリに関連して@Kei YoneokaさんよりTwitterで結構いいご意見をいただきました。
Keiさんは3dsMaxメインのエフェクトアーティストですが、いろいろなエフェクトのTipsやトライ&エラーをご自分のサイトでも公開されていて、以前から参考にさせてもらってます。

さて、今回そのTwitterでの意見によって、新たにみえてきた部分があり、その情報を盛り込んでおきたいと思い継続したエントリで残すことにしました。

こう書くと、なんかすごいことに気がついたかのように感じるかも知れませんが、ただ自分の管理能力のなさ、なまけぐせに気がついただけです。
すでにご存じで実践されている方はたくさんいらっしゃると思いますので、公開するのは恥ずかしいほどです。

-------------
まず@Kei Yoneokaさんご本人に確認をとりまして、ご厚意で、そのときのつぶやきを掲載する許可を頂きました。その内容をそのまま以下に掲載します。

その1
エフェクトは自分なりの考察持ってますがMelonさんほど深くないですね^^;自分もCGやってる人にエフェクトを勧めたいんですが、その理由の一つに「寝てても頑張れる数少ないジャンルの一つである。」ということがあります。これはどういうことかというと、、、

その2
とにかくエフェクトでシミュレーション系の物は非常に重くて、結果が出るのに数時間かかるということがあります。でもこれを待って結果が出たときは経験値が溜まるわけで、寝てる間にシミュレーションをかけておけば次の日には失敗するにしろ成功するにしろ何らかの学習をすることになります

その3
これを1年毎日続ければ365回、毎日は無理だとして2日に1回だとしても180回くらいのヘビーなトライアンドエラーができます。これだけやればシミュレーション系ソフトのパラメーターの意味などをほぼ大体を把握することができます。これを日々の業務に当てはめれば相当効果があがります。

その4
これが自分の言う「寝てても頑張れる」という意味です。これはアニメーターやモデラーみたいに手を動かしてなんぼみたいなジャンルではできないことですね。(重たいマテリアルやライティングを試すってことなら同じですか)というわけで、エフェクトは非常に時間を有効活用できると個人的には思います。

まず、「失敗するにしろ、成功するにしろ何らかの学習をする」というのははっとさせられました。
自分刃、うまくいかないシミュレーションは失敗としか考えない傾向があり、 そういうとらえ方をするとやっている作業の他大半は失敗と言うことになってしまい、非常に苦痛な作業になってくるんですね。
Keiさんのように捕らえることで同じ作業にも前向きに取り組めると思います。


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

さて、もうひとつが本題ですが、じつは前回のエントリ「エフェクト関連の知識習得に関する線引き」ではあえて結論を出すのを避けていた部分に、触れられたなと思いました。

それぞれのソフトには個別の癖がありますが、その故となる理論は共通することも多々あり、場合によっては数式まで同じ物をもとにしていることがあります。
しかしながら実際にプログラミングしてソフトウエアという形に実装していく段階で、理論をどうプログラムにするかというアルゴリズムの部分で個々の開発者の考えによる違いがでてきます。
これはシミュレーションを実際に作っているときに、ソフト毎にいろいろな違いを生み出します。


前回説明したように、裏にある科学的理論が理解出来ることでアトリビュート名の由来や働きを推測することはできるようになります。
しかし、すぐにそのソフトを使いこなせるようにはなりません。
あくまでソフトウエア習得のための下準備が出来たような物です。

具体的にどれぐらいの数値を入力すればよいのかとか、どのようなときにそのアトリビュートを使用すべきかということは以下の流れで習得するしかないと思います。

1)ヘルプを読む
2)繰り返しソフトを使う


そのソフトがどのような実装のされ方をしているのかがわかれば、これらを効率的にすることも可能でしょう。しかし実際にはそのアルゴリズムまで公開されているのはまれでしょうし、公開されても理解出来ないというのもあります。
これは本格的な理論や数式をさける自分のやり方の限界でもあります。


 さて、話を戻しますが、以上のように「繰り返しソフトを使う」というのは非常に重要で、ここでヘルプには書かれていない、ソフトの癖というか、特徴をつかむことになります。
これがうまくできなければ、なかなかおもうような結果が生み出せません。
結果的には使い物になるアーティストと、そうでないアーティストの分かれ道とも言えるでしょう。

この部分は、公開された情報が少なく、様々なチュートリアルやサイトによる情報でみんな四苦八苦して情報収集する部分でもあります。

実際にソフトの特徴をつかむまでには、値を変え、何度も繰り替えしシミュレーションをしなければわかりません。
しかし、この部分を合理化し、回数を出来るだけ少くすることで、ソフトの特徴をつかむまでの期間を短くすることができるということになります。


-------------
さて、自分がシミュレーション関連のソフトをどのように習得してきたかということをもう一度、分析してみました。

ステップ1)ヘルプをよみ、ツール、アトリビュートの機能を理解する。
ステップ2)コントロールしたい部分がどのツールを使い、どのアトリビュートを使用すればよいかの見当をつける
ステップ3)目的にあったものができるまで、ツールの設定、アトリビュート数値の変更などを繰り返します。


シミュレーションの作業でアーティストにとって、未知の部分があると暴れ馬のようになり、コントロールすることが難しくなります。
これをうまく自分のコントロール下に納めるには、「ステップ3」を繰り返すことしかありません。

しかしながら自分の場合は、仕事で、数多くのことを試して結果を作り出してきたにもかかわらず、ほとんどその記録をとっていませんでした。
体感的に覚えている部分はあるのですが、後にそれを生かすとなると何割かは忘れているため、また一部は四苦八苦することになり、時間の無駄に感じていた部分もあります。


いいわけをするならば、各プロジェクトで設定値が違いすぎるので、そのまま使うことはできないとか、記録する時間が無いとか、どのように記録すればよいかわからないということもありました。




-------------
そして上記の@Kei Yoneokaさんのつぶやき(その3)を読んでいてはっと気づかされました。
ヘビーなトライアンドエラーができます。これだけやればシミュレーション系ソフトのパラメーターの意味などをほぼ大体を把握することができます。

ようはこれまでの自分のやり方では、なんとか把握したものを失っては取り戻すことを繰り返しており、蓄積にはあまりなっていなかったのです。
実はこれは仕事においては致命的な間違いです。
どんな仕事でも、自分が行ってきたことの記録を取りそれを後で利用できるようにすることは通常の世界では当たり前のことです。
自分も前の仕事ではそうしていたはずが、ことCGということになるとすっぽり抜け落ちていたのです。


-------------
次に考えるべき事は具体的にどうすれば、そのソフトを把握できるまでの時間を短縮できるかということです。

シミュレーションするときには、パラメータ(アトリビュートの数値)を変えた物をいくつも実行して、目的に合うものができるまで続けます。

この際に
1)どのパラメータを
2)どの程度
 変更したかを記録し、
3)その結果
 がわかるようにしておけばよいということになります。

シミュレーションで苦労するのはどのパラメータをどれほどいじればいいのかを見抜くことです。
上記のテスト記録があれば、目的の効果を生み出すためのパラメータとその数値の見当がつけられます。
また不用意に同じ失敗を繰り返す事も防げます。
一つの人生で同じ試行錯誤を二度繰り返す必要がなくなります。

特定のパラメータにしぼって、比較のために数値を変えたいくつかのパターンを用意してやると良いでしょう。特に不要と思われるほどの数値でも、特徴をつかむためにわざとやってみる事も必要かも知れません。

実作業においては時間が無いため同時に複数のパラメータを勘でいじったりするので、実際にどのパラメーターがどのぐらいの影響を与えたのかは漠然としたままなんとか出来あがったということも少なくありませんでした。
そのため記録もしにくく、記録したとしても使いにくい情報になりがちともいえました。

アトリビュートをひとつかふたつ絞り、
変更もサンプル としてわかりやすい変化にする。
という事に気をつけて、シーンを作るためでなく、
そのアトリビュートやツールを理解するためのシミュレーションを実行し、記録することでこれはなしえるのではないかと思いました。

これによりヘルプファイルで読んだだけではわかりにくい特性を知ることが出来る。
そういえば、エフェクトアーティストの動画にはそんな感じで比較している動画を時々見ます。

ただ資料をきちんと残そうとすると、動画を作ったり、それを編集したり、アップロードしたりという時間が必要になります。これまた本末転倒となる可能性もあるので、そのあたりをどうするかという課題は残ります。
何らかのフォーマットを作る必要があるかも知れません。たぶんさほど難しい物ではないでしょう。

こういうことは、通常のエフェクトアーティストにとっては当たり前のことなのかも知れませんが、自分は、はずかしながら今までやっていませんでした。

これからはヘルプを読むときなどに、アトリビュートの理解を深めるにはこの方法を生かせたらと思っています。


-------------
最後に前回のエントリからの考えを見やすく(見ずらい?)図にしてみました。
あまり考えずに作ったのでなんか変な感じもしますが、とりあえず修正した方がよい箇所がかわるまでの暫定版です。


左欄は自然現象がコンピュータ内でシミュレーションにおきかわるまでのステップを関連知識をもとに階層に分けたものです。
下位の物が上位の物をささえています。
そのため上位のものは下位に依存して存在していると言えます。

ただし、これはあくまで概略であり、実際にはそれぞれ相互に複雑に絡み合っている部分があり、明確に分類するのは難しい面はあると思います。

右欄は左欄の項目を習得/理解するために必要な事です。
太字はその段階で重要性の高さを示しています。

色分けですが水色はエフェクトアーティストに必要となる部分を表しています。
肌色の部分は主にTDやプログラマーの分野です。


見てわかるとおり、私のやり方では「4.アルゴリズム」「5.数式」の部分が飛んじゃっています。
そこからも、最高の方法ではないと言うことはわかると思います。
私のやり方は、あくまで数式アレルギー、プログラミング知識ほぼゼロでもエフェクトアーティストとしてベストを尽くせるようにするために考えた物です。

前回まで述べてきたことは、「6.科学的、工学的理論」に属します。

チュートリアルなどで勉強することは、だいたい「」,「」の領域です。
Keiさんの述べていたことはこの領域に属すると思います。
これをしっかりとやることは、理論を固めるよりも、より早いスキルアップにつながると思います。
ただし理論を固めることはその力強いバックボーンになり、その力を乗算してくれると思います。


余談ですが「7.自然現象」に関しては、
●現実世界での現象の観察
●高速度撮影された動画の観察
●本:特殊効果アニメーションの世界、エレメンタルマジック
●そのほかの自然現象の観察について述べた物(Webなど)

などが役に立つのではないかと思っています。

2010年10月23日土曜日

Mel初心者向けの学習法

このブログの当初の目的はMelを主体としてスクリプトやプログラミング言語の学習の超初期段階でくじけてしまう原因(壁)を探り、その解決策を模索し、記録していくことにあった。


このブログももう数ヶ月で約2年となるのだが、その間に最初の壁は破れたように感じている。

しかしながらその壁が何だったのか、そして無駄なく効果的な解決策は何だったのかがはっきりしていなかったのでずっと気に掛かっていた。

それが今日、ふとひらめいた。
約二年目にしてやっと解決策がみえてきた。

まだ完全に壁が見えたわけではないのだが、しっぽがつかめたように思う。
これをベースに新しい方法が生み出せればと思う。

それをもとにした方法が生み出せれば、文系の超初心者にとってもしかしたら非常に助けになるかも知れない。
ただ、まだ方法論もおおざっぱで、実証もされていないので効果のほどは未知数です。
もしかしたら大失敗かも知れないし。

内容については、まだ多くは語れないのですが、

いままで文系の人がプログラミング(/Melスクリプト)を習得するのが苦手な理由は、
プログラミングが理系の内容だからだと思っていました。
実はそれは間違っていて、必要なのは○○○系の解決策かもしれないということです。

そのうち、これに関してアンケートを実施することを考えています。(いつになるかは未定)

2010年10月22日金曜日

忘れていたhelpコマンド

手軽にスクリプトエディターでヘルプが表示できる。

(例)
help getAttr
help xform

2010年10月21日木曜日

エフェクト関連の知識習得に関する線引き

昨日から「「流体」とは」というシリーズのエントリを書き始めていますが
これを書いている裏にある理由を説明します。

まぁいつも通り自分の勉強課程のメモでありますが、要するに発想の過程についても少し触れておくことで、何かもっとつかむ物があれば(もしくは不要な物を見つけることができれば)と思ったからです。
また、すべて自分で勝手に考えたことですので、理論に間違いがある可能性も考慮して読んでください。



-------------
現在ジェネラリストからエフェクト・スペシャリストへの転換をはかっているわけですが、どちらにしてもプロフェッショナルである以上、しっかりとした知識と経験に裏付けされた仕事をする必要があります。
CGで表現をする際に必要な事は、アート面と技術面がありますが、特にエフェクトはその程度は別としても、様々な機会に技術的理論に直面します。

ソフトの設定を表面だけ覚えたのでは限界がありますし、ソフトが変わると戸惑う事になります。
特に、こちらでは大手プロダクションに行くとクロス、ヘア、リジッドボディー系は独自のソフトやプラグインを使っていることが少なくありません。

またエフェクトをよりよいものにするには、ソフトを使いこなさなければソフトが作り出す偶然に頼った絵作りしかできなくなってしまいます。
ソフトを使いこなすには技術的知識が不可欠なのです。


-------------
中学数学から再度勉強し直し、物理学、力学、流体学などを学び、プログラミングまでのスキルを身につけることは、根本から自分の知識体制を構築することになり、完璧なプランだと思います。

反面、時間がかかり、必ずしもアーティストとして直接、必要となる知識ばかりとは限りません。
様々な科学的理論をシステム上に実装するようなことが目的でなければ、なおさらでしょう。

もちろん、そういったしっかりした裏付けがあると鬼に金棒でしょうが、ソフトで望むエフェクトが作りたいというだけの目的には少々Too Much感があります。
そのため、そのようなプランで初めても心に残る抵抗感は、焦りに変わり、いつのまにか辞めてしまうことになります。

また、もう若くはないので残された時間も少ないですから、のんびりやっているわけにもいきません。


-------------
さて、エフェクトをやる以上、技術的理論はさけて通れないのも事実。
どこまで勉強してどこをはしょるべきか、このあたりの線引きが、長年の悩みどころでした。

では 
どうすれば効果的な勉強ができるのか?
どんなことに重点を置いて勉強すればよいのか?
を自分なりに考えてみました。

まずCGと科学的、数学的な部分には以下のような関連性があります。

科学的理論(概念) ソフトに実装 ソフトの操作 <作品の完成>

どうしてこうなるかというと、
CG(のエフェクト)はすべて現実世界に起きることを研究して公式化し、それをコンピューター内で計算によって再現しているからです。


●科学的理論が数式と共に確立し
●それをプログラミング言語とアルゴリズムを使いソフト内でシミュレーションを可能にする
●そのソフトを使って作品を作る。

という流れになっており、それぞれに必要となる勉強は異なってきます。

いままで自分がやってきたのはスクリプトも含めて、最後の部分が主です。

(お断り)ここでは理論的なことに的を絞っており、「現象の観察」に関しては含めていません。
「現象の観察」は「科学的考察」と「作品作成」の両方で不可欠な基礎的な物ですが、今回は動きに関する理論的な面だけに的を絞っています。
従ってコンポジットのテクニックもここには含まれません。
またプログラミングもしくはスクリプトの知識がどの程度、影響を与えるかと言うことに関しても、あまり考慮に入れていません。


-------------
次にその科学的知識との深さについてそれぞれの段階を考えてみました。
裏付けはなく、まったくもって自分の思いつきであることはお断りしておきます。


レベル1)ソフトの操作方法、アトリビュートの設定などをある程度知っている。
→エフェクトのコントロールがある程度可能。 
(チュートリアルの受け売りやまる暗記で対応可。望みの物を作るには試行錯誤が長い)

レベル2)科学的理論を知っており、それがどのように使用するツールやアトリビュートに実装されているかを知っている。そのツールやトリビュートの限界がわかる。
(自分の意志で的確な判断が出来、的確にソフトを操作して望みの物が作れる。試行錯誤が短い)

レベル3)科学的理論、公式を理解しており、プログラムの知識を持っている
(それをプログラムとして実装可能)


より高度なレベル(レベル3)は、下位のレベルを包括していることがわかります。


-------------
Mayaでエフェクトを作っていて思うのは、「もう少し知識があったらな~」ということですが、上記のように分類すると、レベル2までの知識があれば、ある程度ソフトが使えるのではないかと思いました。

無理を言う監督やVFXスープ、プロデューサーの要望に素早く応えるには、ここまでのレベルであればよいのではないかと思います。

このレベル2においては以下の能力があれば良いのではないでしょうか。
A)科学的理論を理解していることで、ソフトのどこを操作すべきかの目安がつけられる。
(たとえばVelocityやDampingというなど)

B)ソフト(実装と操作系)を理解していることで、どの程度の値を追加すればよいかがわかる。
(たとえばDampingには0.99や0.98とかの値でよいとか)

C)ソフトのUIからでは操作できない部分をMelで操作する。
(ParticleExpressionなど、数学的裏付けが必要なスクリプティングは除外)


(余談ですが、MayaってすべてがUIから操作出来るようになっているわけではないんですよね~。中途半端というか職人的というか。)


-------------
ソフトを科学的裏付けにまでさかのぼり理解していれば、的確に操作でき、限界もわかるので出来ないことを試行錯誤するという無駄を回避出来るはずです。

そして重要なことは、このレベルにおいては「科学的裏付けを理解する」というのは必ずしも公式を理解するということとイコールではなくてもよいのではないかと思うのです。


そもそも「数学的公式も含め科学理論を100%理解しなくてはすばらしいエフェクトは作れない」というのは間違いとは言いませんが、一個人にあてはめて考えるのは的違いな感じがします。
それは組織でやることです。
そう考えると、するとそれはただの劣等感からきた考えかも知れません。

たしかに科学的理論を100%理解するには数学的公式を理解している必要があるのですが、微分、積分も、変換行列も理解出来ない自分にはハードルが高すぎます。

ここであきらめるわけにも行かないので、どの程度の理解が必要かをもう少し考えてみます。

●ソフトのどこを操作すべきかがわかる程度
●ヘルプに書かれていることが理解出来る程度
●いろいろなソフトでの共通点と違いがわかる程度


この程度でも、アプリの操作においてはスキルをかなりアップできるのではないかと期待しています。
要は、自分の現在の知識レベルに合わせて、不必要に深入りしないということです。

次に考えるべき事は「このレベルで必要な事は何か?」ということです。


-------------
勉強において最重要なのは、様々な単語、特に技術用語を自分なりに明確にすること。

これは科学的裏付けの説明を読んでいるときだけでなく、ヘルプを読むときにも大きな助けとなります。
表面的な知識にとどまり「理解した」と勘違いしていると後で混乱してきます。
それは結果的に、ソフトの操作の迷いもしくは何を操作したらよいか「わからない」という結果につながります。
これは技術用語に関係なく、単語全体に言えることです。
一つ一つは小さな物ですが、きちんとその文脈で使われている意味を理解していないと、全体の意味が把握できなくなってしまいます。

人間の持つ英知の断片は、数多くの単語にそれぞれ詰め込まれています。
言葉は、組み合わせることでさらに大きな知識を構築するブロックのような物です。
崩れたブロックで建物を建てない方がよいことは想像できます。

単語、専門用語の理解→科学的理論(概念)の理解
単語、専門用語の理解→ヘルプの理解


結果的にソフトの理解が深まり、操作能力も上がるというわけです。


何気なく、ソフトの機能やアトリビュートの名前を暗記し読み飛ばしていると、理解が表面的になり、暗記するべき事も増えてしまいます。
きちんと用語を理解していれば、Melを勉強したり、APIを理解するのにも助けになるでしょう。

何より、独自の発想と決断がうまれ暗記したチュートリアルの知識に頼る必要はなくなるかもしれません。

他のソフトと比較して実装のされ方の違い(ソフトの能力の違い)を知るのにも助けになります。


補足すると、単語だけを先に勉強して理論を勉強しろというわけではありません。
どちらも平行して起きてくるというか、理論を勉強しようとして、もしくはヘルプを読んでいてわからない用語にぶつかる。
そしてそこで調べるというのが普通だと思います。

また、一つの用語をあまりに難しく説明しているようなら(たとえばWikipediaの説明など)、もっと簡単に説明してあるHPなどを探すべきです。
そのあたりは柔軟にすべきで、辞書にたよらずとも理解出来ることはあります。
図や動画が理解の助けになることもあります。

最も重要な点は「自分が理解した」と言うことです。


鍵となるのは、理論も用語も「明確にすっきりと概念が理解出来る」まで、わかりやすい説明をさがすということです。


-------------
どのような科学的知識、理論から勉強していくべきか?

現時点ではまだそこまで考えていません。
もしかしたら、特にに順番を決める必要は無いかもしれません。

不思議とそういう専門知識がしっかりとするにしたがって数式への抵抗がなくなってくるので、将来、そいういうことを勉強するときの抵抗感は少なくなっているとは思います。
もしかしたら、最初から数学などを勉強するよりは近道になるかもしれません。

また、結果的にそういった用語の理解レベルに合わせて「エフェクト」という領域においての精神的自由度があがり、結果的にスキルに反映し、作品に反映してくるように思います。


-------------
今回は、エフェクトやるならフルイドは外せないよな~と考えていたときに「流体」を明確に理解していないことに気がついたことから調べてみようと思い立ちました。

その結果をまとめたものです。

決して「流体」について知っているから書いているのではなく、知らないから調べた。
そして、それをまとめただけです。

2010年10月20日水曜日

「流体」とは (その1)

エフェクトと切っても切り離せな物に「流体(フルイド)」がある。

狭義では「フルイド・シミュレーション」とそれを実現するためにソフトに実装された機能をさすが、「エフェクト」というとらえ方をするとその手段は問わず「流体」を指す。
要するにパーティクルで作っても、Clothを使っても、はたまたジオメトリにリグを仕込んだり、ブレンドシェイプ、テクスチャーアニメーションをしても結果的に「流体」を表現することであれば「エフェクト」という言葉の範疇においては「流体」ということになると思う。

エフェクトと関わるにおいて、この「流体」とは必ず関わることになってくるわけだが,その言葉の定義においては意外と曖昧であることがわかり、ここで明確にしておこうと思った。

さて、Wikipediaで「流体」をみると以下のように定義されている。
流体:静止状態においてせん断応力が発生しない連続体の総称である。


わかるようでわからない。そもそも「せん断応力」が理解出来ていない。


-------------
(「剪断」の定義)
-------------

せん断(剪断)」の、Wikipediaでの定義は以下のようなものがある。
せん断(せんだん、剪断、shear)とは、はさみなどを使って挟み切ること。


英語のShearは、
(髪を)切る、(羊の)毛を刈る、(ケーブルが)切れるというような意味があり。
複数形(Shears)で、大ばさみ、植木ばさみ、といった意味を持つ。
語源は古期英語の「切る」
。(参照:Excite辞書「Shear」


羊の毛を刈る作業を「Shear(単数形)」と呼び、それにつかわれるはさみは「Shears(複数形)」である。

ちなみに「ハサミ」を意味するもうひとつの英語「Scissors」の語源はラテン語の「切る道具」という意味である。 (参照:Weblio 「Scissors」

どちらもハサミ一丁を表すのに複数形を用いるのは興味深い。
おそらく二つの刃を一つの道具にまとめたところから来るのであろう。


日本語の「剪断」の「」の字は、中国語で「切る」を意味する言葉であり「ハサミ」は中国語で「剪刀」と書く。(参照:BitEx中国語「剪」


そのほかデジタル大辞泉の「剪断」の解説は以下のようになっている。
剪断:[名](スル) 1 断ち切ること。「綱を―する」

文字通り、「断ち切る」ことを意味している。
余談だが、興味深いのは、綱、ひも、毛、髪といった細長い物を切ることに使われている。


さて、先ほどのWikipediaの「剪断」の説明の続き。
工学においては英単語shearの訳語として、・・・
ここに書かれているのは工学用語としての英語であるが、「Shear(単数形」であり、「ハサミ」という道具ではなく、「切る」という行為そのものに関連していることがわかる。

続けて定義を読むと
物体内部の任意の面に関して面に平行方向に力を作用させた状態を指す。
とある。

この説明の「物体内部の任意の面」というのは????であったが、以下の図で一気に解決。
(画像は「匠ホームズ」の建築用語集「剪断力」から引用

物体内部の任意の面」とは「はさみで切るような力」が加わったときに、そのはさみの刃の面と平行な面で「切断面になる面」の事である。

ちなみに、引用元の建築用語集で「剪断力」の定義は以下のようになっている。
剪断力(せんだんりょく):部材を切断しようとする力で、水平部材には均一な剪断荷重がかかっている。
(ここで言う水平部材は、地面に対しての水平であり、上記の図のとおりです。)

以上から「剪断」とはただ切るのではなく、ハサミで切るように、すれちがう二つの方向の力によって切ることだとわかる。


また、デジタル大辞泉の「剪断」の二番目の定義。
2 物体内部のある面に沿って両側部分を互いにずれさせるような作用。

もう一つ、岩石学事典の解説
体積変化を伴わない歪の一種で,物体内の平面が一様な角度だけ傾くような変形

そして、元々のWikipediaの説明
「物体内部の任意の面に関して面に平行方向に力を作用させた状態を指す。」

以上のことからすると、
1)この力が作用している状態
2)この作用そのもの

を「剪断」と呼んでいることがわかる。

ようするに必ずしも切るのではなく「切るという行為に含まれる物理的特性(力とその作用)を剪断と呼んでいる」のである。

CGでは、せん断(Shear)は切るという行為よりも、(その力による変形=せん断変形)のほうがお馴染みである。
Shearはその変形の度合いや、Shearが発生する力に関係する値を示すアトリビュートである。
せん断というと「切る」というイメージがつきまとうが「切る」行為に関連する力のかかり具合とそれと同じ力のかかり方も「せん断」 という言葉に含めていることがわかる。




「剪断」はハサミを使わなくてもおきる現象である。
その例のいくつかを下にあげておく。

鉄板などをつなぎとめるボルトにかかる作用(参照元:CRANE-CLUB)




パンチなどによる穴開け加工など(参照元:野口製作所



プレスによる切断など(参照元:Metal Otaku




-------------
さて次の言葉は「応力」である。
(続く)

2010年10月19日火曜日

本「スタジオプロジェクトDynamics」への補足 (その15)

プロジェクト:プリニー式噴火(パート1)
Pg73ステップ1

ヘクトメートル:ヘクトメートル(記号hm)は、国際単位系の長さの単位で、100メートル。漢字では「粨」と表記する。あまり日常的に使用されない。(Wikipediaより


-------------
Pg74 ステップ1
クリッピングを防ぐために・・・
発生した煙がコンテナの壁に接触するとそこで煙はカットされます。
これをクリッピングと呼んでいます。
(「クリッピング」はフルイドに限らず広く使われる用語です。参照:デジタル用語辞典「クリッピング」

フルイドコンテナはその内部のフルイドしか表示できませんからコンテナを超えるサイズのフルイドはクリッピングされてしまいます。
ようするに煙が充分に広がれる程度の大きさのコンテナにする必要があるということです。



-------------
Pg74 ステップ1
翻訳:「煙の柱は成層圏まで上昇する必要があります。
原文:「The column of smoke needs to rise into the stratosphere.」

ここで「into」という言葉が使われているので、上昇して成層圏の中へ入っていき(さらに上昇する)というイメージがあります。
まで」は、日本語としては正しいのですがイメージ的にそこで止まるようなイメージがあります。

さて、この煙は成層圏へと入っているのかそれとも手前で終わるのかという点ですが、pg73に目安となる説明があります。

火山の高さ1,200m(このシーンでの設定)
煙の高さ2,900m(このシーンでの設定)
現実の煙の高さ42,000m


火山モデルの高さはユニットで言うと11.5、
フルイドコンテナの設定をしたときに、Yのサイズは30になっています。
これをY軸上で23ユニット移動しています。

フルイドコンテナの中心がピボットポイントですので、フルイドコンテナの底辺は
上昇分の23ユニットから、Yサイズの半分を引いた位置になっているはずです。
23-(30÷15)=8

フルイドの底辺はY軸8ユニットの位置で、そこから高さ30のフルイドコンテナが伸びています。
よってフルイドの天井部は38ユニットの高さになります。

1ユニット100mで換算するとこれは3,800mということになります。
煙は火山の頂点から発するので、このフルイドコンテナでは煙は1,150mから3,800mまでの間を上昇することができます。

では成層圏とはどのぐらいの高さかというと(参照:Wikipedia「成層圏」)
11-50kmです。メートルに換算すると11,000m~50,000mということになります。
これは飛行機に乗って雲の上に出て、雲が存在しない高さです。


本の説明によると現実の煙の高さを42,000mと書いてありましたので、現実の煙は成層圏に達しているようです。
そうするとこのMayaプロジェクトのフルイドは成層圏には達していないことがわかります。
ここでは、「煙の柱は成層圏へと上昇しているように見せる必要がある」と言いたいだけです。
決してこのプロジェクトで作られる煙が「成層圏に達するべきである」という意味ではありません。


-------------
翻訳:「これで流体はコンテナの上部に達すると離れるようになりました。
意訳:「The fluid can now leave the container when it reaches the top」.

訳に間違いはありませんが、わかりにくい説明です。
これを読むとコンテナの外に出たフルイド(煙)がそのまま存在しているようなイメージを持ってしまいます。

これはここまでの説明ともかぶりますが、以下のようなことを説明しようとしています。

フルイドコンテナ内の煙が上昇するとデフォルトではコンテナ天井部分に当たって煙が跳ね返されます。
それでは「煙が上昇し続けるように見えない。」=「成層圏へと上昇しているように見えない」ので煙が天井で跳ね返らないようにこのステップで「境界線」の設定をしているのです。

境界線の設定で跳ね返るか、そのままコンテナの外へ流す(ように見せる)かの違いだけです。
当然ながら、コンテナの制限があるので上昇する煙は高さ3800m(コンテナの天井部)のところでクリッピングされてちょん切れたようにみえます。

「フルイド」といっていますがMayaのCGのフルイドではなく流体(フルイド)としての煙の振る舞いが実際にはどういう振る舞いをするべきかと言うことを視点として書いているのかも知れません。

これで流体はコンテナ上部に達してもそのまま上昇を続けるように見えるようになりました。
とでも訳した方がわかりやすいかも知れません。



-------------
Pg76 ステップ5
翻訳:配置するだけで、値を大きくするとシミュレーション速度が上がり、値を小さくすると速度が下がります。
原文:「Simply put, increasing the value causes the simulation to speed up, and decreasing it slows it down.

原文にある「put」は、「後にのべる状態にする」ことを示しているのであえて訳さなくても良いと思います。
意訳すると「シミュレーションの速度を上げるために値を増加したり、遅くするために値を小さくします。」となると思います。
これはシミュレーションの計算速度の事ではなく、移動速度のことと思われます。
(未確認)

2010年10月9日土曜日

夢の実現と「感銘」のもつ力

<前置き>
以下は、自分の思いつきやこれまで考えをまとめたもので、思いついたときに書き足したメモをまとめたものです。
理論的に間違っていたり、話がまとまりきっていないのは、私の力不足です。

これが絶対正しいと主張するつもりはありません。
これを書いた目的は、現時点の自分の考え方を、あとで見直すためです。

自分の間違いを正し、嫌いな物を好きになろうという努力をすることは必要だと思っています。
なので自分の理論が間違っていたとしたらそれを受け入れようと思います。
嫌いな物や人は嫌いと言いますが、それに固執するつもりもありませんので、それらを理解すると好きだと言い始めるかも知れません。

人は自分の考えや好みが変わることはあると思いますし、自然なことと思っています。
そして現時点での自分の考えや好みを、表に出すことは誰かを不快にするのではない限り、悪いことではないと思っています。

自分の考えや好みが変わったときに、過去の自分の考えや好みを見直すことで、自分の思考の傾向を理解する助けになり、自分の進化や周りに対する理解を深めてくれると思っています。
それが、メモとして残す理由です。


-------------
<感銘と夢の実現>
「感銘」:忘れられないほど深く心に感じること。(明鏡国語辞典)
「夢」:将来実現させたいと思っている願い。(明鏡国語辞典)


人は自分が感銘をうけたものを、やりたい、所有したい、身につけたいなどと強く思う。
特に幼児期に感銘を受けた体験は、その人間の一生の基盤となっていく。 
感銘を受けた物はこころに残り、その人の言動の方向を決めていく一つの要素でもある。

誰もが自分の子供には、幸せになってもらいたいと期待し、いろいろなことを学ばせようとする。
それは勉強に限らず人生のこと、音楽、運動など全般にわたる。

うちはこの方法で子供に音楽を学ばせた。

これをうまく導くには、子供に感銘を与えるようなものを見たり触ったりして経験させるのが一丸良いと思う。
うまく利用すれば親が望むものに興味を持たせる事も可。
一種のすり込みなのかもしれないが、無理矢理やらせるよりは自発的で害が少ないと思う。
ここでの焦点は「放任主義」とか「親の身勝手」とかそういう教育論の話ではない。

「感銘」というものがいかに人を動かす原動力となるか?という話である。
「感銘」のすばらしい点は「自発的に自分自身を動かす原動力になる」ということである。
誰かがやれと後押ししたり強制する必要もない、自らがどんどんとそれを吸収するのに夢中になっていく。
少々の障害は乗り越えようとするやる気につながる。
「感銘」はその人の人生を動かす原動力であり、莫大な力を持っている。
多くの「なりたいもの」、「やりたいこと」といった将来への夢は、この「感銘」を受けた事柄からなる。
まさにその人の人生を左右する力を持っている。



幸か不幸か、親や先生が用意したものすべてから感銘を受ける訳ではない。
こちらの思惑が、はずれることは多々ある。

感銘とは与えようとして与えられる物ではないとも言える。
ある人があることに真剣に打ち込むその姿もしくは、それにより生み出された物事によって人は感銘をうける。
ノーベル平和賞を受賞するような人は、自らの行動を持ってして結果を生み出し、その両方によって他の人に感銘を与える。
まちがっても「感銘」を与えるためにそうしている訳ではない。
「感銘」を与えようとしていることを感じた時点で、そこから感銘をうけることは無くなってしまう。
そのため、子供に感銘を与えようとするときは、自分の行動で与えることができないことは他者任せにする。


もう一つ重要な点は、ある程度時間がたつと、その力が薄れていくことがあるということ。
そしてもっと強い感銘を受ける事柄があると、そちらへ注意は遷移していく。

子供の時の夢を、すべてのひとが実現しているわけではないことは、それが原因だろう。
それは悪いことを意味しているとは限らない。
もっと有意義なことに夢を見いだして変わっていったのかも知れない。

夢を実現した人は、この感銘を受けた事柄が自分の心の中で色あせないように、意識するしないにかかわらず何かしてきたのだろうと思う。
もしかしたら何もしないでも、それが心の中に力を失わないで残り続けている人も居るのかもしれないが、そういう人は少ないのではないかと思う。


何か実現したい夢があるなら「感銘」を受けたことをたえず、刺激する環境に身を置くのがひとつの方法かも知れない。
行動力のある人なら、自然とそうしているだろう。
行動力のない人なら、意識的にそうする必要があるかもしれない。


CGアーティストになりたいなら、その目でみて、触れて、会話をすることである。
最初の「感銘」に関連する、大小様々な新たな「感銘」を体験し、自分の心の中に蓄積していくことだと思う。
それによって元となった「感銘の力」に、さらにエネルギーを与え続けることができるのだと思う。

それは何でも良い。
力を与えるなら小さいことでも大きな事でも良い。
とにかく継続し、行動することが大切なのだ。

最初は、その業界にメールを出すことでも、講演会に顔をだすこと。
会社説明会に参加したり、見学をするのもよいかもしれない。



-------------
「能力」:物事を成し遂げることのできる力 (明鏡国語辞典)


幼児と生活を共にしていると、その感銘を受けた瞬間の周りの環境や自分の感情を事細かに、記憶していることがわかるときがある。
非常に事細かなニュアンスまで、正確にとらえている。
言語の習得においては、音声の発生だけでなく文法的な単語の並べ方まで正確に捉えている。
特に感銘を受けた物に関しては、すばらしい集中力でもってそれを成し遂げている。
一瞬にしてその場の体験を感覚や感情を含めて自身のなかに複製をもってしまう。
それは真似とかコピーという言葉ではおいつかないほど、すばやく、正確で細部に至る。
時間は必要ない、一瞬でそれがなされてしまう。

考えるより早いというか、これが思考の基盤となるメカニズムなのかはわからないがとにかく一瞬でおきてしまう。
そしてこれは、(おそらく)どんな子供にも備わっている。

とにかく良い悪いは関係ない、自身が感銘を受けた物を克明に細部に至るまで時間経過も含めて瞬時に心の中に吸収してしまうのだ。
何か物事が起きたときに、子供の内部でそんなことが起きているとは気がつかないことが多い。

後で子供の中に蓄積されている事柄が表に出てくることで驚かされる。

そのときの出来事が心の中に再現されている。
そして後になって、その心の中の出来事を再度見て、模倣していたりする。
重要なのは、そのときの感動もそこに植え付けられており、それが現時点でも同じように体験できるということだと思う。

幼児の言語における表現力は劣るため、表にはその一部しか現れない。
本人も説明できないので、そのようなことが内部で起きているのは周りからは認識しがたい。
しかし、注意深く観察していれば、思いがけないときに心に蓄積された物が表出し、その詳細さに驚かされることがある。

これは時間を経るにしたがい通常は徐々にデティールが失われていくが、長い間そのクオリティーを維持する子供もいる。
通常それは記憶力がよいという形で現れる。



さてこの能力は子供だけの物かというとそうではない。
大人になっても感動した時などは同じ事が起きていると思う。
意識することはないかも知れないし、感動することは子供の時より減っているかも知れないが、「感銘」を心の中に留める機能は同じく、備わっており機能する。

上記のことから、「感銘」したことを心の中に留めるという能力は誰もがもっており、大人も子供も持っている能力であると言える。

その能力がある以上、いつでもそのパワーを利用できるということでもある。
最初に触れたように、夢を実現するにはそのパワーを有効利用すると非常に助けとなる。
いつでもやる気を引き出すことができ、自分の人生を好転させることが出来る。

そう考えると、どんな夢でも実現するための基本的な能力はすでに備わっていると言えるかも知れない。
「自分には才能がない」というのは良いわけに過ぎない。能力のない人間など居ない。
・・・といえば極論になるか?
でも自分はそう思っている。

そしてこの能力を生かし切るには努力が必要となる。
その努力の一つが先ほど述べた、「感銘」を受け続け、最初に受けた「感銘」のパワーを活性化し続けることである。
夢を達成するにはもう一つ必要だ。
夢の状態を達成したときに行っているであろう行為を、少しづつでも実行すると言うことである。

「感銘」のパワーをいくら活性化し続けても、それは永遠と続く滑走路を走り続けているような物である。
1mmでも良いから浮かび上がり続ける努力をしなくてはいけない。
そうしないと、夢を妨げられたのと同じく、夢は達成出来ないように感じ、結果的に夢を失う。
その努力の基準は簡単だ。
夢の状態を達成したとしたら、そのとき自分がしているであろう行為(仕事)を、いま少しでも身につけ実行するということだ。
それを絶え間なく続け、ほんの少しで良いから前日よりも多くのことができるようにこころがける。
これは「感銘」のもつパワーと一緒になるととても強力になると思う。


「好きこそ物の上手なれ」という言葉はまさにその通りだと思う。
「感銘」とそれと相乗効果をもつ「夢へ近づく努力」。
程度の差こそあれ、好きであれば知らずとその二つを実行している。

-------------
おまけ

2010年10月7日木曜日

本「スタジオプロジェクトDynamics」への補足 (その14)


Pg72 火山の構造

翻訳:「その円錐型のシェイプと抜きんでた高さにより、このタイプの火山は最も爆発的な噴火を起こします。
原文:「With its conical shape and towering height, this type produces the most explosive eruptions.

成層火山についての説明なんですが、「爆発的な噴火」は円錐型のシェイプと高さによって引き起こされるような印象を持ってしまいます。
しかし、いくつか説明を読んでみましたが、その関連性は見いだせませんでした。

原文の「With」のとらえ方で違ってくるのだと思いますが、「その円錐の形とそびえ立つ高さと共に、このタイプの火山は最も爆発的な噴火を起こします。」としたほうが、おそらく正確ではないかと思います。

ようするに「成層火山」についての説明であり。
1)円錐型
2)高い
3)最も爆発的な噴火を起こすこと/ものがある。

ということを意味しています。

(成層火山の図:Wikipediaより)

以下のページにある「マグマのねばりけと火山の形」の表を見ると関連がわかりやすいです。参照HP:りかちゃんのサブノート火山と火成岩
成層火山は「中間」から「激しい爆発」までを網羅する火山の1タイプです。

ちなみに日本の火山のほとんどは成層火山です。
参照:Wikipedia「火山」 「成層火山




-------------
Pg72 噴火
プリニー式噴火について補足:
Wikipedia「噴火」によると
流動性が低くマグマから揮発性成分が逃げられないため噴火時の揮発性成分が多い場合:浅間山や桜島のような爆発的な噴火になる(プリニー式噴火)。

マイペディア「プリニー式噴火」によると
多量の軽石・火山灰を放出する爆発的な火山噴火のこと。放出された火山灰などは風下側に広く堆積して広範囲に被害を及ぼす。噴煙の高さは数万mに及ぶこともある。名称は,イタリアのベスビオ火山が西暦79年にこの様式の噴火をしたとき,プリニウスによってその詳細が観察・記録されたことによる。

以下のサイトにもわかりやすい説明があります。
参照:山賀 進のWeb site「第二部-2- 地球の科学
 プリニー式はさらに爆発的な噴火で、大規模な降下軽石(白っぽい)やスコリア(黒っぽい)、火山灰を放出する。西暦79年のイタリアのベスビオ火山の噴火が典型で、火口から13km離れていたポンペイの街を厚さ7mの軽石で埋めてしまった。この軽石は火砕流だった可能性もある。

以上の事からプリニー式は噴煙、爆発性ともに火山のダイナミックさを示すのに良い例となることがわかります。


-------------
プロジェクト:プリニー式噴火(パート1)

翻訳:「マグマは粘性が高く・・・
原文:「The magma is highly viscous,・・・
これはプリニー式噴火についての説明で、一般的なマグマの性質を述べているのではありません
別のタイプの噴火では、マグマの粘性が低い場合もあります。
粘性が低いものには「ハワイ式噴火」があり、マグマなどが連続的に放出するため爆発がほとんど起きない。
したがってこれは「そのマグマは粘性が高く・・・」とするか「そのマグマの粘性は高く・・・」としてプリニー式の説明であることを強調したほうがわかりやすいでしょう。


--------------
参考動画

ー-------------
浅間山 噴火


 
浅間山 噴火 (予知のための地震観察などが説明されている)



桜島 南岳の爆発 2009/10/3





 
桜島 夜間爆発 (火山雷も発生)2010/2/12


 
スマトラ島 シナブン山 噴火(Youtube)
http://www.youtube.com/watch?v=-ppneonTjB0

 
アイスランド南部のエイヤフィヤトラヨークトル(Eyjafjallajokull)氷河で噴火 (Youtube)
http://www.youtube.com/watch?v=dOnZxyT-DXs

 
アイスランド 火山噴火


 
アイスランドの 火山(2010年4月)



アイスランドの火山をヘリコプターで上から見た動画
煙に混ざり、ランダムに飛び散る石や雷などがみれる貴重な動画


 
ニカラグアのMasaya火山の爆発(2008年6月18日)


 
エトナ山の噴火(2006年12月)
最初に小さな竜巻も起きているのは興味深いですね。
最後のほうにある夜の火山がきれい。


 
雲仙普賢岳(火砕流の発生から沈静まで)


 

世界の火山(火山研究で有名なクラフト夫妻による記録映像)
その1
http://www.youtube.com/watch?v=0CC-4LsUXuI
その2
http://www.youtube.com/watch?v=YeD6F70RuBU
その3
http://www.youtube.com/watch?v=jeRWzLTSD8o


ハワイ キラウエアの溶岩



溶岩いろいろ





溶岩流の実験
溶岩が出てきたとき、どんな現象が起きているのか説明をしている。





ロードオブザリングの最後のシーン:Youtube
6:00あたりから火山の爆発と溶岩のエフェクト

http://www.youtube.com/watch?v=sz_Xnt3-9Nw

2010年10月6日水曜日

広島の山奥にある「彫刻村」の思い出

今回は知る人ぞ知る広島の「彫刻村」の話です。

いまから20年ほど前のこと、当時は広島に住んでいた。

そんなある日、「彫刻村」というのを見つけ行ってみることにした。
本当は箱根の彫刻の森美術館に行きたかったのだが、遠くていけなかったので近場で似たような物がないか探していてみつけたのだ。

その場所は、山の中にあった。
中国地方にすんでいると、ちょっとしたレジャーで山の中のドライブをするのは珍しいことではない。曲がりくねった道を進んでいった。
しかし、途中から車一台の車幅しかないような道に変わってきた。
道を間違えたかと思ったが、一本道であり間違えようがない。
そのまますすむと舗装はなくなり、土の道と化した。
 まぁ、子供の頃は土の道もところどころ存在してたので、これも未経験ではない。

そのうち人気がなくなり、これで行き止まりだったらどうしようかなどと不安にかられながらも進んでいく。
途中、廃棄物処理場のようなところがあり、そこに積み荷を運んできたのだろうかダンプカーが脇に止まっていた。
その横を通り過ぎ、いよいよ山奥感が深くなった頃、急に目の前が開けた。
建物があり、そこが彫刻村だということがわかった。
どれぐらい山の中に入っていくのかGoogleマップで見るとよくわかる。


さて、まだ出来て間もないのか受付はまだ真新しい木造建築であった。
そこで入場料を払う。

なんでこんな山奥で普通に仕事できるのかもしかして狐が化けてんじゃないかと不思議に思いつつも、人に会えた安心感を感じた。

しかし、100ヘクタールという広い敷地内には、人っ子一人見当たらず、いるのは自分だけという感じ。
入り口から入ってすぐに、100m程度の通路が続くが、その両脇には人物の(子供だったか?)彫刻がずらっと並んでいる。
正確な数は覚えていないが10~20体が両脇に並んでいた。
当時と違い草木が増えているが多分この写真の場所↓

(写真は4travel.jpの「一人旅[268]の投稿より

ぽかぽかした陽気な日差しと鳥の鳴き声しかきこえないその空間は、まるでラピュタに出てくる天空の廃墟のようでどこからかあのロボットが歩いてきても不思議ではない雰囲気があった。

今になって知ったがこれは、奥山泰堂という人の彫刻らしい。
目は細かな彫刻はされておらずへこんでいるだけ、粗っぽい作りが一夜にして消滅したポンペイの人型をみているような感じさえする。


じっとみているうちに、彫刻がじっとこちらを見ているような感じさえしてきた。
たしかに、ほとんどの彫刻の目線はこっちを向いているのだ。
それに気がつくとどことなく背筋が寒くなってくる。
通路に向かって彫刻は立っているので、歩いている限りいつも彫刻に見られているような感じになる。
たまに人の気配を感じて振り返ったりするのだが、彫刻がじっとみつめているだけであり不気味感が増してくる。
もしかしたら自分の見ていないところで動いているのではないか?とさえ思ってしまう。

しばらく見て回っていると遠方に掃除をする作業員の姿が見えて、少しホッとした。
結局、箱根の「彫刻の森美術館」のようなところを期待していただけに、一人の作家の彫刻ばかりで、しかも近代彫刻を期待していたので多少がっかりして、足早に見て回り、1時間ほどで帰った。



彫刻を見るのは好きで、比治山の現代美術館にも仕事が終わってから散歩に行き、屋外彫刻をながめながら日が暮れるまでの時間を楽しんでいた。

しかし、この彫刻村だけは今までとはまったく違う異質な経験だった。
見ていると言うよりも、見られている感じがし、自分一人で広大な廃墟にいるような感覚。
(今は本当に廃墟になっているのかもしれないが。。。)
時間が止まったような感じというのはまさにこのことだったのかも知れない。
それとも異空間にいる感じと行った方が良いのかもしれない。
彫刻を見に行ったのに、彫刻に見られた気持ちのほうが強く印象に残っている。
このような経験は他では決して出来ないだろうし、後にも先にもこのとき限りだ。
きっとラピュタに迷い込んだらこんな感じなんだろうなとも思う。 
人が居ないという言う点では映画化の話もでているゲーム「MYST」のような場所に迷い込んだ感じもする。
貴重な体験であった。

この強烈な印象は今も残っており、それがどこだったかずっと気になっていた。
しかし「彫刻の森美術館」と名前が混同してどうしても思い出せなかった。
昨日、思いつきで、ある質問サイトで訪ねたところ、すぐに解答が来て、長年の疑問が晴れた。

いくつかのリンクを下においておくが、どうも当時車で通れた道は今はけっこうぼろぼろになっているらしく「彫刻村」自体も廃墟になっている可能性が高い。
今も、彫刻の村にはまだあの人物像がのこっているのだろう。
いつかまた行ってみたい。


(ちなみにその頃行きたかった箱根の彫刻の森美術館は7~8年後にいくことができた。)


-------------
正式名称は「たいどう彫刻村


ブログ:新型そうだちゃんなダイアリー 「林道中倉線(南原峡)、たいどう彫刻村、林道今田線
林道は以前通った道と同じなのかどうか思い出せない。
たしかに「唯一眺めの良い場所」というのは自分も車を止めて眺めた気がする。
また林道の写真で小さな欄干がみえるところがあるがこの道もなんとなく通った気がする。


ブログ:クリーニングフミヤ 広島市安佐南区上安2丁目「千代田町 「たいどう彫刻村へ行きました。
こうしてみるときれいなところです。
まず東京近辺ではあり得ないところでしょうね。
しかしイノシシが居たとは、当時、出会わなくて良かった。


たいどう彫刻村林道


ホームページ:ひろしま観光ナビ
たいどう彫刻村


-------------
ちなみにこれは比治山の現代美術館にある小道(引用元ブログ:Flash Backより)



同じく敷地内のヘンリームーアの彫刻(引用元
仕事が終わった後にスケッチしてたこともありました。
とにかく良い雰囲気でリラックスできるところでした。

2010年10月4日月曜日

世界のCGプロダクションの場所がわかるマップ

カナダのアニメーター/脚本家/プロデューサー/監督の経歴をもち、Sheridan Collegeで教鞭を執るMark Mayerson氏のブログ「Mayerson on Animation

いろいろなアニメーションとその業界に関するエントリが盛りだくさんですが、本日のエントリ「Where Studios are Located」では世界中のCGプロダクションの位置と名前がわかるCGstudiomap.comと、同じくゲーム関連スタジオがわかるgamedevmap.comが紹介されていました。

実際の所、網羅されているのは有名なところがほとんどです。ただ、日本の記載は少なく、CGstudiomap.comに至ってはゼロというありさまです。
CGstudiomap.comは[Add a studio]ボタンをクリックして追加できるようなので、もし自分の所属するところ、興味あるところが無いようでしたら、どんどん追加していきましょう。
将来的にはスタジオの規模別に表示できるようになってくれると便利なのですが。

さて、不完全なマップではありますが、地理的な関係をみることができておもしろいですよ。


一応、元のエントリのほうも訳してみました。
-------------
最近、二つのおもしろいインタラクティブなマップのことを知りました。
一つはコンピューターアニメーションのスタジオをもうひとつはゲーム・スタジオの位置を表示しています。
おそらく両者はダブっている部分もあるでしょう。

これらのサイトは仕事を探している人にとって便利です。
しかしながら体験するまでは、いろいろな場所からの悪影響がわかるわけではありません。

特定の都市について話しているのではなく、スタジオ過密度についてです。
仕事をしている場所によって、過密度は大きな違いを生みます。

密度が低いところ(たとえば1つか2つのスタジオしかないところ)での問題は、レイオフされたりスタジオが閉鎖されたら、この業界で働く為に引っ越ししなくてはいけません。
これはFoxスタジオが閉鎖されたときにArizonaにいた人々に起きたことです。
Disneyが閉鎖されたときにフロリダでも、そしてLaikaが「コラライン」が終わった後にクルーをレイオフしたときにPortlandの人々の身に降りかかった事です。

これは未婚の人たちにはたいした問題ではありませんが、恋愛の末家庭を持った人たちには大きな問題です。
自身の仕事を追求するなかで、他の人たちをすみなれたところから離れさせるのは、とても力のある憤りを生み出します。

結果として、半ダース以上のスタジオがあるエリアに集まる傾向があり、そうすることで彼らが仕事を変える必要ができても引っ越しする必要はなくなるのです。

(翻訳できませんでした:Of course, it means that people starting their careers often have an easier time finding work in the smaller centers as it is harder to entice people to move there.)

あなたがどこで仕事をしたいかにかかわらず、これらのマップは便利でしょう。

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

これに対するコメント(from JPilot アニメーター)
-------------
都市やスタジオの密度は、国から国へ渡り歩く人々にとって、ほんの小さな要素にすぎません。

大きなスタジオのある大都市で、売り上げが上がる質の高い映画において良い地位に就けたなら、その成功したスタジオはプロジェクトの終わりには次の仕事へ残るように話してくるでしょう。

他の場合では、国々を渡り歩くのは自身のキャリアを向上させる唯一の方法です。
もし、地理的にとどまり始めたら、おそらくあなたのキャリアは下降線をたどるかもしれません。

家族中心の人が自身が立っている土地を失い続けている間に、たくさんの高度な職種が一流のレジュメを構築するプロフェッショナルな遊牧民達で絶え間なく埋まる理由です。

壮大なプロジェクトでの数年にわたる経験や、感銘を与えるような仕事をレジュメに書き連ねることはできます。
引っ越し続けている限り、繁栄します。
いったん、根をはやしてしまうと下降曲線をたどります。

鮭は上流に向かって泳ぎ続けます。
川の底へ流れて行ってしまうのです。

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

-------------
まぁ正直言って、個人的にはこのエントリの内容はどうでもいいかなという感じですw
確かにシングルだと、国を短期で渡り歩いてもルームシェアーして最低レベルの生活費で暮らせば、引っ越し貧乏はさけられるかもしれませんw

どちらも、一理あるけど会社によって仕事によって違うし、個々の人によってまた異なってくる部分は多々あります。
一カ所に根を生やしても、向上心と実行力のある人は自ら登っていくでしょうし、障害があっても乗り越えるでしょう。 反面いろいろなところを渡り歩いても、人任せで向上心がない人はいつかは壁にぶつかるでしょうし。

まぁ、上記のお二人の言うことは話半分で、聞いて自分なりの活路を見いだせるようマップを活用してください。そっちのほうが重要です。

2010年10月3日日曜日

本「スタジオプロジェクトDynamics」への補足 (その13)

Pg65
ステップ13

分離ジオメトリとは、ステップ3で抽出によりわかれたジオメトリです。
sinkhole3.maファイルでは「breakaway」という名称になっています。
シーンを開いたときにはオブジェクトレイヤーのBREAKAWAYがオフになっているので見えません。


-------------
Pg66
ステップ15

おわかりと思いますが「三角」とは三角ポリゴンのことを指しているのだと思うのですが図3.34をみると三角ポリゴンは残っているのでちょっと意味がわかりませんね。

ジオメトリのスカルプとツールのところで「制限された軸方向に・・・」とあるのは
このジオメトリの場合は平面方向、すなわちXとZの方向ですね。

震央(Epicenter)」とは震源の真上の地表の一点のことを指します。
これは地震ではなく陥没なのですが、地震とは「地面からくる衝撃である」と考えれば、「陥没」は局地的な地震と考えることも出来ます。


ステップ16
個人的には手順の検討があまいように思います。
間違いではないのですが、すっきりしない手順になっているように感じます。

一度ステップ13で分離ジオメトリをパッシブコライダーにしてnParticleの初期状態を設定しています。 これをいちど削除して再度、このステップ16で、パッシブコライダーに設定し直すという二度手間になっています。

その理由の一つはステップ15で、分離ジオメトリのポリゴンを分割する必要があったからなんですが、先にステップ15の内容はステップ13の前にするか、ステップ7の直後にすれば良かったように思います。


Pg67
・・・分離ジオメトリを無効にします」と書いてありますが、これは分離ジオメトリのnRIgidShapeノードの一番上の「Enable」のチェックを外すだけです。


-------------
Pg68
ステップ19

ここで分離ジオメトリの厚さのことを説明していますが、どこにも設定した覚えがなく、この問題がどこから出てきたのか意味不明です。
これはちょっとした実験をしてみるとすぐにわかります。

1)ポリゴンのプレーンを1つ作成し、スケールxyzに20を入力します。
2)もうひとつポリゴン・プレーンを作成し、スケールxyzに20を入力後、中心部分の4x4のポリゴンフェイスのみ選択してメッシュ→抽出(Extract)で分離します。
ヒストリを削除し、周囲のポリゴン部分も削除します。
スケールが1に戻っていることに注意してください。
3)もうひとつポリゴン・プレーンを作成し、ChannelBoxのInpuptsにあるwidthとHeightに20を入力します。
これで3つのポリゴン・プレーンができました。
 プレーンA)スケールxyzが20
 プレーンB)スケールxyzが20だったが抽出してスケールは1に戻っている。
 プレーンC)スケールは1ですが、widthとHeightで大きさが20なので、Aのプレーンと同じです。
4)これら3つにそれぞれパッシブコライダーの作成を適用します。
5)ここで、各「nRigidShape」にある「Collisons」オプションから「Thickness(厚み)」を見てみます。
 プレーンA) 0.085
 プレーンB) 0.034
 プレーンC) 0.085
6)これでわかるのは、ジオメトリをパッシブコライダーにしたとき、そのThicknessは自動で決まり、それぞれのジオメトリの大きさによって値はことなるということです。
そして、もう一つはジオメトリのScaleXYZの値は関係ないと言うことです。
7)次に「Remove nCloth(nClothの削除)」で、すべてのパッシブコライダーを取り除きます。
8)それぞれのプレーンに「Create nCloth」を適用します。もういちど今度は「nClothShape」の「Thickness」を見てみます。
 プレーンA) 0.141
 プレーンB) 0.057
 プレーンC) 0.141
9)自動で「Thickness」が設定されることや、オブジェクトの大きさによってそれが異なるのは同じですが「nCloth」と「nRIgidShape(パッシブコライダー)」ではその値も違うことがわかります。
「 nRigidShapeのThickness < nClothShapeのThickness 」
という関係になっています。

こうなってしまう理由はわかりませんが、nClothのほうがコリジョンの判定がシビアな状況が多いのでデフォルトでThicknessの設定を厚めにしているのかもしれません。
とりあえずそれがこのステップ19で修正が必要となっている事柄です。


-------------
Pg69
ステップ21

翻訳:「砕けた断片がジオメトリの破片のように見えます
原文:「the crumbling pieces look like shards of geometry.
訳は間違いではありません。元々の説明がわかりにくいというか言語の違いによるものというべきか。
ようするに「コンクリートの破片のはずが、ポリゴンのフェイスに見えている」と言うことです。
そのために厚みをnClothと同じ(0.156)にしているのですが、その程度ではまだポリゴンにしか見えないのは言うまでもありません...。


翻訳:「これは最初としてはよいのですが、改善の余地があります
原文:「This is a good starting position, but it does not have to be maintained.
意訳すると「取りかかりとしては良い感じですが、無理に維持する必要はありません。


翻訳:「・・・分離を追加するとよいでしょう。
原文:「you can ・・・add divisions.

・・・分割を加えることも出来ます。」としたほうが良いように思いました。


-------------
補足:この練習では、シミュレーションを維持してジオメトリの変更をする方向性ですが、低レゾリューションでシミュレーションされたポリゴンをそのままデティールアップする方法ではは限界があると思います。
低レゾリューションのオブジェクトを使ったnClothシミュレーションを、高解像度のジオメトリのアニメーションに置き換えるのは、今のところ自分には手間のかかる方法しかおもいつきません。
それもあって、あまりそのあたりには触れていないのかも知れません。
何か簡単な方法があると良いのですが...。

いくらシミュレーションで良い感じのができても、最終レンダリングで使えるジオメトリとデティールを手に入れることが出来ないと、意味がないように思います。
そのあたりの説明があまりされていないのは残念です。
というわけで、入門用の練習としては良いのですが、この手順全てそのままで、使うことができないケースもあるということを心にとどめて起きましょう。
いつでも、自分なりの方法を考えることを忘れないようにした方がよいです。

2010年10月2日土曜日

(Mel)デュプリケートされたオブジェクトの同一フェイスにシェーダーをアサインする

結論から言うと、スクリプトとして理論的には動きますが、仕事の効率化という目的においては失敗でした。

仕事で、約2000個デュプリケートされたモデルに、一部の面だけ異なるシェーダーをアサインする必要が発生し、スクリプトでできないかと思い作ってみました。

わかりにくいので図で説明しますと、右端にあるようなオブジェクトをデュプリケートして左のような大きな面積を覆うようにしてあります。
そして下半分がピンク色になっているようにそこだけ異なるシェーダーをアサインします。
ただし、この図と違い、現時点ではすべてひとつのシェーダーしかアサインされていないと考えてください。



今回限りのスクリプトなので、無理をしないで汎用性を犠牲にして、早くつくれるよう心がけました。


-------------
まず、ひとつのポリゴン・オブジェクトの色を変えたいフェイスを選択します。
他のオブジェクトは、すべてデュプリケートして配置を換えただけなので、フェイスのIDは同じパターンになります。

さてこれを、スクリプトエディターでみると
select -r newPanel01.f[3] pCube1.f[6] pCube1.f[36:53] ;
という感じでオブジェクト名(newPanel01)とフェイスのID(例:f[3])が表示されています。
今回は、このフェイスIDを手作業で抜き出し、配列に代入しました。
(これが半自動という所以です)

またオブジェクトは通し番号がついており
newPanel01~newPanel01989まで存在します。

今回のスクリプトは基本的にループの二重構造になっており、手順は以下の通りです。
1)ID情報を配列にいれてデータベースとする。(ループ1でサーフェイスを一つづつ選択するために使用)
2)選択したサーフェイスに指定したシェーダー(lambert3)をアサインする。
3)一つのオブジェクトに必要なすべてのサーフェイスに対して1~2を繰り返す。ループの回数は上記配列からsizeで抽出。フェイスIDの追加を容易にした。(ループ1)
4)次のオブジェクトに対して1~3を繰り返す。
ループの回数は指定したオブジェクトの開始番号から終了番号までを変数で指定して、それをループの値として使用している(ループ2)

今回、手順を考えていく中で、以前のエントリ「ポリゴン・プレーンにシェーダーを市松模様にアサインする (2)」で@Atsushiさんからいただいたアドバイス(コメント欄参照)を思い出して、それに従って考えをまとめていきました。


そのアドバイスとは
1) プログラムは総当たりで単純化
です。

いまだにスクリプト初心者の自分には、まだまだまとめるのは大変だったのですが、
できるだけ一度に一つの処理をさせ、それを繰り返す方向で考えをまとめていくと、意外と早く手順を考え出すことが出来ました。

実行してみたら異常に遅く、固まっているのかそれとも実行中なのかわからなかったので進行状況を表示する機能もつけました。

さて実際のスクリプトは以下のようになりました。

{
int $face[] = {
3,6,11,14,15,18,23,24,29,30,31,32,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,59,64,66,69,74,75,79,
80,81,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,104,105,106,107,108,109,118,123,125,128,133,134,
138,139,140,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,162,163,164,165,166,176,179,184,187,188,191,196,197,
202,203,204,205,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226};
int $fNum = (size ($face));
//print $fNum;
string $fSel;

// loop; pick object number
int $start = 645;  // <<<<<< First number of the panel, usualy it is "1".
int $end = 826;  // <<<<<< Last number of the Panel.


for ($j=$start; $j<$end+1; $j++){
string $pName = ("newPanel0" + $j);

// loop ; pick face ID / command
select -cl;
for ($i =0; $i<$fNum; $i++){
string $fSel = ("select " + $pName + ".f[" + $face[$i] + "]");
eval $fSel;

// face progress
print ("Done:"+ $i + "/" + $fNum + "\n");  

// set Shader
sets -e -forceElement lambert3SG;

}; // end pick face loop

// message
print ("finished:" + $pName + " (Start:" + $start + "- End:" + $end + ")" + "\n"+"\n");
select -cl;
}; // end pick obj loop
}



さて先ほども書きましたが、これを実行してみると遅い遅い
時間を計ってみると一つのオブジェクトの処理に約20秒かかりました。
計算すると作業が終わるまで
20秒×2000個=40000秒=約667分=約11時間
かかることになります。

これではとてもじゃないがスクリプトを使用する意味がありません
幸い今回はオブジェクトは四角のパネルで、規則正しく並んでいるだけなので、一部だけこのスクリプトを使い。
あとはそのオブジェクトをグループ化したものをデュプリケートして、他の場所へ移動して古い物は削除して置き換えという方法に切り替えました。

しかし!!
とんでもないことが起きてしまいました。
どうも調子が悪いのです。
オブジェクトを選択すると、10秒ぐらい固まる。
削除すると、1~2分ぐらい待たされる。
一度にたくさん選択するとそれが何倍にもふくれあがり10分ぐらい返ってこないことも。
それほど大きなオブジェクトじゃなく、少し前まではさくさく作業できたものが、突然これです。
デュプリケートしようとしても同じく待たされます。
しかもセーブしようとしたら30分ぐらいかかってしまう(ファイルサイズは170mbぐらい)

これはどうにも作業できず、いろいろとためしてみましたが原因はわからず。
おそらく何かへんなゴミのような物がオブジェクトに追加されてしまったのかもしれません。
ハイパーグラフでみてもとくに何かつながっている様子もないのでわからずじまい。
(何がおかしかったんでしょうね~????)

実は、スクリプトを書くだけで、すでに2時間近く費やしていたので、かなり焦っていました。
結局はスクリプトを使用する前のシーンファイルに戻り、
スクリプトを使用しないで手作業で10個ほどのオブジェクトにシェーダーを適用。
あとはデュプリケートとグループ化を繰り返して古い物と新しい物を置き換えました。
その時間は、約1時間。最初からそうしておけば良かったと思いました。

結局、効率を上げるも的でスクリプトを使ったにもかかわらず、問題が増え、さらに時間が失われるという本末転倒な結果に終わりました。、
手作業でやって、スクリプトを書くのに費やした時間よりもはるかに短い時間で目的の作業は完了してしまいました。

この程度の物なら10分程度で書けて、10分程度で使い物になるかどうかの結論がだせるようでないとだめですね。

本「スタジオプロジェクトDynamics」への補足 (その12)

Pg59
プロジェクト:陥没穴
ステップ1

ライブサーフェイスへのスナップについて補足。
CVを選択して移動するときには、矢印をつかんで移動してもスナップしません。
マニピュレータの真ん中(XYZ軸が交わる所)にあるサークルをつかんで移動します
ほんの少しだけ動かすと勝手にサーフェイスへスナップします。
そのとき、元の位置より若干ずれが生じます。
すなわちNURBSカーブの最初の形と同一にはなりません。


-------------
Pg60
ステップ2

①このステップを実行する前に、「ライブサーフェイス」のボタンを再度クリックして通常状態に戻さないと、スプリットができません。
②スプリットするときは最初は任意のポリゴンエッジから始めます。
このステップで「ポイントスナップ」が有効になっているため、この最初の選択ポイントは近くにあるNURBSカーブのCVがもつXまたはZの位置に対してスナップします。
③2つ目からはNURBSカーブの次のポイント近くでクリックすると自動的にそのポイントにスナップしてスプリットされていきます。

ステップ3
名前の変更ですが、切断した穴の内側のほうは、「breakaway」という名称です。
外側の歩道の法は「cityBlock」でもよいですが、次でまた「抽出(Extract)」して名前がなくなるのでとくにここで変更しなくても大丈夫です。


-------------
Pg61
ステップ4

穴の境界エッジをすべて選択するには、境界エッジをどれか一つ選択した後に、選択(Select)メニューから「Convert Selection」→「To Edge Loop」を選択します。

翻訳:「二回目の押し出しで・・・
原文:「Extrude a second time and・・・
これは「二回目の押し出しをして・・・」の方がわかりやすいでしょう。


-------------
Pg62
ステップ8

nParticleを充填するステップですが、なぜかMaya2010(64bit)ではnパーティクルが作成されませんでした。
コマンドを実行しても、エラーは起きません。
しかし、nParticleのノードは作成されません。
同じシーンファイル(sinkhole3.ma)をMaya2011(64bit)で開いて同じステップを行うと、こちらはちゃんとnParticleが作成されました。