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

2009年3月31日火曜日

プラグイン: Mathematic Nodes

おもしろそうなプラグインをみつけた。
CGDNAというサイトにある、Mathmatic Nodes

まだ使っていないのでわからないが、関数をノード化したもののようだ。
どれほどの機能があるかどうかはわからないが、Houdiniのようにノードコネクションをつくるだけで様々なエクスプレッション的動作を実現することができるのならうれしい。

Houdiniまでいかなくても、エラーにわずらわされることなくGUIで、コネクションを作ってその関数の評価が素早くできるのは初心者にはありがたい。

これでforやifといった制御文までノードになっているとかなりおもしろいのだが、それはさすがに構造的に無理なのかな。

作者は、TDらしくデモリールにもすぐにでも使ってみたくなる様々なツールを公開している。
どれも実用レベルに達していて、こういう人ならすぐに大手に就職できるのだろうなと思った。

しかし、反面TDというのはツールを作る側であり、アーティストではないということをあらためて考えさせられた。
 

現代教育とCG

現代の教育は工業化時代にできたもの。
アルビン・トフラーの言う第三の波の時代である現代にはすでに時代遅れとなっているという。
参考:はてなQuestion 


実際にどのあたりがそうなのか、わかるほど勉強はしていないが、
第三の波のキーワードとして情報を中心として、分散化、多様化、個性化といった単語がよく聞かれる。

そういったキーワードから考えてみると現代教育においては「より容易に」「大量に」がキーワードで、
教育が目指すものにとどまらず、教育システム自体が、大量生産システムになっている。

それは教育する側は楽であるが、
教育される側は個々人の能力の差は別として一律に扱う。

教育する側が楽になると言うのは、どこかで何かが省略されているから楽になっているだけである。
コンピュータ工学的な考え方をすればサンプリングにより、何かが省かれている。
そして、その省かれたものは、個々人の努力で埋めるしかない。

産業革命以前である農業時代の教育がすぐれたものであったのかというと、
それはわからない。
ただ、現代教育のシステムによって失われたものはあることは確かだ。
情報革命以後のこれからの社会は、より個性が問われる時代となりつつある。
その個性をつぶしていたのが現代の学校教育ということは多く議論されてきた。
だからといって、個性を磨くだけの教育基盤や社会が整っているわけではない。

そのせいか、シュタイナー教育モンテッソーリ教育サドベリースクールといった個々を大切にする教育が最近、日本でも注目されている。

2~3年前まではインターネットで探してもそれほど詳しい情報はみつからなかったが、いまでは検索すると、結構詳しい情報がすぐにみつかるようになってきたことからも一般的に注目されていることがわかる。

モンテッソーリ教育は、早期教育として誤解されたり、既存のシステマティックな教育としてみられることも多いが、実際先生方は非常に気を配る必要があり、個性をしっかり見抜いていないとうまく機能させることは難しい教育方法でもある。
シュタイナーも宗教的な雰囲気から敬遠する人もいるが、宗教とは関係なく精神面を大切に扱うことにとても注意をはらっている教育だ。
サドベリースクールについては、近くにないので見学したことも人の評価をきいたこともないが、上記二つとは、また違った意味で、個々の判断を大切にしている。

この中でもシュタイナー教育は芸術と非常に密着した教育方法がとられている。
音楽、絵、詩、創作が教育の家庭において欠かせないものになっており、昔ながらの人から人へ伝えるという教育方法に徹している。
この教育方法においては、TVやオーディオといった、メディアを使った手段は敬遠される。

芸術があらゆる局面で、教育には欠かせないものとして使われているが、芸術学校ではない。
展示会をひらくようなすばらしい芸術作品をつくることを目的としているわけではなく、絵を描いたりものを作ったり、詩を歌ったり、音楽を奏でたり、ダンスを踊るといった行為が大切にされている。
そういったことは、心の中から発したものであり、子ども達へ伝えられる。
そして子ども達も自分の心から発するものを大切にして芸術という手段を通して自分を外に出す。
数学の勉強も、簡単なゲームで体を動かすことからはじめ、教科書はなくすべて先生が黒板に色とりどりのチョークで書いたものを自分のノートの書き写し、それが教科書となる。

できた作品の出来、不出来を評価するわけではないので、成績表もない。
ただ、期の終わりには先生からの詳しいレポートが届くそうだ。

そして、個々人の個性が大切にされ、先生も生徒の精神的成長を非常に注意深く見守っている。

もちろん、人によって合う合わないはあると思う。
とくに現代社会では、シュタイナー教育とそぐわないものもあるので、子どもの環境によっては成長に従い、シュタイナー的なものに違和感を感じ始める子どももいるという。

しかし、自分に合うのならば、こういった学校で育つことができれば、個性を否定することなく、そして恥ずかしがらずに自分の感じていることを表に出すことができる人になるのではないかと思う。


社会が厳しくなってきたとき、教育から一番最初に外されるものは芸術だという話をどこかのブログで読んだことがある。(もう一度探したが、そのブログを見つけることができないでいる)
社会の動向と関係があるのかどうかはわからないが、アメリカの小中学校には、図画工作という授業はない(一般的な公立校の話で、すべての学校がそうというわけではない)そうで、なんとなく教育における危機感を感じる。
(反面、学校が終わった後にアフタースクールとして美術を習いに行くことも、よくあるようだ)

実際のところ、芸術は、コミュニケーションであり、その人の内部から外へでていくものである。

CGを学校で勉強するときに、最初は、スケッチなどをするが、そのスケッチにしても、技術を鍛えるためではなく、その人の目に映り心象となったものを外に出す手段である。

学校の授業できまっているからとか、仕事で必要だからやるという目的は、芸術的な作業の時にはいったん脇に置いておく必要があるのではないかと思う。

まず何かを描いてみたいと思う、それは絵の具を使ってかもしれないし、鉛筆かもしれない。
そして描くことがおもしろいからいろいろと繰り返し書いているウチに、細かいところまで気になるようになる。
そしてその細かいことまで自分が表現したいように表現を加えていく。
その繰り返しで上達していくというのが本来の姿だと思う。

もちろん、スケッチが上達していないと伝えられないものがあり、そのレベルを望むからスケッチの練習をがんばるという一面もあるだろう。
でも本来の姿をわすれていては、本来の目的である「芸術」にも到達できないだろうし、そこにコミュニケーションするものがなければ、スケッチをしていても楽しくはないだろう。

本来の姿で作られた芸術作品は何か伝わるものがある。
それは技術のレベルとはあまり関係ない。
そして評価とも関係ない。
他社の評価を気にして作られた作品は、すでに本人のものではなく特定もしくは不特定な誰かの心から出たものであり、本人のから出たものではない。

「そういったものは、後からついてくるものだ」といつも言えるような状態で、芸術と関わることが大切だと思う。
それは犯されざる領域だろう。


芸術は技術と深く関係しているが、技術から始まるものではない。
しかし、あいにくCGはすべて技術と関係している。
そこに落とし穴があるように思う。

絵の具で絵を描くにしても、技術を勉強すれば、芸術が達成できると考えている人が多い。
そして、技術を習うことに一生懸命だ。
とくに、日本はその傾向が強いのかもしれない。
たくさんのHowTo本、学校などであふれている。

しかし絵の具をつかって絵を描くというのもコンピュータをつかうというのも一つの手段でしかないし、CGソフトはToolだ。

Melスクリプトを勉強するとき、いつもこの点に留意し、
自分の表現したいことができるためのMelを勉強するように心がけるようにしている。
 

2009年3月30日月曜日

練習 (10) for文

今、鳥を作っている、モデリングからリグまでやらないといけないのでいろいろと調べ中だが、今日は羽毛の表現のテストを行うときにfor文を使ってみた。
ポリゴンプレーンにトランスペアレントマップ付きの羽のテクスチャーを使い、
トランスペアレントの具合と、レイトレースシャドーの具合をテストするのが目的。

for文を使ったのはこのポリゴンプレーンを並べる作業。
1×5の比率のポリゴンプレーンを20行×20列ならべるためにfor文をネストして使った。
また、各プレーンの一部を重なり合うようにならべているので、x軸でローテーションして、
角度を付けて、プレーンとプレーンの間に隙間をとってある。

まず、メニューのポリプレーンからオプション画面を開き、
値を設定し、作成。
スクリプトエディターに表示されたポリプレーン作成のコマンドをコピペして使用。
移動に関しては、moveコマンドを以前に使ったことがあるので、
記憶をたよりにつかってみたら全く問題なく動作した。

{
for ($c=1; $c<20;>
for ($c2=1; $c2<20;>
polyPlane -w 1 -h 5 -sx 3 -sy 3 -ax 0 1 0 -cuv 2 -ch 1; $x=$c-1; $z=$c2-1;
move $x 0 $z;
}
}
}

最初はなぜかうまくいかず、Mayaが固まってしまったので、Mayaを再起動し、再挑戦したところ問題なく動いた。 (固まる前の文をみながらテキストに入力したので違いはないはずなのだが...。)



-----------------------
次にきれいに並んでいては、あまり効果がわからないので、 rand関数を使って、 moveコマンドで、xとyの値をランダムにした。
またx軸のローテーション値も、少しランダムにして変化をもたせた。


{
for ($c=1; $c<20;>
for ($c2=1; $c2<20;>
polyPlane -w 1 -h 5 -sx 3 -sy 3 -ax 0 1 0 -cuv 2 -ch 1;
$rnd=rand(.5,1.5);
$rnd2=rand(.1,.5);
$x=($c-$rnd);
$z=($c2-$rnd2);
move $x 0 $z; rotate -r -3 0 0;
}
}
}

そして出来たのが下のキャプチャー画像。



























今回は、コマンドをヘルプで調べたのはrotateコマンドのみで、
あとはスクリプトエディターへの表示を利用した。

for文もほぼエラー無く使うことができ、だんだん身についてきた感じがする。

2009年3月27日金曜日

練習 (9) lsコマンド:コンポーネントの選択

今回は、lsコマンドについて調べてみた。
きっかけはnClothでデブリのシミュレーションを行ったときに、どうしても小さな振動を繰り返す部分やコリジョン判定がうまくいかずいびつな形で、一箇所で回転を繰り返すもの、シミュレーションに関係なく平面を滑り続ける物などがでてきてしまう。
Dumpを上げればあるていどおさえることはできるが、ごまかさない限りは実用できない。

こららはひとつのポリゴン・オブジェクトなので、バーテックスレベルで各デブリをグループとして制御することができればなんとかなるかもしれないと思ったのがきっかけだ。

実際にそのようなレベルのスクリプトを書くことは今はできないが、
そういったスクリプトに関係ありそうなコマンドを一つづつ勉強していこうと思ったのがきっかけだ。

--------------------
さて、MayaにおいてGUIを使った作業は、
1.メニューから何かを作成
2.選択した対象に対して何かの操作をする。
の二つとなる。

とくに選択した対象に行う作業は、全体の作業からみて大きな割合をしめていると思う。

Melを使う目的でもある、「作業の自動化」においてもこの「選択」の手順は避けて通ることはできない。

しかしながら、この作業はGUIでやるとさほど意識する必要がないのだが、
Melでやるとなると、初心者には非常に取っつきづらい。
なにより以下の事を常に意識して操作する必要がでてくる。
1)選択対象の名前
2)選択対象が複数ある場合のID番号
スクリプト作業がめんどくさく感じる点でもある。

ただ、この操作をするためのMelのパターンを一度おぼえてしまえば、
選択対象に、メニューには無い思い通りの操作を手軽に適用できるようになる。
これは、とくに「デブリ」、「パーティクル」といった、
大量のものをコントロールする機会の多い
エフェクツ・アニメーションには役に立つのではないかと思う。

オブジェクトを選択して、その内容を表示するには、
「ls」コマンドを使うのは以前に使ったことがあるのでなんとなく知っていた。
それにLinuxのシェルコマンドと同じなので、Linux側で使う機会も多かったので親しみもある。

