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

2009年5月28日木曜日

「変数のデータ型」と「アトリビュートのデータ型」

前回、パーティクル・アトリビュートのデータ型を「getAttr -type」で調べた。

結果としてはアトリビュートのデータ型を調べることはできることがわかったが、返ってきた値をよくみるといままで変数のデータ型でつかっていたのとは異なる表記のデータが返ってきている。

これはなぜなのか?
また返ってきた異なる表記から、どうデータ型を判断すべきなのか?

今回はこのあたりをより掘り下げてみた。



--------------------
<疑問>

「vectorArray」以外はすべて「floatArray」になると思っていたのに全く違う結果が出た。

「doubleArray」とは何だろう??


検索してみるとDigital Matrixの「パーティクルのアトリビュート」のページが引っかかった。


しかしながら、
worldCentroid ...「double3」
maxCount  ...「long」
と、他にもいままで見たことがないデータ型が書かれており、謎は深まるばかり。


--------------------
<MEL以外の言語での表記>

C言語では、「double」というと、倍精度の浮動小数点数を表している。
(参照:浮動小数点数型と誤差

通常float型が4バイト(32ビット)のところdouble型だと8バイト(64ビット)で値を表現する。
単純にデータ量が二倍であるので「double」ということらしい。


また「Visual Basic 図解 基礎解説」によると
「integer」 =整数型
「long」 =長整数型 (ちなみにC言語ではlong int(long)と呼ばれるらしい)
ということらしい。

ようするに通常のプログラミング言語では、同じint、floatでもその表現できる桁数の違いによってことなる型が存在しており、変数の宣言でもそれらが使われる。

しかしながらMELでは変数の宣言では、intとfloatはそれぞれ1種類しか存在しない。
にもかかわらず、実際のアトリビュートでは、本来の型表記とはことなるもう一つの型表記が使われている。
もしくは二種類の型が存在して、使い分けられている。


とりあえずここまでで他の言語には「double」「long」に関して、それぞれの表記が存在することがわかった。

しかし、「double3」に関しては説明がつかない。


--------------------
<MEL独自の型表記「double3」>

オンラインヘルプで「パーティクル アトリビュートのリスト」を見てみると

API 開発者は、Maya ヘルプに記載されたもの以外のアトリビュートもあることに注意してください。 ヘルプ > ノード & アトリビュート リファレンス(英語)(Help > Node and Attribute Reference)を選択して、パーティクルを検索します。

とある。さっそく
テクニカルドキュメント > ノード(英語)>particle
を見てみた。


このページで「double3」の型をもつアトリビュートを探してみた。
「centroid(ctd)」アトリビュートが「double3」だったので詳細を以下に記す。

centroid (ctd)は以下の三つの子アトリビュートを持っている。
centroidX (ctdx)
centroidY (ctdy)
centroidZ (ctdz)

しかしcentroid (ctd)のみが「double3」で子アトリビュートはそれぞれが「double」である。

要は「doble」が三つで構成されているという意味らしい。

実はこのアトリビュートの構成は、「数値複合アトリビュート(子アトリビュートがすべて数値)」と呼ばれるらしい。(参照:getAttrコマンド

またいかの説明も付け加えておきたい。
複合アトリビュートは 2 つ以上のアトリビュートで構成されています。
(参照:パーティクル アトリビュートのリスト


どのようなしくみなのかはわからないが、vectorの値をその親子関係において関連づけているデータ型と思われる。
これはそのノードのアトリビュートにおいて判断されていることであり、それはMELの領域ではなく、C言語で扱われる領域のことであり、おそらくそういったMayaのAPIに関連したことだろう。


話を戻すが、ということは通常のトランスフォームノードのTranslateなども同じdouble3なのかもしれない。
早速調べてみた。

getAttr -typ particle1.translate;
// Result: double3 //

getAttr -typ particle1.rotate;
// Result: double3 //

getAttr -typ particle1.scale;
// Result: double3 //

見事、どれも「double3」だった。

試しに一つのアトリビュートXのみを選択して調べてみると、
getAttr -typ particle1.translateX;
// Result: doubleLinear //

という値を返してきた。
ますます深みにはまり始めたので、ここらでいろいろ探るのは止めておく....。




--------------------
<関連づけ>

どうやら、getAttrコマンドで返してくるデータ型は、より詳しい表記になっているらしい。

ただ、返ってくるデータ型の表記と変数などで使われるデータ型の表記との関連性がすっきりしないので、もういちどオンラインヘルプの「パーティクル アトリビュートのリスト」をよく見てみた。



これまでの調査で、doubleArrayと表示された「mass」と「lifeSpanPP」,longと表示された「maxCount」について調べてみたところ以下のようになっていた。

mass     ...float array
lifeSpanPP ...float array
MaxCount ...integer


これをgetAttrのデータ型に関連づけると

mass    ...float array ...double array
lifeSpanPP ...float array ...double array
MaxCount   ...integer  ...long

ということになる。

double3においては、
double3 ...float(数値複合アトリビュート

になるがこれを変数では、ベクトル(vector)で表現するのかどうかは現時点では不明。



--------------------
<アトリビュートのデータ型>

オンラインヘルプでaddAttr,setAttrを見ると、アトリビュートには通常のこのような数多くのバリエーションのデータタイプを指定できることがわかる。

addAttr」では簡単に一覧が表記されており、

setAttr」では、それぞれのアトリビュートの詳細を知ることが出来る。



--------------------
<残る疑問>

MELで変数宣言をするときには、アトリビュートのデータタイプほどの細かな指定をすることはない。
それによってデータのタイプの数を減らし、シンプルになるというメリットもある。

しかし、変数でfloat型(vector含む)を指定した変数の値はすべて倍精度として扱われているのか? という疑問が残る。

実際の変数宣言とMaya内部でのデータの取り扱いの違いについて、関連をのべた文献がいまのところ見つからない。

getAttrコマンドで返ってくる値は、変数のデータ型に準拠する物ではない。

しかしアトリビュートのデータ型はアトリビュート同志の結合やデータのやりとりにとってより重要な意味を持ってくるとことが推測されるので、相互の関連について知っておく必要はあるはずだが。

そのことについて詳しく説明してある文献、もしくはオンラインヘルプのページはあるのだろうか?

 

0 件のコメント:

コメントを投稿