ちょっとわき道に戻る
Shadeのローカル座標って何?
Shadeをはじめて操作した時、戸惑ったことが二つありました。一つは何もないインターフェイス。そしてもう一つがこのローカル座標系でした。
何かとっつきにくく,できれば考えずに避けて通りたかったと思ったのを覚えています。
しかし、今では、「これほど便利なものは無い」とさえ思います。
まずは左の図を見てみてください。
これは,普通に回転体(赤い物体)を作成し、それをパートに入れたものです。

この状態では、まだローカル座標系を意識することはないと思いますが、ローカル座標系とグローバル座標系が同じなだけです。

図でいうと青い矢印がグローバルなXYZ軸、緑色の矢印がローカルのXYZ軸です。

水色のキュービックはローカール座標空間を表わしていると思ってください。(ここではとりあえず長さ,大きさの違いは無視してください。)

図1 変換(変形)前の状態 Topへ

さて、ここでこの回転体をz軸周りに-28度回転するとしましょう。

方法は2種類
@形状だけを選択して回転させる(図1-1)
Aパートを選択してパートごと回転させる(図1-2)。

図1-1 形状だけ選択 図1-2 パートごと選択 Topへ


このときに、初めてローカル座標系を意識することができます。
@は単に形状を回転しただけだけですが、Aはローカル座標空間自体を回転したのです。

「だから何なんだ」といいわずに、さらに平行移動をしてみましょう。
x方向に300, z方向に-150,y方向に100程度(適当) 移動したとしましょう。

今回もまた
@は選択した形状だけを移動します。(図2-1)
Aは選択したパートごと移動します。(図2-2)

図2-1 形状だけ選択して移動 図2-2 パートを選択して移動 Topへ

こんなところでいいでしょう。

さて、ここまでモデリング(作成から回転、移動)してきて,貴方は「回転体の中心に軸(円柱)をモデリングするのを忘れた。」ことにふと気づきました。

図2-1のようにモデリングしてきた貴方は、どのようにして正確に「回転体の中心に軸(円柱)をモデリングする」のだろう。この程度の単純な回転と移動なら座標を計算することもできるでしょうが・・・。

私は嫌です。計算なんかしたくない。
私はAのようにモデリングします。
なぜかというとShadeには(shadeに限ったことではないが)Local座標系表示ができる機能があるからです。


Shadeのツールバーにある「Local」を押せばあっという間に表示がLocal座標空間に切り替わり「Shift」キーを使えば回転体の中心軸に沿った円柱を書くことなど簡単なことです。

これを今までと同じように表現したのが図3です。(あたかもグローバル座標系が傾いたようになるのです。)

余談ですが、私たちは普段ローカル座標から物を見ているのではないでしょうか?
普通に「上」「右」「西」「東」といってもこれは宇宙から見ると私たち自身のローカル座標でしかないのですから。

図3 Local表示のイメージ Topへ

ここは一応スクリプトのTipなので、スクリプトで使えるようにもう少し詳しく見てみましょう。

どうしてShadeではこのようなことができるのでしょう。
実は、パートや自由曲面パートは皆この変換(回転とか移動など)の情報を持っているのです。

パートを選択して、コンテクストメニュー「形状の情報を見る」で表示される数字表が、その変換の情報なのです。
このパートにかかっている変換だけが記憶されています。
言葉を変えると、親のパートにかかる変換は親パートが持ち、子のパートにかかる変換は子パートが持っているのです。
普通3dソフトではこの変換を行列(マトリックス)で表わします。

なぜ行列なのでしょう。
Shadeにも「直線移動」「拡大縮小」「回転」「せん断」などといった変形(変換)がありますが、どれも4行×4列の行列であらわすことができます。
さらに都合の良いことに行列は掛け合わすことができます。
つまり 「直線移動して、回転して、拡大する」 行列は 
『直線移動の変換行列 × 回転の変換行列 × 拡大縮小の変換行列』
で計算することができるのです。

これを図でみてみましょう。


図4-1 3つのパートの入れ子

図4-1はパート青の中にパート黄、パート黄の中にパート赤がある状態を表現しています。

また、図4-2はブラウザ上でどのようになっているかを示したものです。

最初に形状を作ります。
それをパート赤に入れ、下に直線移動(1)、回転の変形(2)をしたものをパート黄に入れます。
次に、パート黄に別方向への回転(3)をかけたものをパート青に入れます。
そのパート青をまた別方向に回転(4)させているという少し複雑な状況を想像してください。

先ほど説明した通り

「それぞれに変換がかかっている」ということは
「それぞれのパートが変換のマトリックスを持っている。」

ということです。ですからそれぞれ
パート赤のマトリックス=移動変換行列(1)×回転変換行列(2)
パート黄のマトリックス=回転変換行列(3)
パート青のマトリックス=回転変換行列(4)

となっています。
ここでもともとglobalで作成した形状にどんな変換をかけると形状が今の位置になるのでしょう。
そうです。
パート赤のマトリクス×パート黄のマトリクス×パート青のマトリクス
で計算した行列をかけてやればいいのです。

それでは逆に変換された今の位置から、globalで作成した時の状態に戻すのにはどうすればいいのでしょう。
上で計算した結果(行列)の逆行列をかければ良い訳です。

ところで、選択中のパートのマトリックスを取得/設定するには
XShade.TransformationMatrix(i,j)
を使えばよいことは御存知ですよね?


図4-2 ブラウザ上でのパートの状態

一見複雑に見えるものも行列の計算でできてしまうのです。
行列の計算というのはコンピューターの最も得意とする分野ではないでしょうか。

少し飛躍しすぎたかもしれませんが実際の式を使わず観念的に説明したらこんなことになってしまいました。
詳しく知りたい方は、『アフィン変換』をウェブで探せばすぐに良い解説が見つかります。
ちなみに、この変換行列(変換マトリックス)を扱うサブルーチンを集めたものをサブルーチンセット集『マトリックス(アフィン)関係』にまとめてありますので眺めてみてください。

ちょっとわき道に戻る Topへ