プロパティを使ってみよう
これまでメソッドリフェレンスのメソッドとVBScriptの基本的なことを扱ってきました。
しかし、もしかするとあなたは線形状のポイントをある座標値に一致させたくなるかもしれません。
あるいはカメラの視点と注視点をある線形状に合わせたくなるかもしれません。
そのためにはshadeから情報を取得して加工して設定しなおさなくてはならないでしょう。
この情報を取得,設定するのがプロパティなのです。(ちなみに加工するのがVBScriptの役目ということになります)
リフェレンスマニュアルを見たときにメソッドリフェレンスとプロパティリフェレンスがあったのを覚えてますか?
通常、メソッドは動作、プロパティは属性として説明されますが理解しにくい言葉の1つではないでしょうか。
例えばこれまでも何度か出てきた球について考えてみます。
メソッド(CreateSphere)は「球を作る」という「動作」に使われました。
一方プロパティリファレンスにSphereObjectCenter、SphereObjectRadiusというのがあります。
SphereObjectCenterは球の中心座標値を取得したり設定したりするもので
SphereObjectRadiusは球の半径を取得したり設定したりするものです。
つまりプロパティは球が持っている属性(情報,状態)を扱う役割(取得設定)を持っているのです。
球というものが有って初めて意味がでてきます。
プロパティウィンドウの1番最初にあるプロパティImageWindowについてみて見ましょう。
これはShadeに既にあるImageWindowの情報(表示、非表示)を扱う役割(取得設定)を持っています。
形状関係の最初にあるLineObjectClosedはどうでしょう。
これは線形状がもっている情報(閉じているか開いているか)を扱う役割(取得設定)を持っています。
これも線形状というものがなければ意味がありません。
レンダリング関係の最初に有るのはRendaringMethodはどうでしょう。
これもShadeに既にあるレンダリングダイアログボックスのレンダリングポップアップメニュ-というものが持っている情報(レンダリングの種類)を扱う役割を持っています。
例題1 形状の最初のポイントを原点に移動する
それでは実際に例を見てみましょう。
まず、shadeで新規画面を開き、下図のような4つのポイントからなる開いた線形状を適当に作っておいてください。

この線形状の最初のポイントを原点に移動してみましょう。
プロパティリフェレンスで形状関連から「AnchorPoint」を探してみてください。
これは選択されている線形状のi番目のアンカーポイントのj軸方向の座標値を取得設定するプロパティです。
スクリプトを下に示します。
x=xshade.AnchorPoint(0,0)
y=xshade.AnchorPoint(0,1)
z=xshade.AnchorPoint(0,2)
xshade.message "x="&x&" y="&y&" z="&z
xshade.AnchorPoint(0,0)=0
xshade.AnchorPoint(0,1)=0
xshade,AnchorPoint(0,2)=0
for nextを使うと
x=xshade.AnchorPoint(0,0)
y=xshade.AnchorPoint(0,1)
z=xshade.AnchorPoint(0,2)
xshade.message "x="&x&" y="&y&" z="&z
for j=0 to 2
xshade.AnchorPoint(0,j)=0
next
上で行っていることは下記の通りです。
x、y、zという変数にAnchorPointを使って取得した最初(0番目)のアンカーポイントの各座標値を代入します。
取得した座標値をmessageを使って表示して変更前の座標値を表示します。(これはなくても動作には関係ありません)
最初のポイントを原点(0,0,0)に合わせるためにAnchorPointを使って各座標値を0に設定します。
それではスクリプトウィンドウに上記のいずれかを打ち込んで、線形状を選択した上で実行を押してください。

メッセージウィンドウに上図のように表示しながら下図のような結果になるはずです。

動作が確認できましたか?
例題2 形状全体を移動する
上記の例では最初のポイントだけ原点に移動しましたが今度は線形状の中心が原点に来るように形状全体を移動してみましょう
考え方としてはcenterというプロパティで形状の中心値を取得し原点との差を計算しMoveObjectTranslateメソッド゙を使って形状を移動していきます。
ちなみに cx,cy,czは形状の中心(正確には座標値の平均)、dx,dy,dzは中心値と原点との差を保管する変数(箱)の役割を持ちます。
cx=xshade.center(0)
cy=xshade.center(1)
cz=xshade.center(2)
dx=0-cx
dy=0-cy
dz=0-cz
xshade.MoveObjectTranslate dx,dy,dz
下記のように1行でも書けますが、流れに沿って説明したいので上記の例で説明していきます。
参考 xshade.MoveObjectTranslate -xshade.center(0),-xshade.center(1),-xshade.center(2)
1〜3行目は中心値の座標を取得しcx、cy、czに代入
括弧の中は0がx座標、1がy座標、2が座標を表わしています。(リフェレンス参照)
原点の座標は(0,0,0)ですから原点との差を4〜6行目で求めてdx,dy,dzに代入
MoveObjectTranslateを使い選択している形状をx軸方向にdx、y軸方向にdy、z軸方向にdz 移動させる。
というのがスクリプトの内容です。
さあスクリプトウィンドウに打ち込んで動かしたい線形状(前回の例題と同じ物)を選択して実行してください。

実行すると下図のような結果になるはずです。全体が移動しているのが分かりますね。