エフェクツ作業では、オブジェクトの選択も使うが、
バーテックスやパーティクルIDといったコンポーネントレベルで操作が必要なことが多い。

このコンポーネント・レベルで選択をしたものをリスト化し、
変数に代入することができればいろいろと使い道があるのではないかと思う。


よって今回はコンポーネント(ポリゴン頂点)を選択した状態で、どうなるかを調べてみた。

--------------------
まずポリゴン頂点を複数選択し、
ls -sl
を実行してみたところちゃんと答えが返ってきた。
// Result: polySurface1.vtx[255:257] //

Linuxのシェル・コマンドと同じなので、このあたりは問題ない。
-slを含めていくつか、必要になりそうなスイッチをヘルプで調べてみた。

-sl(-selection) :「選択」、現在選択しているオブジェクト/コンポーネントがリストされる。
例:// Result: polySurface1.vtx[255:257] //

-hl(-highlight) :「強調」、コンポーネントが選択されハイライトされているオブジェクト名がリストされる。(注:オブジェクトが選択されている場合は値はかえってこない。)
例: // Result: polySurface1 //

-g(-geometry):ジオメトリ DAG オブジェクトがリストされる。
例: // Result: dc polySurfaceShape1 //

これで、コンポーネントの番号と、そのノード名は取得できることが分かった。

この操作ではただ、値を表示するだけなので、
ちゃんとこの値を使うにはもっとやるべき操作がある。


一番よく使われると思われるのがこの値を変数へ代入する作業だと思う。

--------------------
まず作ってみたのが次のスクリプトだが、これはエラーになった
{
string $art;
$art = (ls -sl);
print $art;
}

// Error: $art = (ls -sl); //
// Error: Line 3.12: Invalid use of Maya object "ls". //

ls -slをエクスプレッションとして扱うために括弧で囲めばよいとおもったのだが、
うまく行かなかった。

--------------------
それでは、文字列変数に代入するということだから、" "で囲んだ方がよいのかと思いつけてみた。
( )内の結果が” ”で文字列として扱われるだろうと読んだのだが...。
{
string $art;
$art = "(ls -sl)";
print $art;
};

少し考えればわかることだが、” ”で挟まれたその間にあるものはすべて文字列で扱われる。
当然、エラーは出ないが、
(ls -sl)
と表示されただけだ。

--------------------
それでは、と記憶をたどって以下のようにしてみた。
{
string $art;
$art = `ls -sl`;
print $art;
}
// Error: line 3: Cannot convert data of type string[] to type string. //

そこで、変数になにか問題があるのかと思い変数名を変えてみたり、
最初の変数宣言を消してみたりしたが、うまくいかない。
やはりこのやり方もダメなのか...。
お手上げになってきた。

--------------------
ここで諦めるは、壁を突破できず、Melをマスターすることはできない。

そこで、もういちどエラーをよく見直してみた。
「string[]タイプをstringタイプには変換できない」といっている。

変数のタイプが異なるものをある変数へ代入しようとするとき、
Mayaは自動的に変換を行うことがある。
ヘルプのインプリシット変換がそうだと思うのだが、
「Maya は数値と文字列が混在していて、意図が明白である場合、
自動的に数値を文字列に、または文字列を数値に自動的に変換します。」

しかし、今回は文字列を文字列に代入しようとしているので、そのような変換は行われないはずだが...。

たしかに、よくエラーをみると「string[]」となっている。
これは配列型で、ひとつの変数ではない。
なぜこのようなエラーがでるのかを考えてると、
lsコマンドで返ってくる値が配列型になっているということだ。

たしかにデータの「代入」においてエラーがでている。
「`ls -sl`」の部分に関してはエラーはない。

ヘルプで、lsコマンドのところを見直してみた。

すると、いままで、ちゃんと見ていなかったが、大きく
戻り値
string[]
と表記してあった。
ヘルプはこのようなところもちゃんと読まないといけいないなと思った。

このコマンドが返してくるのは配列なのだ。


そこで変数を配列に変えてみた。
これでうまくいくはずだが。
{
string $art[];
$art[] = `ls -sl`;
print $art[0];
}

しかしエラーになる。
// Error: $art[] = `ls -sl`; //
// Error: Line 3.6: Syntax error //

さっきとエラーが違うので、さっきの問題は解決したらしい。

しかし同じ行にエラーがでている。

--------------------
今回、「配列」には時間を割きたくないので、適当にやってみることにした。

まず、記憶にある配列に関する決まり事をおさらいしてみる。
配列は宣言時には[ ]を使い「配列」であることを明確にする。
[]内は配列の初期サイズを明記することもできるし、空欄にしておくこともできる。
代入には[]に数字(配列のインデックス)を入れて特定の番号に値を代入する。

しかしここでは特定のインデックスに入れたいわけではない。

結論から言うと以下のようにしてうまくいった。
代入時の[]を省略した。

{
string $art[];
$art = `ls -sl`;
print $art[0];
}

これでちゃんと値を表示できた。

--------------------
あとでヘルプを見直すと、配列のリテラル表現のところにある説明がこれに該当するのだと思われる。

「配列型変数にリテラル値を代入する際に、明示的な宣言を使用してもしなくても構いません。」

最初に、この文章をよんだだけではおそらく理解できなかったと思うが
おそらく、こういう理由で代入時には[]を省略できたのだと思う。

しかしながら、この説明には、すこし矛盾を感じる部分があった。

--------------------
それを説明する前にまず、「リテラル」をはっきりさせておきたい。
「リテラル」とは、変数に対し、実際の変化しない値である「定数」を意味する。
元々、この言葉は「文字通り」という意味である。

「255」「fujiyama」など、いわゆる単なる数字や文字列がリテラルの代表例である。e-words

しかし、「配列リテラル」となると少し違ってくる。
配列のリテラル表現は、値(すべて同じ型)をカンマで区切って並べ、中カッコ({ })で囲みます。

これはFlashスクリプトでも似ているので、Melに限った決まりではないようだ。
配列リテラルは、角カッコ ( [] ) で囲まれ、カンマ ( , ) を使用して配列エレメントが区切られます。


ここで本題に戻るが、実は、lsコマンドで返ってくる値は、カンマではなく、スペースで区切られている。
ls -sl;
// 結果: pSphere1.vtx[67:70] pSphere1.vtx[87:91] pSphere1.vtx[107:112] //

スペースがカンマの代りと考えれば、それでいいのかもしれないが、なんとなく釈然としない。


<課題>
「配列」はもっとあとになって扱おうとおもっていたが今回、思いがけず配列を使うことになってしまった。
配列については、また今度くわしく調べたいと思っているので、その機会にこのリテラルのこともはっきりさせたい。


それから今回は頂点を選択したが、
複数の頂点を選んだ時、その番号が連続していると、ひとつの配列インデックスに代入されてしまう。
例:polySurface1.vtx[191:195]
これも将来的には原因をつきとめ、ひとつの配列インデックスにひとつの頂点の値が入るようにしたい。

 

2009年3月26日木曜日

未来のユビキタスコンピューティングと「情報」

このMicrosoftの映像を、見て「2010年宇宙の旅」を思い出した。
はっきりとは覚えていないが、ボーマン船長のお母さんが病院で治療を受けているシーンの前後に、壁一面に画像が表示されるようなシーンがあったように記憶している。



よく考えてみれば、当時の映画で描かれていたような技術があと、一歩の所まできている。

現時点では、入力方法や情報の表示方法は、いろいろな方法があり、個々の技術が完全に融合していないが、解決するのも時間の問題だろう。
ただインフラが整ったとしても、すべての情報や機能が使いこなされるまでは、今から数えても、まだ数十年かかるだろう。


このビデオの世界が現実になったとき、いろいろな情報が、より早く、より適切で、より多く、どこでも入手したり発信することができるようになる。

そのとき、自分はそれだけの機能を生かしてより有能になれるのか?
それともただの便利機能として、ただ、いままでにあったものの代りとして使ったり、娯楽に使うことで終わるのか?

コンピューター以前は、情報は場所と時間、入手できる経路にも制限があった。
それがインターネットの普及により、かなり減った。


これからは、それがさらに進歩する。
いつでも、どこでも、欲しい情報に即座にアクセスでき、発信したい情報をすぐに送ることができる。
「情報」というものに対する人々の考え方や感じ方が大きく変わっていくだろう。

いまは、情報にアクセスしたり、発信するためにコンピュータの前に座り、電源を入れ、必要であればUSBで機器を接続しなくてはならない。
新しい時代では、それらがどんどん無くなっていく。
情報をとりまく不便さがなくなり、ストレスがなくなっていく。

その時、本来自分が何を欲しているのか、そして何を発信したいのかが問われるようになるのではないかと思う。
「自分は何を欲しているのか?」という問いかけだ。それは「本当の自分」を知っていなければわからない。

コンピュータやインターネットの使い方を習ったり、新しい技術を勉強することでは、それは解決しない。
「本当の自分」を静かに見つめ直し、人に左右されず、自分が本当は何を欲しているのかを、少しでも見ることができりょうになったときに、「情報リテラシー」は向上するのだと思う。

そう考えるとソフトやハードの使い方を教えることで「情報教育」とすることは、なにか違っているように感じてしまう。
 

2009年3月23日月曜日

改訂: 文字列とは何か?(2:char型変数)

「文字列とは何か? (2:char型変数)」 を更新する予定だったが
色々調べていく内に、変数やらメモリやらの深みにはまっていき、整理がつかなくなってきたので、
頭の中を整理するため、再度「文字列」という言葉の意味だけを調べた。

内容も変char型変数には触れていないので、タイトルも

文字列とは何か? (2:言葉の定義)」
 
へ変更しました。

 
 

2009年3月22日日曜日

サイト: 苦しんで覚えるC言語

文字列について検索しているときに出会ったのがこ、この苦しんで覚えるC言語のサイト。
基本的には初心者がC言語を習得することを目的につくられている。

前書にあるように、より初心者がまよわず理論を理解し、なにより習得することを目的につくられている。

前書き:
1つ目は、筆者が通っている大学のC言語の授業がいい加減なことです。
説明不足のC言語用語を乱発し、余計なことまで説明する傾向が見られる他、
プログラミング自体も、ソースの写しにかなり近いのが現実のようです。

文字列のところを読んでみても、通常の学習書やサイトと違い要点をわかりやすく書いてあり、
自分のめざす主旨に沿っている。

いままでこのようなサイトには巡り合わなかったが、同じような疑問を持っている方がいることをしってうれしい。

現時点では読んだのはほんの一部なので、適切な評価はできない。
それに第二部、第三部にはまだ、ページが作成されていないところもある。
よくあるこの手のサイトのように途中やめにならず、最後まで完結していただきたいと思う。

自分がC言語を習う時にはこのサイトを使って勉強しようと思った。

2009年3月20日金曜日

文字列とは何か? (2:言葉の定義)

実はこのエントリでは「char型変数」について書く予定だったが。

いろいろと調べていく内にだんだん深みにはまり、考えに整理がつかなくなったので、気分転換と思考をシンプルにするために「文字列」という言葉自体をもう少し掘り下げてみた。

<調査2>
--「文字」や「文」ではなく「文字列」という言葉が使われるのは何故か?を明らかにする。

前回のエントリで、「文字列」は「文字」の集まりを示すコンピュータ用語であることは調べてわかった。


「文字列」という言葉を自分の「文字列」変数を使用した経験から考えてみると、


「文字列」は、であることもあるし、単語であることもある、またただの記号であったり、ただ文字の羅列で特別な意味はなかったりもする。
ただ、文字を連続的に列挙している状態を示している。
別の言い方にすると、文字が順番に並んでいるという表現もできる。

順番に連続して並んでいることを示すには「列」という言葉は適切だと思う。

...が、もともとの言葉は「string」である。
なぜ、列を意味する「Line」ではなく「string」(糸、紐)なのか?

