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

2009年5月12日火曜日

vector: C言語とMelスクリプトの違い

Mayaでは、ベクトルは<<5,10,8>>、<<$x,$y,$z>>といった形で表すことができる。

このベクトルには以下のような決まりがある。
1)3つのfloat値を一つの変数として扱う
2)必ず左から右へと並び方が決まっている(x,y,zもしくはR,G,B)。
3)扱える要素は3つのみ、増えても減ってもエラー。

「vector」という名称は「方向と大きさを持つ3次元空間でのベクトル」から付けられたのだと思う。

三つだから「vector」と思う人もいるかもしれないが、二次元でもベクトルは存在する。
(Melで三つの値をベクトルとして考えたのはやはり3次元ソフトだからだろう。)


また本来は「3次元空間におけるベクトルのための変数」として設計されたのだと思うが、値の解釈の仕方によって、「三つのfloat値が順番に並んだもの」であれば何にでも利用できる。

(例」x,y,z(translate, rotation, size)、r,g,b)


ちなみに値の解釈はコマンド側でなされるようだ。
magコマンドでは、原点からそのvectorで示される点までを結んだ線の大きさを計算しているのだろう。
<< >>内の数字は決められた順番に並べてあるので、コマンド側でもその順番に処理をしていくように設計されている。


--------------------
ところで、C言語にはベクトル変数というものは存在しない
Mayaだけのものかどうかは知らないが、ベクトル変数というのは、二次元であってもよいわけなので、
必ず3つ一組になるというのは、3次元を扱うソフト独自の物だと言えるだろう。

そして、このベクトル変数というものが存在することで、不必要なプログラミングを避け
3D情報を扱うことに集中できる。
わかってはいたが、改めて考えると「3D専用の機能が増やされた特殊な言語」なんだなと思う。

こういったことが、Melスクリプトは高度なプログラミングの知識や、数学の知識を必要としないで
誰でもすぐに始めることができるといわれる所以だろう。


たしかにC言語に比べると簡単になっていて、3Dの作業に集中できる。
実際は、C言語でプログラミング出来るほどの知識はなくてもMelは使い始めることはできる。

しかし、少しでも複雑なことをしようとすれば、基本的なプログラミングの知識や、数学的な知識、アルゴリズム的な考え方、3Dソフト独自の考え方は必要とされる。
決してそれらを知らなくても使いこなせるほど甘くはない。
要するにプロダクションで十分実用的なMelを作るためにはそれなりの知識は必要なのだ。

まぁ、まったくプログラミング言語に触ったことがない初心者でも、
C言語ほど学ぶことは多くないので、なんとか頑張ってMelのルールを覚えれば、
ある程度のスクリプトは書けるようになる。



--------------------
実際、C言語でベクトルを扱おうとすると、3D情報以外の部分。
もっとアルゴリズムを掘り下げた段階までにいきつく。
たとえば、ベクトル値をどう扱うかという事から始めなくてはならない。

C言語における「変数」は非常に単純なもので、数字のみを扱う。
(参照:「ゼロからはじめるC言語 - 変数編」にある「表01 主な型指定子」)

たとえばint、floatなどが変数の種類だ。
文字もキャラクターコードを扱うので数字として扱われる。

しかし、これらは一度に一つの値しか扱えない。

毎回$x、$y、$zという3つの変数をそれぞれ別に扱わなくてはいけないとするとスクリプトは非常にめんどくさくミスも増えてしまう。

C言語では配列以外には一つの変数名で複数の値を扱える物は存在しない。(違っていたらごめんなさい)
なので、べクトルを扱うには、構造体やクラスといった手順が使われる。


それによってベクトルのように複数の値をひとつの変数のように扱うことが可能になる。
この手順を踏まなくては、C言語ではベクトルをMayaと同じように扱うことはできない。

Melスクリプトでは、そこまでの部分はすでに完了して、いつでも使える状態になっている。
ベクトルを扱うために、構造体やクラスと言った知識は不要だ。


これは非常に便利なことだと思うが、反面いくつかの問題もある。

以前の変数に関するエントリでも触れたが、
ベクトルは「変数」ではない。3つの変数の集合体だ。
しかし「変数」として、とらえるとプログラミング初心者が「変数」という概念を理解するのを妨げることになる。

(後から見たら、オンラインヘルプでは、「変数」と「配列、ベクトル、行列」は別の項目になっている。 「Mayaでは「変数」としてひとまとめにしている」と書いていたが、そうではないことがわかったので訂正。
そう思った原因は「learning Maya:Mel Fundamental」の変数のページで変数のタイプとしてまとめてあったからだった。
また以下のようにもちゃんと説明がしてあるヘルプはやはりよく読むべきだと反省。 
@2009/5/12 14:37)

注:科学者はマグニチュードと方向を表す用語としてよくベクトルを使用します。Maya では、ベクトルは 3 つの浮動小数点数を関連付けてグループ化したものです。
(Mayaオンラインヘルプ:ベクトル)


もちろん、オンラインヘルプやいろいろな入門サイトでは。

Mayaには「文字列」「ベクトル」といった変数があります。
「変数」は値を入れておく箱のような物です。

などと説明される。

しかし、実際は変数の知識にもう少し別の考え方や知識を入れたて「string」や「vector」という変数を作り上げているのである。

「文字列」は特に、違和感を感じないかもしれないが、「ベクトル」が「変数」というのは腑に落ちない人も多いのではないだろうか?(自分だけか?)


なぜって?
「float」が「変数の型」だとすると、「ベクトル」は「vector」という型と「float」という型の二つを持っていることになる。

「変数」という分類下では、一つの変数は一つのタイプを持つと考えると矛盾が生じる。


--------------------
Melはこのように便利な反面、混乱が生じる部分もあるのではないかと思う。
それが、初心者がMelをより深く理解していこうとするステップで障害の一つになっている可能性がある。

プログラミング経験者がスクリプトを簡単に理解し使いこなせるようになるのは、
こういった矛盾した考えを自分なりに解釈、消化しているからだろう。


こういった不透明な部分があるため、
プログラミング経験者が素早くスクリプトが使えるようなるのを見ると、、
スクリプトを使いこなすにはプログラミングをならわないといけないとか思ってしまう。

これではプログラミングができるようになることを期待して、スクリプトから入門した人は、自分の選択は間違いだったかと悩んでしまう。

しかしながら、Melスクリプトを、一つ一つ細かく見てその矛盾をひもといていけば、
初心者でも十分理解可能な説明ができるのではないかと思う。

それが本来の姿、「スクリプトは初心者にもできるようになる」といううたい文句を現実の物にしてくれるのではないかと思う。

 

0 件のコメント:

コメントを投稿