ついでに4〜6行目の0のところを動かしたい座標の座標値に置き換えて実行してみてください。
例題3 無限遠光源の方向を設定する
今度は少し役に立つ物・・・無限遠光源の方向を線形状を使って設定するスクリプトを作ってみましょう。
作るスクリプトは
「ポイントを2つ持つ線形状の最初のポイントから次のポイントに向けて無限遠光源の方向を設定する」
というスクリプトです。
このスクリプトを作るにはベクトルの予備知識が少し必要です。(高校の数学で十分)
無限遠光源は設定された単位ベクトルの方向に光源がある という仕組みになってます。
ですから設定したい方向の単位ベクトルを計算できればどの方向にもスクリプトから設定できるのです。
単位ベクトルは長さが1のベクトルです。その単位ベクトルの方向余弦(x、y、z方向に分けた成分)
がまさに無限遠光源の(光源設定半球でctrlを押しながらクリックすると出てくる)ダイアログボックス(下図)の数字なのです。

あるベクトル(X,Y,Z)の単位ベクトル(のxyz成分[eX,eY,eZ])を求めるには、学校で勉強した通り

vbscriptで記述すると。(今回は平方根の関数は使わず、1/2乗としました。)
eX=X/(X^2+Y^2+Z^2)^(1/2)
eY=Y/(X^2+Y^2+Z^2)^(1/2)
eZ=Z/(X^2+Y^2+Z^2)^(1/2)
で求めることが出来ますね。
このことを頭に入れてスクリプトの流れを考えると次のようになります。
- 線形状の最初のポイント(x0,y0,z0)と次のポイント(x1,y1,z1)から座標値を取り出す。(AnchorPointでできますね)
- この座標値からこの線形状のベクトル(dx,dy,dz)を計算する(といっても差を求めるだけです)
- 光源方向側から線形状を作っている(最初のポイントが光源側で次のポイントが光があたる側になる)のでこの逆の方向の単位ベクトル(xyz成分)を求めることになります。
- そしてその単位ベクトルのxyz成分値をDistantLightDirectionを使って設定すればよいはずです。
スクリプトは以下のとおりです。
x0=xshade.AnchorPoint(0,0) '線形状の始点の座標値(x)の取得
y0=xshade.AnchorPoint(0,1) '線形状の始点の座標値(y)の取得
z0=xshade.AnchorPoint(0,2) '線形状の始点の座標値(z)の取得
x1=xshade.AnchorPoint(1,0) '線形状の終点の座標値(x)の取得
y1=xshade.AnchorPoint(1,1) '線形状の終点の座標値(y)の取得
z1=xshade.AnchorPoint(1,2) '線形状の終点の座標値(z)の取得
dx=x0-x1 '終点から始点へのベクトルのx成分
dy=y0-y1 '終点から始点へのベクトルのy成分
dz=z0-z1 '終点から始点へのベクトルのz成分
eX=dx/(dx^2+dy^2+dz^2)^(1/2) '単位ベクトルのx成分の計算
eY=dy/(dx^2+dy^2+dz^2)^(1/2) '単位ベクトルのx成分の計算
eZ=dz/(dx^2+dy^2+dz^2)^(1/2) '単位ベクトルのx成分の計算
xshade.DistantLightDirection(0)=eX '無限遠光源の設定(x)
xshade.DistantLightDirection(1)=eY '無限遠光源の設定(y)
xshade.DistantLightDirection(2)=eZ '無限遠光源の設定(z)
xshade.message "eX="&eX&" eY="&eY&" eZ="&eZ
さあ試してみましょう
上記のスクリプトをスクリプトウィンドウに書き写してshade上で2点からなる線形状を光の差し込む向きを想定して作成し
その線形状を選択した状態で実行するだけです。
どうですか線形状の方向に無限遠光源が設定されていますか?
光源がどのように変わったか無限円光源ウィンドウで確認してみましょう。

光源の方向ウィンドウは

どうですか無限円光源の方向が線形状の向きに変化したことが確認できるはずです。
実際に光のさす方向を確認するには線形状の始点に小さな球と線形状の終点に接するように水平な平面を作り
影を落とす設定をしてレンダリングすれば確認できると思います。(終点上に影の中心が来るはずですよ)
このようなスクリプトでは同じような式が使われるので「配列」というものを使いたくなります。
VBScriptのリフェレンス(microsoftのホームページに有る)で「配列」についても勉強した人は次のスクリプトも考えてみてください。
配列については次の章で取り上げるつもりです。
(参考スクリプト)
dim pos(1,2),delta(2),eVec(2),D
for j=0 to 2
for i=0 to 1
pos(i,j)=xshade.AnchorPoint(i,j)
next
delta(j)=pos(0,j)-pos(1,j)
next
D=(delta(0)^2+delta(1)^2+delta(2)^2)^(1/2)
for j=0 to 2
xshade.DistantLightDirection(j)=delta(j)/D
next
やっていることは同じですが、たったこれだけで無限遠光源の方向を線形状を使って指定できる様になりました。
どうです?配列を覚えたいとは思いませんか。
配列を使うとこんなに短くなるということだけでも知っておいてください(但し見やすいかどうかは別問題)。
|