これらの言葉をワードパワー英英和辞典で調べてみた。

「Line」には、確かに「一列に並べる」とか、「整列する」といったような意味がある。

一方「string」には、「次から次へと続く一続きの人、物、出来事」という意味がある。
例として「a string of visitors」 というと「訪問者の列」となる。

ある人の後に他の人が続き、その後ろにまた別の人が続き..という具合に次々とつながっていく様子が連想される。
これは勝手な解釈だが、「Line」というとすでにまとまった数のものを一列に並べただけのようなイメージだが、「string」にはその長さよりも連続姓自体に焦点があるように感じる。


「文字列型変数」では、長さは未定だが、「文字」が「連続している」ことは、はっきりしている。
「長い」という点を強調する単語ではなく、「次から次へと連続した物」であるということを強調している「string」というのは、たしかに的を得ている。

(C言語では、文字列をひとまとまりの変数のように扱うためには特殊な方法を使う。
基本的には配列を利用して連続したメモリ領域に保管する。
この方法は、配列の連続性が文字「列(string)」という言葉にイメージ的につながってくる。)

これで自分なりには、「string(文字列)」という言葉が理解できた。

付け加えるなら、一文字だけなら本来は「文字列」ではなく「文字」だが、
「文字列」型には一文字だけでも代入できる。
これは一文字の長さの文字列として扱っていると考えればよいのだと思う。


 

文字列とはなにか? (1:文字コード)

<なぜ「string」?>
Melで、文字を扱う変数の型は「string」となっている。
よく考えると「string」は糸とか弦のこと、文字なら「character」となるのではないかと思う。

まぁ、文字が並んで糸状になった物だから「string」かと考えても見るが、自分で勝手に考えたことなので裏付けもなく、納得いかない。

辞書で調べてみると「string」と言う言葉を文字に対して使うのはコンピュータの分野のみ、要するにコンピューター用語だ。

BINARYによると「character string」(文字列)ということなので、これを短くして「string」にしたのだろうがそれでもコンピューター用語であることには変わりない。
要するに、他の分野では「character string」という用語は一般的には使わないと考えて良いだろう。


--------------------
<疑問>
一文字しか代入しないこともあるのに、なぜ「文字」型ではなく「文字列」型なのか?
なぜわざわざ「文字列」という用語まで作ったのか?
なぜ代入する値を” ”ダブル・クォーテーションで囲む必要があるか?

いろいろ調べてみるとC言語やVisualBasicにはchar型というものがあるらしい。
char型変数に代入されるのは、「文字列」ではなく「文字(一文字)」だ。

文字を扱う変数型には、「文字」型と「文字列」型という二種類があることはわかった。
でもなぜわざわざ区別して二つも存在するのか?? 謎は深まるばかりだ。

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

<調査1>

まずそれを知るにはコンピュータ上での「文字」の扱われかたを思い出す必要があった。
コンピュータでは「文字」も「コンピュータで処理できる記号」として扱う必要がある。

「文字」自体は、人間の歴史の過程で、音声を記号化したものだが、
コンピュータで扱うには、電気または磁気信号に変換する必要があり、ハードウエアの設計上、
二進数の数字として扱わなくてはならない。ようするに「文字」をさらに記号化している。

「音声」→「文字」→「番号」→「二進数」 という具合に別の「記号(番号)」に変化している。

この「文字の記号化」は「文字のコード化」として知られている。

苦しんで覚えるC言語」というサイトの「[3]文字コード」にそれをわかりやすく説明してあった。

文字コードとは、文字に1対1で対応する番号をつけて表現する方法のことです。
例えば、半角の A には65番が割り当てられています。
つまり、コンピュータでは全ての文字は番号で表されており(以下略)


wikiによると、その歴史は電気通信の歴史とほぼ等しい。

ようするに、コンピュータ以前からアルファベットを記号化することは行われていた。
わざわざ特にコンピュータのために考え出されたことではないということだ。

ただ、コンピュータにあわせて、文字コードは整理されたと考えて良いだろう。

文字コードは、文字とそれに対応する二進数字の組からなる。
一文字に対し一つの二進数字が対応している。

その対応のさせ方は、いまでこそ統一されつつあるが、国、企業、時期によって違いがある。
Asciiコードとか、Unicodeとか呼ばれる物がその対応付けのバリエーションの一部だ。

そのため、必ずしも同じ「文字コード」が同じ「文字」を示すとは限らない。
それに食い違いが生じて表示されたものは「文字化け」と呼ばれる。

その対応付けは文字コードの一覧表で確認することが出来るが、
通常は二進数字ではわかりにくいので16進数に換算した表記がつかわれている。


ここまでで、コンピューター上では「文字」を「文字コード(二進数)」に変換して扱っていることをおさらいしてみた。

そこには同じ意味をもつ文字データが別の表現に記号化されている。

「文字」 <=> 「番号」

という具合に相互に対応しているのだ。



 

「Avatar(アバター)」 アーティスト募集中

ジェームス・キャメロンのプロダクション「Lightstorm Entertainment」が「アバター」のスタッフとして、ジェネラリストとコンポジターを募集している。 (2-pop forumへのリンク)



アバターはWetaが中心となって作業しているので、内容からして最終的なエフェクトの仕事ではない。

募集内容は、
モーションビルダーとシェイクを使って、シーンを作ること。 複数のパフォーマンスを統合し、アニメートされた要素とエフェクトを追加する。 トラッキング、カラー・コレクション、コンポジットも作業の内。 問題を自分で解決し、スケジュールに従い、要求に素早く答えることが求められる。 モーションビルダーの経験は不可欠。 アニメーションとレイアウト、色調整、ライティングの経験、劇場映画のカメラ技術の知識は採用に際し有利。 Pythonを使ったスクリプティングの能力もプラス。


おそらく、LAのスタジオで記録されたモーションキャプチャーのクリーンアップと、プレビジュのような作業だろう。
これで役者・キャラクタ、オブジェクト、カメラ、エフェクトの動きとタイミングを決め、大体のカラーのプランを作るのだと思われる。
どこまで求められるのかはわからないが、おそらくWetaに最終的なエフェクトを作ってもらうためのジェームス・キャメロンからの指示と言うことになるはずなので、動きなどに関しては最終的な物に近いクオリティーが求められると思うので、従来のプレビジュとは違い、かなり良い質の物ではないかと思う。


しかし撮影はたしか一年前に終わったというような話をきいたことがある。
モーションキャプチャーはTinTinと同じ、Giant Studioでおこなわれている。

12月中旬公開なので、3ヶ月前にエフェクトショットをすべて終えると考えると、8月終わりには終えて奥必要があるのではないか?。
今3月も後半なので、残り正味5ヶ月ほど。
ショットを仕上げるまでの時間とリテイクの時間を考えると、上記の作業はあと2ヶ月ぐらいで、すべて終えておく必要があるのではないかと思う。

もう関係者向けの映像は、上映されているらしいので、すでにパイプラインはできているのだろうが、3Dであることを考慮すると、クオリティーをつめる作業は通常よりは時間がかかるだろう。
まだこのような作業をしているとしたら、現場はせっぱ詰まってきているのではないかと思う。
(だからこそ募集してるんだろうけど...。)

それにジェームス・キャメロンと言えば完璧主義で知られている。
彼のところで働いた人で、労働環境に関してはあまり良い噂はきかない。
かなり細かいところまで追求するらしいし、スピードも要求する。
実際、知り合いの人とかも最期までアバターに関わることなく、途中で止めた人もいる。
環境についてきいてみたが、「Crazy」だそうだ...。

ちなみに本人はその「完璧主義」という噂についてついて下記のように言っている。
"People call me a perfectionist, but I'm not. I'm a rightist. I do something until it's right, and then I move on to the next thing."
みんな私のことを「完璧主義者」と呼ぶが、そうではない。 私は正しくあろう (「rightist」は右翼、保守派という意味。ここでは「正しい」という意味に、ひっかけているのだろう。) としているだけだ。 私は正しい姿になるまで何かを行い、それから次へ移るのだ。
こような姿勢に、予算の超過、きついスケジュールなどが重なってくるので、かなり大変な気がする。
いろいろ考えると応募する以前に気分が重くなってくる募集だ。

ところで映画自体は、すでに制作に関わった人は1000人を超え、制作費も3億ドル(約300億円)を超え、今までで最高の制作費のかかったパイレーツ3を上回る金額になりそうだとのこと。

VFXを大々的につかった、立体映画大作でもあり、話題には事欠かない。

下は、以前に公開されたティーザー・トレイラー




 

(予告編)くもりときどきミートボール

絵本「Cloudy With a Chance of Meatballs」をImageworksが映像化した作品の予告編が公開された。
Imageworksのデモリールには、予告編にはないスパゲティーの竜巻シーンがふくまれている。

スパゲティーのシミュレーションには、Mayaのヘアシステムを使っているが、Imageworksで独自の改良を加えてコントロールをしやすくしている。
Clothシミュレーションを使っているが、これはMayaにインテグレートされたインハウスのプラグインだそうだ。これを服だけにつかっているのかそれとも他の表現にも使っているのかは不明。
シミュレーション(Clothだけ?)チームは二月の時点で約20人。
シミュレーションのレンダラーはアーノルドを使用と聞いたが...???

二月の時点で、Clothアニメーターを募集していた。
プロダクションは6月末まで、公開は、2009年9月18日予定。





 

2009年3月18日水曜日

ハリウッドのVFX業界が抱える雇用体制の問題点とは

これも「withD」より、いつもお世話になっている鍋潤太朗さんの記事だ。
http://withd.jp/cg/trend/010207/3970.html
サブプライムが原因での不況はまだこの業界ではおきていないとみられるが、昨年のストライキがそのように影響しているとは思わなかった。

ま、うちの会社はただ仕事がとれないだけなんだけど...。

 

上杉裕世氏インタビュー(withD)

ウエブサイト「withD」に 2009.02.16付けで上杉裕世氏のインタビュー が掲載されていた。

 

練習 (8) 基礎の省略

実はfor文の練習とはいっているものの読んでくれている人はわかると思うが、自分が言っているように(初心者にとっては)単純なものばかりではない。
見慣れないコマンドやスイッチがいきなり使われているので、いままで述べてきたことと矛盾を感じこれでは普通の参考書と同じではないかと感じる人もいるかもしれない。

実際の所、Mel以外にもやることがたくさんあって、じっくり基礎を反復練習する時間がない。

また基礎練習のパターンをつくるにも、そのための裏付けとなる理論が、まだ自分の中でまとまりきっていない。
なのでそれが完成するのを待っていてはいつまで経ってもおわらない。


しかしながら、現在の転職活動に有利なように、また転職後にも困らないように、できるだけ短期でMelの技術を身につける必要があるのが実情です。
限られた時間の中で、応用が求められる環境にとびこめる準備をしておかなくてはならないのです。


なので、現実に自分のMelの習得には、
1)できるだけ実務で使用する。
2)ヘルプから必要な情報がすぐ見つけられるようにする。
2)エラーメッセージになれる
3)バグ処理になれる
4)実務に必要な「コマンド」が何かを見つける。
5)自分の理解力のレベルを上げる。

とうい点に重点を置いています。


言い訳がましいですが、それでも練習の中で、自分の理解のペースを崩すような無理はしないようにしています。そうしないと、ただ記憶するだけの従来の勉強法に後戻りするからです。

納得いかないことは、ほとんどやっていないし。
ただ記憶するだけのような作業はしていない。
できるだけ自分の知っている範囲の知識を使うようにし、
自分の理解を超えていると感じることは、早めに止めてあまり時間をかけないようにしています。

このブログは、初学者の人の参考にしてもらいたくて作った物でもあるが、自分のメモというのが第一の目的なので、そのあたりをご考慮いただけたら幸いです。


 

練習 (7) for文

前回のスクリプトはちゃんと動いてくれた。

しかし作業しているときに、loc2だけをすべて選択する必要がでてきた。
loc2をひとつにグループ化しておけばアウトライナーから簡単に選択できるのだが、
現時点では、

loc1
loc2_1
loc2
loc2_2
...

となっているので、選択するにはCtrlキー+左クリックで、1行置きに選択しなくてはいけないので、大変だ。
(もちろん、ステータスラインにある「名前別に選択」でワイルドカードを使用して入力すれば簡単にできるが、今回はfor文の練習のためにこの方法は使わない。)

これをスクリプトで選択するようにした。

{
select -clear;

for ($i=1; $i<48;>
string $l2Name = ("loc2_"+$i);
select -add $l2Name;
}}


これはエラーもなく動いてくれた。

 

練習 (6) for文

<状況>
前回のfollicleの続き。

ロケーターをコンストレインする方法は、ちゃんと動いてくれたが、キャラクタのサーフェイスがY方向へも動くため、地面にあるデブリを押さえつけるような形になることがあり、ちゃんとコリジョン判定できないことがあると想定されることに気がついた。

それでは、元々のサーフェイス自体をつかうのとあまり代りはない。
なので、シリンダはXZ方向のみ変化させるように変更することにした。


<練習>
これはコンストレイン時に、xzのみをコンストレインすることで解決する。
しかし後で、Y情報も利用したくなったときのためと、位置の微調整が簡単にできるようにするため、locatorを二つ使うことにした。

1つ目のロケーターAはfollicileへpointコンストレイン(xyz)。
2つ目のロケーターBは1つ目のロケーターへpointコンストレイン(xz)。
シリンダは二つ目のロケーターへペアレントする。

手順としては、
ロケーターBとポリゴンシリンダを、原点(0 0 0)に作成し、
それをすぐにペアレントする。
そして次にロケーターAをfollicleへコンストレイン。

{
for ($i=1; $i<48;>
string $lName = ("loc" + $i);
string $l2Name = ("loc" +$i);
string $fName = ("follicle" + $i);
string $cName = ("collision" + $i);

spaceLocator -name $lName;
spaceLocator -name $l2Name;
polyCylinder -name $cName;

select -clear;

select -add $cName;
select -add $l2Name;
parent;

select -clear;
select -add $lName;
select -add $l2Name;

pointConstraint -offset 0 0 0 -skip y -weight 1;

select -clear;
select -add $fName;
select -add $lName;

pointConstraint -offset 0 0 0 -weight 1;

}}

これを実行したところ、parentが実行されたあと、ポイントコンストレインのステップでエラーが発生。
// Error: line 22: Target list was empty or contained no valid targets. //
( // エラー: ターゲット リストが空か有効なターゲットが含まれていません。 // )

アウトライナーをみると、

loc1
loc2

が作成され、loc1が選択された状態になっている。


少なくとも「$lName」が選択されるところまでは実行されたのだろう。

そうすると問題は「$l2Name」のところで問題が起きたことになるが、よくみると
$l2Name変数に値を代入するところに間違いがあった。

ロケーターの名前が一番目のロケーターと同じになっていたのだ。

string $l2Name = ("loc" +$i);

これは以下のようになるべきだった。

string $l2Name = ("loc2_" +$i);

上記の間違いから、「$lName」と「$l2Name」の値が同じ「(loc1)」になっていた。
そのため、

1)「$lName」変数(値「loc1」)を使い「loc1」が作られる。
2)「$l2Name」変数(値「loc1」)を使い「loc1」を作ろうとするが、すでに同じ名前で存在するため自動的に名前が「loc2」になったロケーターが作られた。

アウトライナーを見ると一見、問題ないように思ったが、
本来は

loc1
loc2_1

となるべきだった。



それにより、ロケーター二つを選択するステップで、「$l2Name」を選択する時に、変数の値は「loc1」なのでloc1を再度選択しまった。
よってセレクションリストには、loc1が一つだけなので、上記のようなエラーがでたという具合だ。


これを修正して無事ちゃんと動いてくれた。

 

エラーメッセージとストレス

エラーメッセージはただスクリプトを実行した結果、実行できなかった物を表示しているだけなので正確な位置を示していないことがある。

ただし、そこで実行できなかったと言うことは少なくともその地点以前に問題があることはわかる。

自分が納得いかないエラーは、もしかするとエラーで表示している部分ではなく、
その行に関係する「変数」やそれ以前の部分(たとえば「;」の付け忘れなど)に原因があるかもしれない。


人と人が議論になるのは何が「正しく」、何が「間違っている」かということにおいてもっとも白熱した議論が繰り広げられる。
いいかえれば感情的になりやすく、非常にストレスを感じることでもある。
適度のストレスであれば、自身の向上のためにもよいかもしれないが、行き過ぎるとやる気がそがれる。


エラーメッセージは問答無用で、「あなたは間違っている」(少なくとも「あなたの入力したものは間違っている」と言っているので、当然ストレスを感じる。
しかも相手は機械なので、議論をする余地はない。
とりあえず自分の非を受け入れ、書いた物を見直すほかない。

それができなければ腹が立つだけだ。
スクリプティング、プログラミングには、ひょっとしたらそういった人格的な面の成長も求められるのかもしれない。


まぁ、それは行き過ぎた議論かもしれないが、ある程度エラーの内容を理解できなくては、混乱し、高いストレスを感じることは確かだ。
自分の経験でも、この行き場のないストレスから、それ以上スクリプトを続けたくないと思うこともよくあった。

こうして考えるとエラーを理解する方法も、学ぶ必要があるのかもしれない。

いま現在、以前ほどのストレスを感じなくなってきてはいるので、プログラミングやコンピュータに
に関する基本的なことを知れば、コンピュータに対する理解が深まり、エラーも理解しやすく、
あまりストレスは感じなくなるのかもしれない。

 

練習 (5) for文

<状況>
前回のfollicleへシリンダをコンストレインするスクリプトは、ちゃんと動いてくれた。

しかし、シリンダの位置を微調整できるようにしたいので、
1)シリンダをロケーターへコンストレインし、
2)そのロケーターをfollicileへコンストレインする
ことにした。


<練習>
手順としては、ロケーターAとポリゴンシリンダを、原点(0 0 0)に作成し、すぐにペアレントする。
そして次にロケーターをfollicleへコンストレイン。

前回の物に、ロケーターを作成する行と、ペアレントの手順を付け加えるだけでうまくいくはず。

{
for ($i=1; $i<48;>
string $lName = ("loc" + $i)
string $fName = ("follicle" + $i);
string $cName = ("collision" + $i);

spaceLocator -name $lName;
polyCylinder -name $cName;

select -clear;

select -add $cName;
select -add $lName;
parent;

select -clear;
select -add $fName;
select -add $lName;

pointConstraint -offset 0 0 0 -weight 1;

}}

これを実行したところ以下のエラー。
// Error: string $fName = ("follicle" + $i); //
// Error: Line 4.6: Syntax error //
// Error: select -add $fName; //
// Error: Line 17.19: "$fName" is an undeclared variable. //


特に間違っているようには見えなかったが$lNameの行の最後に「;」を忘れていた。

string $lName = ("loc" + $i);

これでちゃんと動いてくれた。


 

2009年3月17日火曜日

練習 (4) for文

<状況>
今、nClothを使ったリジッドボディーシミュレーションを行っている。
シーンの概要は、キャラクターが地面にあるデブリ(破片)を跳ね散らかしながらすすんでいくというもの。

バインドとラティスによりアニメーションされた、キャラクターのサーフェイスとデブリがコリジョンするようにしているが、コリジョン判定がうまくいかず、複数のデブリがからみあい、とんがった金平糖のような形になってしまう。

幸い、さほど厳密なコリジョンは必要とされないので、コリジョンにキャラクターのサーフェイスを使うのではなく、サーフェイスのコリジョン位置と同位置にシリンダをコンストレインしてシリンダをコリジョンさせることにした。

具体的には、キャラクタのメッシュにfollicleを作り。その各follicleへ一つづつポリゴンシリンダをpointコンストレインする方法を使うことにした。

余談だがfollicleは「毛根」と意味で、ヘア・システムを使用すると、一つの髪の毛の束をコントロールするためのノードとして、サーフェイス上に作られる赤い小さな○だ。真ん中に小さな棒が立っており、小さな押しピンのような形をしている。
通常はこのfollicleが複数作られて、髪の毛を作ることができる。
このfollicleは髪の毛を作るだけでなく、サーフェイス上にくっついて動くので、サーフェイス上のその位置と角度の情報をこのfollicleから得ることができる。
Melを使うことができない人には、サーフェイス上のある特定の場所の位置と回転情報を取得するには大変便利だ。
服についたボタンを作るなら、follicleをボタンを作りたい場所に作り、そのfollicleにボタンのジオメトリをペアレントコンストレインすれば、終わりだ。
あとは服がclothシミュレーションされていても、バインドされていたサーフェイスであってもしっかりくっついてまわる。(ただし、コリジョンはされない。)
今回はfollicleで得られる、サーフェイス上の特定の位置情報を利用することにした。

follicleの数が多い(今回は47個)ので、シリンダ作成とコンストレインを繰り返す必要がある。


--------------------
<練習>
繰り返しの処理といえば今、集中的にやっているfor文melなので、スクリプトでやることにした。
{ for ($i+1; $i<48;>
 { polyCylinder -name collision; select -clear;
  string $fName = ("fillecileo" + $i);
  string $cName = ("collision" + $i);
  select -add $fName;
  select -add $cName;

  pointConstraint -offset 0 0 0 -weight 1;
}}

このように入力し、実行したところ下記のエラーが発生。
// Error: {for ($i+1; $i<48;>
// Error: Line 1.23: "$i" is an undeclared variable. //
// Error: line 7: No object matches name: fillecile0 //
// Error: string $cName = ("collison" + $i); //
// Error: Line 5.33: "$i" is an undeclared variable. //

まず最初のエラーは、「$iは宣言されていない変数。(二回)」というものだ。
for文内で使用する変数は、
前もって宣言しなくても良かったはずだし、
そもそもMayaでは変数宣言しなくても、最初の代入時に自動的に型が割り当てられるはず。
何となく釈然としないまま、for・・・の前に
string $i;
を付けたところ、このエラーはでなくなった。

次の「fillecile0という名前のオブジェクトは見つからない。」というエラーはまだあるが、
これはスペルが間違っていることがすぐわかったので下記のように修正。
  string $fName = ("follicle" + $i);

しかしまだエラーが出る。
// Error: line 7: No object matches name: follicle0 //

よく見るとfollicleの番号がゼロから始まっている。
すでに作ってあるfollicleの関係上、「follicle1」から始まるように作ったつもりだったが...。

この数字は、for文のループ設定をしているエクスプレション部からとられているので、
その部分をよーくみると、
for ($i+1;
となっていた。
これではちゃんと動かないはず。
最初の変数宣言がされていないというエラーもここに問題があるとわかった。
for ($i=1;
と修正し、string $i; 不要なので削除したところ正常に動くようになった。

最終的にできたスクリプトは以下のようになる。

{ for ($i=1; $i<48;>
 { polyCylinder -name collision; select -clear;
  string $fName = ("follicle" + $i);
  string $cName = ("collision" + $i);
  select -add $fName;
  select -add $cName;

  pointConstraint -offset 0 0 0 -weight 1;
}}

<感想>
for文の変数部の入力間違いは意外と多い。
エラーは正確にバグの内容を示した物ではなく、あくまで実行した結果、なにが実行できなかったかを示すだけなので、その内容から原因を推測する必要がある。
今回もエラーの内容に矛盾を感じつつもそのエラーが意味することをそのまま修正しようとしていたため、不要な変数宣言を付け加えるという愚を犯した。
二つめのエラーの内容も注意深く考慮すれば良かった。
しかし、がエラーの量が多すぎると感じ多少圧倒されたので、ひとつづつ処理していくことにした。
それが今回のような回り道になった。

これはまだなれていないので仕方がないだろうが、そのうちより効率的なバグ処理が出来るようになりたいものだ。

 

2009年3月16日月曜日

メモ: アルゴリズム

アルゴリズムについておもしろく、わかりやすい説明をしてあるサイトがあった。

Nao SacradaさんによるNao's Mops ページ の 「条件判定と分岐

コンピュータを使う理由 (2)

さて前回、コンピュータを使う一番の理由は「処理速度」だと書いた。
付け加えて言うならば、よりその実感を得られるのは、「処理を自動化」したときだ。

これは初めてスクリプトを使って、いままで手作業でおこなっていた一連の作業を、一瞬で行った経験を持つ人には、わかっていただけると思う。

しかしGUIベースでソフトウエアを利用しているだけでは、その開発者以外に、実感を得ることは難しいかもしれない。
Photoshopで、画像にフィルタをかけて、その変化を楽しむことはあっても、その処理速度の速さに感動する人はほとんどいないだろう。
話が少しそれるが、Mayaでソフトボディーのシミュレーションをしたときに、処理速度に関しては感動よりもむしろイライラを覚える人の方が多いぐらいだと思う。

そういったGUIベースのソフトウエアでも、いくつかのステップを自動で処理できるようになったときには、少しながらコンピュータのパワーに感動する。

Mayaでスクリプトエディターから、一連の自分の作業をシェルフに登録して、ワンクリックで同じ作業ができるようになったとき、うれしかった人は多いだろう。

いままでコンピュータを使ったこともない人が、初めてExcelで表計算を行ったときに、SUM機能で一列に含まれる数字の合計が出せたときには、その便利さに感動を覚えるだろう。


こういった感動は「処理速度」とう範疇だけでは語れない。
もちろん「処理速度」はそのバックボーンにあるのだが、「処理の自動化」コンピュータを利用している実感が得られる大きなポイントだ。


--------------------
「処理の自動化」とは何か?

特定の作業、操作を
1)「ワンクリックで行える」
2)「任意のタイミングで自動的に行う。」
とうことだと思う。


それは、それまで人間が行ってきた
1)繰り返し行わなくてはいけない作業。
2)タイミングを知るためにさまざまな状態遷移を見張る作業
から解放してくれる。

またそれは別の視点から見ると
1)人間にも行える作業の自動化
2)大量の情報を処理しなくてはならず、非人間的な作業の自動化


プログラミングにおいて、これを実現するためのカギとなるのは何か?
それを考えたときに、思いつくのは
1)for文によるループ
2)比較演算子、if文による条件判定。
である。



いままでも演算子についてはいろいろと追求してきたし、、
最近、Melの練習ではできるだけfor文を使うようにしている、その一つの理由はそこにある。

普通に勉強してもfor文は最初に習う物だが、それはコンピューターの大きな利点だからだと思う。
まさに、コンピュータを利用するという本質をついている。


実際、for文をつかってsphereを作ってみるだけでも初心者には楽しいと感じる人もいるだろう。


実用的ではないかもしれないが、このように楽しいと感じること、コンピュータを利用していることを実感できることを繰り返し体験することは、ひとつひとつのコマンドを覚えるよりも初学者にとっては重要だと思う。

なぜかというと初学者はそもそもプログラムをしなくてはいけない理由がみえていないことが多いだろうし、実感もないからだ。
情報工学を勉強したことがないのに、仕事でMelを使わなくてはならなくなった人は特にそうだろう。

そして参考書などの例を使って一度や二度の実体験を終えたからと行って、それで身についたとは言えない。

より実感を高めるために、for文、if文を使っていろいろな練習を続けた方が良い。
そして繰り返し練習をすることによって、for文、if文の文法も身についてくる。
少なくとも複雑なスクリプティングにはいる前に、マニュアルを見ずに、バグ無くfor文、if文が入力できるようにまではしておきたい。
これは何も複雑なスクリプトを作れと言うのではない。
for文、if文自体ではなく、その中で使われる個々のコマンドなどはエラーがあっても気にする必要はない。それはまた別のことだ。

最初なら、sphereを複数作ったり、ただ1~10までの数字をスクリプトエディタに表示したり、そういったことを思いついたときに、繰り返すとよい。
大切なのは、
1)まずマニュアルを見ないで入力する。

2)エラーがあればまず、自分でバグを見つけられるかどうかトライする。
3)それでダメならマニュアルを見直し、本来の文法と自分の入力した物の差異を見つける。

4)なぜそのような間違いを起こしたのかをできれば記録しておく。
5)何も見ないで、習慣であるかのように考えることなく、何の苦もなく入力できるようにする。

実はこの練習が、以前のエントリ「プログラミング教育の難しさ。
で述べた学習のステップ「2)適用」に、あてはまる。

基礎を身につけるとは、マニュアルを読んでその情報を頭にたたき込むだけでなく、その知識を現実のものごとに何の苦もなく適用できるということだ。
マニュアルをみなくてもその詳細を思い出すために手が止まるようではいけない。
まるで友達にE-mailを書くかのようにすらすらと入力できる必要がある。
(ただしそこで習っていることに対してだけ。たとえばfor文であれば、中で実行するコマンドは、マニュアルを見てもエラーがおきてもかまわない。それはそのコマンドを習得するときに必要なら上記のようなステップを踏めばよい。)


詳しい文法を記憶することは「プログラミング学習」ではない。
それがバグ無く入力できるということに反映されていないのであればあまり意味がないからだ。

また、後でマニュアルをチェックすればよいというのは「3)応用」段階においては、言い訳にしかならないように思う。


就職したことがある人ならわかるだろう。「そんなことは学生の内にすませておけ」という段階だ。
「3)応用」の段階は「実践」の段階であり、基礎を身につける段階ではない。
基礎を身につけるのは「2)適用」までのステップだ。

 

2009年3月15日日曜日

コンピュータを使う理由 (1)

スクリプティングも含めプログラミングは、よりコンピュータの本質に近いところでコンピュータを利用していると思う。

GUIを使った作業では、本来のコンピュータの実力は発揮されていない。


では、コンピュータを使う一番の理由は何かを考えると、答えは「処理速度」だと思う。
もちろん、「人間の作業を楽にしてくれる」ということもあるが、それは「処理速度」が早いから結果的に人間の作業が楽になっているということだと思う。
コンピュータを利用することで人間の手作業より、3倍も4倍も時間がかかっていては誰もコンピュータを利用したいとは思わないだろう。

実際、人類がコンピュータという自動計算を行うシステムを長年にわたり考察してきたのは、この「処理速度」を実現することにあった。

そもそもコンピュータは「シミュレーション」をするマシンであり、その「処理速度の向上」を目指して作られた。
そしてその根底にはありとあらゆる既知の法則を利用できる数学的システムの構築があった。

--------------------
存在目的が「シミュレーション」と言うのは飛躍しているように思えるかもしれないので
少し説明しておきたい。

コンピュータが開発された背景をしるために、その歴史を振り返ったとき
有名なところでは、長い間初めてのコンピュータとされていた「エニアック(ENIAC)」がある。
wikiでは、「アメリカ陸軍の大砲の弾道計算を目的につくられた。」と書かれている。

また他のサイト(魔法使いの森)によれば

ENIACの構想を考え出したモークリーは、趣味の気象予測のために強力な計算機を必要としていたようです。

とこの発想を生み出す原動力となったのは、気象予測だそうです。

どちらも理論に基づく「物理現象を数学により再現すること」を目的にしている。
これは「シミューレーション」と読んでもさしつかえないだろう。
ようするにコンピュータ(機械式をふくむ)以前は、シミュレーションは人間の手による計算によって行われていたのである。

後に、コンピュータは、シミュレーション以外の分野へも利用されるようになってきた。
それらには「データ・ベース」、「インターネット」、「ワープロ」、「表計算」などが含まれる。

しかしそのすべての根底には論理学をふくむ、数学的理論が使われていることは初期のコンピュータの時代から変わっていない。
数学的理論とは、なんらかの物理的/非物理的な現象を解析し、それを数式に置き換えた物であると思う。
その数式にしたがい計算し結果をだすということは、一定の条件の下でその現象を再現することだ。
これも「シミュレーション」と読んで良いのではないかとも思う。

よって自分は「コンピュータの存在目的はシミューレーションをすること」と考えている。
--------------------

さて、上記でみてきたように、コンピュータの開発の最終目的は、
「シミュレーションによって得られる結果」を利用することであるが、
ただ「シミュレーション」だけが目的なら、機械式計算機と大量の人員により達成可能だ。

なぜコンピュータを開発したのかとういうと、その「速度」と「正確さ」を利用するためだった。
それはバベッジの解析機関においても同じだった。

よって、コンピューターを使うなら、CGにおいても、その「速度」と「正確さ」をより多く利用できるほど本来の使い方に近づいていると言えるし、使っている側もコンピュータを利用しているという実感がわくだろう。

そしてそれがスクリプトやプログラミングで得られる楽しさではないかと思う。

 

はてなブックマーク (2)

はてなブックマークrryuさんが登録していてくださっているのを発見。
rryuさんありがとうございます。

「変数とはなにか・どうして必要なのかを真剣に考察している。 2009/02/14」

たしかに真剣に考えています。
でもまだ結論は出ていないんですよね...。

やらなくちゃいけないとはわかっているんですが、結論をだすにはもっと哲学的な部分や数学的な部分、の知識が必要な気がして、ちょっと行き詰まっています。

あきらめたわけではないので、そのうちまたあらたな視点から切り込んで回答に近づければいいかなと思っています。

 

2009年3月14日土曜日

練習 (4) エクスプレッションでのfor文

今日、会社で「for文って、エクスプレッションで使えるの?」と聞いたら「使える」と即答。

そこで気をとりなおしてもう一度やってみることにした。
まずはシンプルなfor文を入力するがやっぱりエラーになる。

for ($i=0; $i<10;>
{ print $i
}


よくよく見てみると、print文のところの変数に「;」が付いていなかった。
Melではかならず「;」で終わってないといけない。
特にフロー制御文の括弧内は一行しかなくても「;」で終わっている必要があることを思い出した。


for ($i=0; $i<10;>
{ print $i
}

これでうまく動いた。

実際の所は上記のような単純な経過ではなかったが、要点だけを記録しておきたい。

 

就職活動 (6)

やっとR社へ申し込みできた。募集がかかってからすでに1週間経過しているのでもしかしたらすでに決まっているかもしれない。
それに今日は土曜日なので見てもらえるのは月曜日になるだろう。
本当は金曜日の午前には出しておきたかったが、頼んでいたカバーレターができたのが夜だったのでしかたがない。

月曜日に連絡して、リクルーターの注意を引いてもらうよう頼んでみたい。

このブログについて

Melon プロフィール:
脱サラ、渡米、現在LosAngelesでフリーランスのVFXアーティストとして活動中。
MayaをメインにVFXに関わり、現在7年目。
初めて所有したPCは富士通FM7、初めてのプログラミング言語はFベーシック。
ハンドル名「Melon」の由来はたまたま子供がメロンを食べたお皿が机にのっていたのを見たから、
「Mel On!」というような意味はありません。

注意事項(守秘義務w):
1)自分がこのような低レベルにいることを、知られるのがはずかしい。
2)気兼ねなく好きなことを書き続けたい。
以上の理由から、個人を特定できるような内容(関わった作品タイトルやその内容、最近の目立った行動、友達関係)は意図的に避けています。
私が誰かわかった人はどうか、心の中にとどめておいてくださいw


スキルレベル:
20年以上前にベーシックを少しだけ触った程度。
このブログを始めた時点では、Melに関しては、ほとんど初心者でした。
また、暗記が大嫌いで、きちんと理解しないと受け入れられない体質(?)です。
そのため「変数」や「if」といったことでさえ勉強するのにも抵抗がありました。
数学的知識もなくチュートリアルを見ても、10分で爆睡します。
そんな、文系(?)な自分でも努力で、どれだけ出来るようになるかに挑戦しています。


このブログを作った理由:
Melの勉強の過程で考えたこと、集めた情報の記録。
どこのプロダクションへ行っても参照できるようにするためです。
多くのプログラミング入門書では、コマンドの使い方や構文などに力を入れていますが、考え方については、あまり力を入れていないように思います。
教える側も、考えることが重要だとは理解しているようですが、教えるほどのレベルになっていると、初学者がどのように考えるかは、細かなところまで忘れてしまっているようです。
Web上では、このプログラミングの熟練者(教える側)の情報はあふれており、初学者の立場で自らの経験をつづるブログも散見できます。
しかしながら、両者の意識の違いを埋める物は、少ないように見えます。
自分のスクリプト学習を記録していくことで、考え方や意識の変化を知っていただけると思い、それが初学者が勉強を続けて成長していくときのミッシングリンクを埋められればと思っています。




このブログを公開した理由:
当初は未公開でしたが、以下の理由から公開に踏み切りました。
1)自分を戒め、戒めMelの勉強を継続するため。
2)他の学習者にスクリプト学習に関する有益な情報を与える。
3)初学者がつきあたる問題と解決策を共有し、初学者のストレスを減少する。


最近のエントリについて:
最近はMelに限らずVFXに関して幅広い情報や、日本の方に届きにくい情報なども発信しています。
仕事としての「VFX」を俯瞰的にみて、Melの位置づけを再確認することができたり、Melのアイデアが得られることもあるので、当ブログの趣旨からはずれてはいないと思っています。

CG情報を幅広く伝えることについては、すばらしいブログが他にたくさんあるので、他で見ることが出来る情報は、自分にとって後ほど見直したい情報でない限りはとりあげません。

最近はアクセスも増えたため、公共性を重視して内容や言葉のわかりやすさには、ある程度気をつけていますが、自分用のメモであることは変わっていません。
なので、主観に満ちており、間違いもあるかもしれません。
また、思いついたことをただ書いているので、たまに混乱にうもれたまま読みづらい文脈になっていることもありますが、そのあたりは、ご容赦ください。


初学者の方にお願い:
このブログでは初心者の壁を破るためのいろいろな試行錯誤を記録していくことで、同じような初学者の方の役に立てればという思いがあります。

初めてプログラミング言語にさわったのは、今から20年以上前で、残念ながら、そのころ抱えやすかった問題や気持ちは忘れてしまっています。

Melにかぎらず、いろいろな、スクリプト/プログラミング言語を習得するにあたり、初心者はどんな壁にぶちあたりどのようなことにストレスを感じるのか?

このブログを読んでくださっている方で、
「自分はこのような壁にぶち当たっている」、
「このようなことにストレスを感じている」

という経験談など、
Melonあてにメールで教えていただけるとうれしいです。
(メールはブログの左にあるフォームから送ることが出来ます。)

もちろん、どんな質問でも結構です。
簡単な疑問が見過ごされ積み重なってきたために、学習の際に乗り越えるべき、壁が大きくなっている可能性があるからです。

私は情報工学の学校には行ってもいないし、プログラムの専門家でもないです。
VFXに関しても、小さなプロダクションでの経験しかありません。

しかし、自分の経験を生かして、その壁を破るための策がないかを模索してみたいと思います。
 

最後に著作権について
当ブログに引用された文章、イメージ、ファイル、ムービーの著作権は、それぞれの著作者に帰属します。
また著作者Melonによる文章、アイデア、イメージ、ファイル、ムービーについては、無断で転載や利用、放送・出版は固く禁じます。
(C) 2009-All Right reaserved melon 
 
改訂:2010/01/08
 

2009年3月13日金曜日

練習 (3)

pointlightsの明滅のエクスプレッションがうまく作れなかったのが気にかかるので家に帰ってもやってみた。

for文は、もしかしたらエクスプレッションでは使えないのかもしれないと思ったので、
新しいやり方を使うことにした。

まずシンプルにして、
frame番号に応じて明滅するという点だけを実現することにした。
ひとつのスポットライトでそれができれば後はコピーでそれをライトの数だけ作ってやればよい。

まず作ったエクスプレッションは、
if (Frame == 1){
pointLight1.visibility=1
}else {
pointLight1.visibility=0
}


がこれもエラー
/ エラー: アトリビュートが見つからないか、変数に '$' が見つかりません: Frame //
// エラー: }else {
//
// エラー: Syntax error //
// エラー: } //
// エラー: Syntax error //
// エラー: } //
// エラー: Syntax error //
// エラー: An execution error occured in the expression expression1. //
// エラー: 編集後のエクスプレッションが無効です。 //

よく見るとframe」とすべきところがFrame」になっていた、大文字と小文字の違いだ。
でもそれだけではエラーがきえない。
色々試しているうちに、各行のステートメントの最後にセミコロンが抜けていたことに気がついた。

MEL ステートメントはすべて末尾にセミコロンを付ける必要があります。多くの場合、これは絶対条件です。 Mel Help)

if (frame == 1){
pointLight1.visibility=1;
}else {
pointLight1.visibility=0;
}

これで正解! 

ちゃんと動作してくれた。
ポイントライトがフレーム1でのみ点灯し他のフレームでは消えている。
あとはこれをポイントライトの数だけつくってやればいい。
フレーム番号=ポイントライトの番号でよい。

ただ、ここでこのエクスプレッションをコピペして、
フレーム番号とライトの番号を1行づつ手で変えていたのでは、
手でキーフレームをうっていくのと大差ない。

そこでエクスプレッションをMelスクリプトで作ることにした。
目的は
if (frame == 1){pointLight1.visibility=1;} else {pointLight1.visibility=0;}
if (frame == 2){pointLight2.visibility=1;} else {pointLight2.visibility=0;}



if (frame == 8){pointLight8.visibility=1;} else {pointLight8.visibility=0;}
というエクスプレッションをつくることなので、
先ほどのエクスプレションをもとに
for文とevalを使うことにした。

for文のエクスプレッション部の{ }を忘れたり、全体をブロックに入れて、変数のスコーピングをわすれたり "\n" を間違えて "/n"と書いたりして、何度もエラーにぶちあたったが、なんとか出来た。

{
for ($i=1; $i<9; $i++)
{$command = ("if (frame == " + $i +"){pointLight" + $i + ".visibility=1;} else {pointLight" +$i+ ".visibility=0;}");
print ($command+ "\n");
}
}


これをスクリプトエディターで実行すればスクリプトエディターのヒストリ欄に
以下のエクスプレッションが表示されるので、これをエクスプレッションエディターにコピペ。

if (frame == 1){pointLight1.visibility=1;} else {pointLight1.visibility=0;}
if (frame == 2){pointLight2.visibility=1;} else {pointLight2.visibility=0;}
if (frame == 3){pointLight3.visibility=1;} else {pointLight3.visibility=0;}
if (frame == 4){pointLight4.visibility=1;} else {pointLight4.visibility=0;}
if (frame == 5){pointLight5.visibility=1;} else {pointLight5.visibility=0;}
if (frame == 6){pointLight6.visibility=1;} else {pointLight6.visibility=0;}
if (frame == 7){pointLight7.visibility=1;} else {pointLight7.visibility=0;}
if (frame == 8){pointLight8.visibility=1;} else {pointLight8.visibility=0;}


ちゃんと動いてくれました!

余談だが、上記Melスクリプトの「else」の前に最初は全角のスペースが入っていたためエクスプレッションエディターでsyntaxエラーが発生していた。
実はMelスクリプト自体はこれでも動作し、上記のようなエクスプレッションが出力される。
しかしスペースが全角のため、エクスプレッションエディターにコピペするとエラーになってしまう。

それはMel内では、文字として処理され、エクスプレッションではコマンドとして処理されるからだろう。
しかしおそらくこれは日本語環境独自の問題ではないかと思う。

それにしても、最初はできないかと思ったが、なんとか粘って動作する物を作ることができてうれしい。 

 

練習 (2)

今日は、ポイントライトの点滅をアニメーションするためにMelにチャレンジした。
まず、8つのポイントライトを作り
フレーム毎に順番に光っていくようにする。
ただし次のフレームに移動したとき、前フレームで点灯していたポイントライトは消えるようにする。

エクスプレッションでいけるのではないかと思ったので試してみることにした。
まず
pointLight1.visibility =0
でライトのvisibilityがoffにできることを確認。
あとは、Lightの番号を1-8までフレーム番号に応じて変更してやれば、良いだけなので、frameとevalを使えば、なんとかなるだろうと試してみた。

$light = "pointLight"+frame+".visibility =0";
eval($light);

しかしエラーになってしまう。
// エラー: } //
// エラー: Syntax error //
// エラー: An execution error occured in the expression expression1. //
// 結果: expression1 //

$light = "pointLight"+frame+".visibility =0";
print$light;
にすればちゃんと動作しているので$light変数の中身frameはちゃんと動作している。
問題はevalの方だ。
エクスプレッションでもevalを使用できるので使うのは問題ないが、evalが評価するのはコマンドだ。
ここではノード名とそのアトリビュート名しかないのでエラーになるのだろう。

いろいろとためしたが結局諦めて、Melでキーフレームを自動的に打とうとおもいついたが、
キーフレームの打ち方がわからず、最終的には、Melはあきらめ、手でキーフレームを打った。


 

就職活動 (5)

昨日は、新しいデモリールを作り終わったので、今度はショットブレイクダウンだ。
カバーレターは知り合いのネイティブに頼んだので、すべてそろえば明日の朝にはE-mailできそう。

すでに一週間経っているので、もしかしたらすでに遅いかもしれないが、やるだけやってみよう。

 

「ブログの説明」変更

ブログのタイトル「毎日、Melスクリプトの勉強!!」のすぐしたにある「ブログの説明」を変更しました。

(旧)Melを勉強していく過程で、調べたことや、考えたことを記録していくためのブログ

(新)プログラミング初学者の壁を破る!

変に感じる人がいるかもしれませんが、自分にとってはこのほうが、このブログ設立の理由に近いように思うので変更することにしました。
もしかしたら時間が経つとまた違和感を感じて変更するかもしれません。

 

アクセス数の倍増 と お詫び

昨日から、なぜかアクセス数が倍増している。
文字どおり、昨日は一昨日の二倍、そして今日は日本時間18:40の時点ですでにその二倍に達している。おそらく数日すれば、またもとのアクセス数におちつくと思うが...。

アクセス数増加の原因は相互リンクをはっている「CGトラッキング」さんの「World builder」に関する記事と、「はてなブックマーク」に登録していたけたことが理由だとにらんでいるが、自分が利用しているアクセス解析ではそのあたりは正確には反映されていない。


このブログへアクセスしていただいている方は、ログ分析からみるとCG系の会社よりも大学など情報処理系の団体からのアクセスが多い。
おそらく内容的には、プログラミングの基礎に関することが多いからだろう。

残念ながらCGに関すること、特に「Mel」という言葉がタイトルに含まれているにもかかわらず、Melに関する内容は現時点では少ない。

CGに関する情報を期待しておとずれた方は、そういった情報がすくない点でがっかりするだろう。

タイトル通りMelを期待してきた方は、タイトルで「Mel」を語っていながら「Mel」に関しては非常に初歩的なことをぐだぐだとやっているので、何の足しにもならないと感じるかたも多いだろう。

また情報処理系を期待してこられた方は、私の知識の浅さからくる理論の堂々巡りに辟易するかもしれない。

そういったことを期待してクリックされた方には、この場を借りてお詫びいたします。


言い訳させていただくと、当ブログの設立目的は、
1)自分のMelスクリプトの学習を通しプログラミング言語の初学者がぶちあたる壁をみつける。
2)それを少しづつでも崩していく、
3)その過程を記録していく
4)後で自分の考えなどを見直すためのノート代わり、
5)自分の仕事への気力をたかめるため
つけくわえるならこのブログを公開したのは、
6)自分の理論の正しさと間違いをブログを通し、他者に確認したい。
からである。


なので、現時点では、CGに関する情報は、
「自分の将来の参考に残しておきたいもの」、
「自分の気力を維持したり、鼓舞するもの」
なおかつそれを書く時間があるときだけ、このブログに載せている。

あえて付け加えるなら、私のロサンゼルスでの6年にわたるVFXプロダクションの経験をよりステップアップさせることがMelスクリプトの勉強を始めた理由である。
それはただの名声を得ることよりも、自分への挑戦と、仕事への充実感を得ること、そしてそれらを通して家族を守ることがその目的です。
なので、学習する視点、このブログのエントリーの視点は、そこに裏打ちされたものです。


そういったことをふまえた上で、このブログを応援していただきたい。
他とは「ことなる視点でかかれたおもしろい内容がある」と感じていただければ幸いです。


 

はてなブックマーク

「はてなブックマーク」にて、kutakutatriangleさんに当ブログのエントリー「プログラミング教育の難しさ。」に関して、すばらしいコメントをしていただいているのを見つけました。

以下に引用させていただきます。

今まで私も感じていた「既存の技術書の限界」や「プログラミング初学者が陥ってしまう仕組み」を見事に言語化しているエントリー。今後のプログラミング学習書にこの記事で指摘されている点が反映されてほしい。 2009/03/12

「ひとりよがりの理論か?」とも思っていたのですが、主張に賛同していただけるだけでなく、「見事」とまで言っていただき、大変光栄に思います。

kutakutatriangleさん、大変すばらしい評価、ありがとうございました。



 

2009年3月12日木曜日

就職活動 (4)

今からR社用のデモリールを作る。
募集があったのが金曜日、専用のデモリールを作るのを決めたのが昨日。
昨日は不覚にも早くから眠ってしまって何も出来なかったので、今からやるしかない。
今、木曜日AM2:35できれば明日までに終わらせて、出社前までにはwebへのアップロードは終わらせたいので、今日は徹夜になりそう。

がんばろう。

更新:
AM5:00  デモリールのコンプ終了。今レンダー中。 いままでのデモリール中、最速のコンプ時間。w

AM6:00 レンダリング約50%終了、あと1時間、いまのうちに寝ておこうか...。

AM6:30 頭が痛くなってきたのでやっぱり寝ることにする。

結局7:00まで起きていたので、そのままデモをwebへアップロード開始。
子供が起きてきたので相手をして、8:30から少しねて、アップロードの完了を確認。
これから仕事





 

改訂; 3月11日の「プログラミング教育の難しさ。」 

このブログは、ある考えが思いついたときに忘れないうちに記録することを主目的としているため読みにくい文章になることが多いのですが、後から読み返して要領を得ないようであれば、書き直すことがよくあります。

しかし、ブログを公開してからは、リピータの人もふえてきたので、内容が大きく変わった物については今日から、「改訂」情報のログを改訂日に残すことにしました。

ただ、「自分のための記録」という点には変更はなく、読みなおす際に邪魔になるような「改訂前の文章」を残すことはしていません。
読むことができるのは改訂された後の文章だけです。

この点においては、読者を意識した書き方にはしていませんが、ご了承ください。


--------「改訂」情報------------
3月11日のログ
プログラミング教育の難しさ。 
をまとめなおしました。




 

2009年3月11日水曜日

練習 (1)

今日は、二つのcloudテクスチャーのRipples(波紋)Yアトリビュートのコネクトを行った。
親となる方を操作すれば子の方は自動的に同じ値をとるようにしただけだが、
できるところからやるために、普段ならコネクションエディターなどを使うところもMelでやることにした。

ただ、本来ならアトリビュートのコネクションをするわけだが、今回はより簡単にすませるためにエクスプレッションで処理することにした。

エクスプレッションであれば目的のアトリビュートをどのように表記すればよいかを調べて、二つのノードのアトリビュート名を=で結ぶだけでOKだから、調べることはアトリビュート名だけでいい。
幸い経験からアトリビュート名の表記は 「ノード名.アトリビュート名」という風に「.」で区切ればよいことは知っていた。

Mayaのヘルプからテクニカルドキュメント > ノード(英語)とたどり「cloud」の項目を調べた、目的のアトリビュート名「ripplesY 」を「ripples」で検索して発見、エクスプレッション・エディターで、「cloud1.ripplesY = cloud2.ripplesY」と入力してエクスプレッションを作成。

思った通り動作してくれた。
Helpの「ノード」は英語なので、苦手意識があり、いままでちゃんと見ることはあまりなかったが、検索を使い目的のアトリビュート名を探すと簡単に正式な名前が見つかるので、意外とつかえるなと感じた。



 

構文 (3) for文

昨日から、できるだけ作業にMelを使うようにした。
とりあえずは、for文を使う機会があれば、できるだけ使うことにしている。
昨日は、テクスチャー見本のために、スフィアを複数並べる必要があったので、
とりあえず5個を縦にならべるFor文を作った。

最初は条件式の( )内で、それぞれを;で区切るのを忘れたためにエラーになった。
また実行する際に、文全体を{ }に入れないとちゃんと実行されなかった。
動作したスクリプトは以下の通り
{for ($pp=1; $pp < pp="">
{polySphere;
move 0 $pp 0;
}
}

--------------------
いくつか実験もしてみた。

<実験1;for条件文の変数名を変える>
なんでもためしてみないと気がすまない質なので、
初期値を代入する変数名はよくある$iではなくわざと$ppに変えてみた。
当然ながら、ちゃんと動作するが、見慣れた$iでないと[これは何の変数だったか?]と考えてしまう。
やはり習慣的に$iにしておくほうが、よけいなことに気を取られなくて良いと思った。


<実験2; 条件を複数行で書いてみる>
また条件分はエクスプレッションであるなら、行を変えても用をなすと思ったので、
1エクスプレッション毎に行をかえてみたがもちろんちゃんと用をなす。
しかし条件分は、さほど複雑になることはないので、1行にまとめて書いた方がみやすい。
例;
for (
$pp=1;
$pp <>
$pp=$pp+2)


<実験3; 条件式以外のエクスプレッションをfor文の( )にいれてみる>
気がついたのはfor文の( )内はエクスプレッションであるが、複数のエクスプレッションが存在している。
ふと思うと、[複数のエクスプレッション]=[ブロック]とうことだから{ }を使うべきではないのか?という疑問がわいてきた。
for文の場合、実行内容を{ }に使うので、条件部分には( )を使った方がわかりやすいので、特別な使用例なのだろうと推測する。
ためしに条件分を書くところに、いくつかの行を加えてみたら案の定エラーになった。
条件文の中は複数行存在するが、それは限定された使い方であり、決められた通りの式しか記述することはできない。


{for (
$pp=1;
$pp < (100/10);
$pp=$pp+2;
$c=2;
$tr=6;)
{polySphere;
move 0 $pp 0;
}
}

// Error: $pp=$pp+2; //
// Error: Line 4.10: Syntax error //
// Error: $tr=6;) //
// Error: Line 6.7: Syntax error //
// Error: }; //
// Error: Line 10.1: Syntax error //

もう何回か使えば、For文はバグ無しで入力できるようになりそうだ。



 

2009年3月10日火曜日

コマンド (1) xform

いろいろなMelでよくみかけるコマンドのひとつにxformがある。
印象としては、オブジェクトの移動、回転、スケールを一つにまとめたような感じ。
なんでわざわざこんなものをつくってるんだろう?
移動、回転、スケールとダブるなら、いっそxformだけにしてもいいような気もする。

まずHelpで調べてみた。
xform
トランスフォーム(xform)
オブジェクトを移動、回転、スケールすること。

「移動(move)」、「回転(rotate)」、「スケール(scale)」との違いは、
xform は「照会(-query)」が可能だが他は「照会」が不可能。

たとえば選択されているオブジェクトから、座標値、回転角、スケールに関する、現在の情報を取得し、そこに数値を加えて変更することができる。
そのことから、そのシーンのオブジェクトの状況に合わせてなにかをする場合にはこれを使うと便利がいいことがわかる。
だから、頻繁に現れるのだろう。


他にもいろいろ違いがあるようで、「回転」をひとつとってもいろいろな方法が使える。
もちろんrotateコマンドにもそれなりの特徴があるようなので、それぞれ特徴にあった使い道があるのかもしれない。
詳細はまた後程、しらべてみたい。



 

プログラミング教育の難しさ。 (3月12日改訂)

プログラミングの入門書は、ありきたりの手順で説明したものがほとんどのように感じる。
大体、変数の説明から入り、構文、フロー制御などをならい、それをどう使うか例にならいつつ応用を身につけていく。

この手順では、学習の間に出てくるいろいろな疑問が解消されることはなく進行していく。
まったくの初心者はどんどん出てくる見慣れない新しい知識に、ついていくだけで精一杯。
基礎編は短く、応用に入っていく速度は速い。うかうかしているとすぐに「プログラムを作ってみよう!」とか「応用編」のページになってしまう。

だが、「プログラムを作る」段階では、アルゴリズムを考えていく段階にはいっているのだが、アルゴリズムの組み立てに集中したり、そのおもしろさに気づくことができないことが多い。
それは、そこまでに説明された基礎知識をしっかりと身につけず曖昧なままだからだ。
構文の間違いや、コマンドの使い方を調べ直すのに、時間をとられる。
「プログラムは難しい」「こんなに短い基礎さえ自分には難しく感じる」「自分には向かないからプロに任せておこう」と思い始め、その本は途中からよまれることなく、積まれていく。

そういった教え方をする本に限って、
「プログラムは、自分で試行錯誤してたくさん作ること」
「先輩達の書いたプログラムをじっくりみて勉強する。」
「それが上達の早道」
と書いてある。

一理あるし、それしか方法がないので読む側も「エラーに挫けず、難しくてもなんども基礎に戻りつつ繰り返し練習しよう!」と思い頑張るわけだが、初心者にはその気力さえ続かないことがある。


基礎の説明をしてあるところでは、「変数」や「フロー制御」など、「最低限の」構文とコマンドについて説明はされているものの本当に目の前にあるコマンド最低限のプログラミング用語の説明で終っている。
その知識がうまれた背景や、しっかりと理解するための裏打ちとなる知識は省かれている。
理解を深めるような配慮といえば、当面のコマンドなどを「擬人化」して説明したり、プログラミングの世界とは違いあいまいなルールが通用する世界での「たとえ話」がほとんどだ。

そういった書き方を非難するつもりはないし、実際そうするしかないのだとは思うが、読んでいてなんとなくはぐらかされたような気持ちになる。

実際、そのような説明を読んでわかった気持ちになっても、頭には入っていないことが多い。
詰め込み教育になれた、記憶力の高い人は別かもしれないが、
自分のように記憶力が悪い人間には、ついていくのが難しい。

このような世界で生き残れるのは、自分の感じた疑問を自分で解決することが出来る人だけだろう。

しかしながら「プログラミング」の世界は、初心者に対してはそれほどあまくない。
「プログラミング」を勉強すると言うことは、「コンピュータ」という大きな分野に属する部分を勉強することでもあり、「コンピュータ」を勉強すると言うことは、人間の知識に関する哲学を勉強することでもある。
膨大な知識と知恵がつながり、それらが歴史を通じて発展し「プログラミング」というものに到達している。
哲学、記号論、数学、電子工学、社会情勢など様々なことがそのバックグラウンドにあり、一朝一夕に身につけることはできない。

それは大学などで専門教育のカリキュラムとして教えられることでもある。
ただ、大学のカリキュラムでも、プログラミングを習うだけの目的には、ポイントがずれていたり、不必要な情報が多すぎたりすることがあるし、これでも説明が足りないこともある。
大学生なら説明が足りない部分を、自習で補う時間はあるが、たくさんの知識の中から自分に必要な情報をみつけるには社会人には時間がたりない。


以上に述べたような点で、理想のプログラミング入門書には、基礎的な事柄をごまかしなく、本当に自分が勉強していることをしっかりと理解できる裏打ちされた知識。 そして適用する力を身につけることができる説明がほしいと思う。しかもそれが出来るだけ短時間で出来るとなお良い。
それには、作者の広い知識と深い理解がかかせないし、プログラミングの作業に必要な物は何かといった要点を見抜く力が必要だ。


この学習がどのように進行していくかを簡単に示すと
1) 理解(記憶が主目的ではない。理解すれば記憶される)
2) 適用(知識を実際の作業にあてはめて使えるようにする段階)
3) 応用(具体的な個々の事例、他の分野の事柄にあてはめて用いる。また、相手やその場の状況に合わせて変化させて用いること。(MSN) )

の順番である。
なんらかの技術を身につけるにはこの順番を踏んでいくわけだが、
プログラミングの学習でくじけるのは、
「(1)理解」が不十分なので、「(2)適用」がスムースに行かず「(3)応用」が出来ない。とうことではないかと思う。


特に今問題としているのは、(1)の「理解」である。
これがちゃんと出来ていなければ、後には何も続かない。

「プログラミング」のしっかりとした基礎知識を身につけるには、「コンピュータ」に関連する膨大な量の情報(知識、知恵)が必要だ。
とても奥が深く幅広い。
しかし、その広大な海に漕ぎ出すには、不十分なガイドばかりだ。

情報が多すぎるので、自分で調べるにしても「何を調べればよいのか」ということを示す地図だけでもほしい。「○○を深く知るには××を調べよう」というようなちょっとしたガイドでも助けになるかもしれない。

願わくば、プログラミングの知識を裏打ちしてくれるだけの最低限のエッセンスをまとめてあれば非常にありがたい。

そういった説明は「うざい」、「既存の入門書で十分だ」と感じる人は別だが、自分は違う。

地球の地図を作ってきた人たちは、その必要性と需要に気づいていたからこそ、それを苦労して作ってきた。
「プログラミング」という領域にそういった地図が存在しないのは、その必要性と需要に気がついている人少なく、また、それをまとめることが難しいのかもしれない。


いままでそのようなことを成し遂げ、初心者向けで理解しやすかった本は、ただ一冊だけだった。
それは「コンピュータ」を解説した本で、「TRON」でおなじみの「坂村 健」氏による「痛快!コンピュータ学」という本だった。

大学の先生には珍しくとても平易な文章で書かれて いて、尊敬する。必要と思われる部分にきちんと歴史的な記述も入っていて 理解を妨げるものは何もない。情報工学を一から理解するにはベストな 本じゃないだろうか(riywo氏によるリビュー

この本は初心者向けにコンピュータのことがわかりやすく書いてあるにもかかわらず、コンピュータの歴史や、エッセンスが簡略にまとめられており、読むだけで、コンピュータの骨の部分がしっかりと理解できる。
また、「コンピュータは何か」を調べるための勉強にも、この本がおおまかな地図となり、その後の勉強を切り開いてくれた。

--------------------
このブログを書いているのは、将来、「プログラミング」に関して、その地図を作りたいという気持ちと、その延長線上にある「体系づけられた知識をまとめる」目的がある。

そのために自分が、たどった道をできるだけ記録して地図にしておくのがこのブログの本当の目的だ。

性格上、一つのことをつきつめてやることはできないし、一人で出来ることは限られているので、完成までまとめることはできないで終わるかもしれない。
でも、できるだけ続けてやることで、後に続く人に何らかのガイドとなれば良いと思っている。
そのために、元々は未公開にしていたこのブログを公開に切り替えた。


 

学習効果 (1)

最近、他の人が書いた、MelスクリプトなどをWebで見ていると、以前とくらべて、パニックになることがすくなく、おちついて分析することができるようになってきた。
長い(といっても20行程度だが)のMelでもよくみれば、ほとんどの記号は変数だということがわかってきた。
計算の手順は括弧で、優先順位がきまっており、一度に計算されるものは一つだ。
その計算によってでてきた結果が、他の変数に代入されることもあるし、
そのまま別の演算に進むこともある。
別の演算にすすだとしても、そこには目に見えない形で、計算結果があるということに注意を置くことができるようになった。

特に、先日しらべた( )や{ }の意味がわかったことは大きい。
余計なルールに惑わされず、その中身が何であるかということに集中できるようになった。

こしてみると一つ一つはそれほど難しくないことがわかる。
要は、目的の結果を出すために、どのような順序で、コマンドを実行していくかと言うことがポイントで、
それを学ぶためには、色んな人のMELを解析して、その思考方法を勉強する必要があるんだということがやっとわかってきた。

以前にくらべて、抵抗感や混乱した感じが減ってきて、他の人のMELを見るということにおもしろみを感じ始めた。

また、HELPファイルを見ていても、以前は一部を呼んで、「ああ、もうたくさん」と感じていたが、最近はMELの部分をざっとだが見渡せるようになってきた。

MELをスラスラ打てるようになるには、ひとつひとつのコマンドを覚えなくてはいけないという壁はあるが、基本的なルールやフロー制御などの習得は、視野に入ってきた感じがする。

先日For文を使って、ランダムなサイズのスフィアをランダムな位置に1000個つくるMELを作ろうと思いトライした。作る際に何度かエラーに合いつつも、特にストレスを感じることもなく、そのエラーの分析をし、ヘルプでコマンドや構文をしらべて、修正することに成功!
いままでは、ストレスでいっぱいになりながら訳のわからないまま成功したことはあるが、今回は、ほぼ手順やエラーに納得して自分なりに作ることができたと思う。

構文 (2) -q -e フラグについて

他の人の書いたMelを見ていると「-q 」とか「-e」というフラグがよく見られる。

これの意味を調べるために
ユーザ ガイド > テクニカルドキュメント > MELコマンド
でそのコマンドのところを探してみたが、なぜかこの二つのフラグは説明がない?!

唯一関係ありそうなのは、フラグの一覧表の右端にあるQ、E、といった記号だけ。
この説明は、下に書いてあるが、
「コマンドの照会モードで使用可能なフラグ」
「コマンドの編集モードで使用可能なフラグ 」
とだけしか書いていない。

--------------------
いろいろと調べたところ、回答は「コマンド構文」にあった。
これは、コマンドの動作をことなる動作にする特別なフラグだった。

ユーザ ガイド > 一般 > MEL とエクスプレッション > 構文 > コマンド構文

作成、編集および照会モード
多くのコマンドは、-edit と -query という特別なフラグの一対に基づいて異なる動作をします。


それぞれの詳細は以下の通り、
-edit
コマンドは指定されたオブジェクトの 1 つまたは複数のプロパティ(他のフラグによって決まる)を変更します。
sphere -edit -radius 10 "george";

この例では、シーン内にすでに存在する「george」というスフィアの半径を10に変更する。
もし「george」が存在しない場合は、エラーとなる。
// エラー: 名前とマッチするオブジェクトがありません: george //
ただし、"george" の部分を省いて、
sphere -edit -radius 10 ;
だけなら、現在選択されているオブジェクトがsphereであれば実行可能。


-query
コマンドは指定されたオブジェクトのプロパティの値(他のフラグによって決まる)を返します。

sphere -query -radius "george";
// Result: 10 //

この例では、「george」というスフィアの半径の値を返してくる。
これもすでに「george」という名前のスフィアが存在する必要がある。
存在しない場合は、エラーになる。
ただし、"george" の部分を省いて、
sphere -query -radius ;
だけなら、現在選択されているオブジェクトがsphereであれば実行可能。

2009年3月9日月曜日

就職活動 (3)

先週デモリールのアップデートを完了し、DVDを作成しD社へ送った。担当の人には渡してもらえたようで、あとは神に祈って待つばかり。
と思っていたら、今度はR社のほうも人材募集をしていると情報をもらえた。
R社の方はキャラクターアニメーターだ。
長い間やりたかったが、現在の職場では機会もなく通信教育でもやって学び直さないと無理かなと思っていたポジションだ。
必要な経験も、今回は(何故か)あまりシビアではないので、応募してみようと思う。
ただ、自分のデモでは、キャラクターアニメーションはあまり、見せられないのでカバーレターで、フォローしておかないとスルーされてしまいそう。
昔つくったアニメーションもWebにアップデートしておいたほうがよいかもしれない。

どちらにしても、いつかはキャラクターアニメーションの勉強をしようと思っていたが、のんびりしてたのと子育てに気をとられて、いつのまにか数年過ぎていた。
ちゃんと勉強しておけばと悔やまれる。
今回だめでも、ちかいうちにチャンスをみつけてちゃんと勉強したい。

2009年3月6日金曜日

構文 (1)

ヘルプにあるスクリプトの例をみていると、
print文で、"print"のあとに続く部分にいくつかのバリエーションがある。
ひとつは、
print $int;
もう一つは、( )を使った方法
print ($int + "counts");

( )無しはわかるが、( )付きの場合は一体どういったルールがあるのだろうか、
それについて調べてみた。
調べてみると、エクスプレッションに関して意外な発見があった。

今まで、エクスプレッションとは、リアルタイムにアトリビュートをアニメートする方法だと思っていた。
でも、mayaのヘルプをみるとその定義は間違いだった。

エクスプレッション、演算子および文(maya2009 online Help)
エクスプレッションとは、新しい値を導く一連の値と演算子です。
例:
3 + 5 // => 8
size("Hello") // => 5
size("Hello")*2 // => 10
(10 > 5) // => 1
(5 > 10) // => 0

MEL のコマンド構文でエクスプレッションを使用する場合、エクスプレッションをカッコで囲む必要があります。
また、クォーテーション マークで囲まない文字列を使用することはできません。
string $object = "cake";
setAttr $object.tx 2; // Wrong
setAttr ($object + .tx) 2; // Wrong
setAttr ($object + ".tx") 2; // Right


ここでやっと当初の疑問であった、( ) の使い方が分かった。
( )内にあるのは「エクスプレッション」だったのだ。
( )内には、値と演算子を入れることができる。

if文だと、
if ($x > 5)
 print("It's more than 5!"); <==ここは実行する内容。

というふうに、( )内に条件文がくる。
その条件は、「新しい値を導く一連の値と演算子」というエクスプレッションの定義にあてはまる。

比較演算では、なにも比べるだけで値をどこかに代入しているわけではないので、
「新しい値を導く」というのは間違っているようにみえるが、
表示はされていないが、そこには比較演算の結果が存在している。
それは、"true""False"かという結果である。


ついでに{ }だが、
これはブロック」呼び「エクスプレッションのグループ」のこと。
エクスプレッションを記述する場所には通常一つのエクスプレッションを記述するが、
ブロックは「一つのエクスプレッション」として扱うことができる。
複数行のエクスプレッションをひとつのエクスプレッションとして扱うことができるようになる。


例:
{
print("Hello there.");
print("Glad to meet you.");
print("So long!");
}


(注意事項:ブロック内に文が 1 つしかなくても、ブロック内のすべての文の末尾にセミコロンを付ける必要があります。)

一つのエクスプレッションとして扱われるなら、{ }だけでも、実行できるのではないかと思い
さっそく試してみたら、プロシージャーを使わなくても、{ }だけで問題なく実行できた。



このほか、{ }は、配列に値をまとめて代入する際にもつかわれる。(maya help)
これは、配列の「リテラル」といわれる。
$rip ={1, 2, 3, 4}
$rip ={"blue", "red", "black"}
のように表すことができる。


--------------------
追記;
前回の変数のスコーピングにかんして。
「プロシージャー」でスコーピーングするというよりも「ブロック」でスコーピングするというほうがより正確だ。

グローバル変数を回避する
ブロック内で宣言されたローカル変数はそのブロック内でしか認識されないため、ブロックは変数の適用範囲を制限するのにも便利です。
int $test = 10;
{
int $test = 15;
print($test+"\n");
}
print($test+"\n");
// Result:
15
10


実際、グローバルプロシージャを使うのも注意が必要なようす。
グローバル プロシージャを回避する