■ エレメントをピックさせるコマンド

Create_DirLight7



PickElement "Light","Pick a Infinit Light", "Pick a Infinit Light", oDL, iSelBtn

"Light"・・・ピックするエレメントをライトオブジェクトに限定します。
"Pick a Infinit Light"・・・マウスラインに表示させるメッセージです。先に左、中ボタン
oDL ・・・ピックしたライトを oDL という変数に格納します。
iSelBtn ・・・ピックしたマウスボタンの情報を返します。

iSelBtn = 1 → LMB
iSelBtn = 2 → MMB
iSelBtn = 0 → RMB  


※ エレメントをピックするときに予めピック可能なエレメントをライトオブジェクトにフィルタリングしているので Create_DirLight7.vbs には CheckObjectType プロシージャを通していないことを確認してください。

'---------------------------------------------
' Pick a Infinit Light
'---------------------------------------------

Do


Dim iSelBtn


PickElement "Light","Pick a Infinit Light", "Pick a Infinit Light", oDL, iSelBtn


if iSelBtn = 1 then
SelectObj oDL
CheckLightType


elseif iSelBtn = 2 then
SelectObj oDL
CheckLightType


elseif iSelBtn = 0 then
LogMessage "Cancel"


Exit Do


else
LogMessage "Error"


Exit Do


End if


Loop



'---------------------------------------------
' Check Light Type
'---------------------------------------------


'サブプロシージャ"CheckLightType"の宣言
Sub CheckLightType


'ライトタイプが infinit であるときサブプロシージャ CreateDirLight を実行
If oDL.OGLLight.Type = 1 then
CreateDirLight


'ライトタイプが infinit でないとき、警告メッセージ表示
Else Msgbox "Please Select a Infinite Light."


End If


End Sub



'---------------------------------------------
' Create Direction Light
'---------------------------------------------


'サブプロシージャの宣言
Sub CreateDirLight


'Infinitライトを(X,Y,Z)=(0,0,10)に移動
Translate , 0, 0, 10, siAbsolute, siParent, siObj, siZ


'Infinitライトの注視点オブジェクトをDir_Intという名前で作成し、oDLIntという変数に格納
set oDLInt = GetPrim("Null", "Dir_Int")


'InfinitライトのルートモデルをDir_Rootという名前で作成し、oDLRoot という変数に代入
Set oDLRoot = GetPrim("Null", "Dir_Root")


'DirLight/Dir_IntをoDLRootの子に親子付け
ParentObj oDLRoot, oDL
ParentObj oDLRoot, oDLInt


'DirLightをDir_IntにDirection Constrain
ApplyCns "Direction", oDL, oDLInt


'拘束軸をX軸からZ軸に変更
SetValue oDL & ".kine.dircns.dirz", -1
SetValue oDL & ".kine.dircns.dirx", 0


'サブプロシージャの終了
End Sub

フロシージャの初めにこれから使う変数をあらかじめ宣言しておく。

これを書くことで処理速度が上がる。


Dim oDL,oDS

配列やコレクションの各要素に対して、一連のステートメントを繰り返し実行するフロー制御ステートメントです。

マイクロソフトテキスト



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

For Each  変数  In  変数
処理内容


Next

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



’シーンルートの子供になってるものの全てをオグに表示

Set lObj = EnumElements( "Scene_Root.Children", TRUE )

For Each o in lObj
LogMessage o.Name


Next


EnumElementsは親か子を検索するコマンド。FALSEは親、TRUEは子を示す

■ Do ~ Loop による繰り返し処理

マイクロソフトテキスト

Create_DirLight6

Do ~ Loop は条件判定とともに使用する繰り返し処理です。
以下のように記述することで、条件Aを満たさなくなるまで繰り返し処理を行ないます。

for~nextは回数を指定して繰り返すがdo~loopは条件が満たされる限り繰り返す。

条件Aが必ず満たされるようなものである場合、無限ループに陥ることになりますので注意が必要です。

---------------------------
Do

if <条件A> then

<条件Aを満たす場合の処理>


else

<条件Aを満さない場合の処理>

  exit Do


Loop

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

'選択オブジェクトリストの値を変数 oSelList に格納
Set oSelList = GetValue("SelectionList")


For i = 0 to (oSelList.Count -1)

Set oDL = oSelList(i)

CheckObjectType


Next


'---------------------------------------------
' Check Object Type
'---------------------------------------------


Sub CheckObjectType


If oDL.Type = "light" then
CheckLightType


Else Msgbox "Please Select a Light Object."
End If


End Sub


'---------------------------------------------
' Check Light Type
'---------------------------------------------


'サブプロシージャ"CheckLightType"の宣言
Sub CheckLightType


'ライトタイプが infinit であるときサブプロシージャ CreateDirLight を実行
If oDL.OGLLight.Type = 1 then
CreateDirLight


'ライトタイプが infinit でないとき、警告メッセージ表示
Else Msgbox "Please Select a Infinite Light."


End If


End Sub


'---------------------------------------------
' Create Direction Light
'---------------------------------------------


'サブプロシージャの宣言
Sub CreateDirLight


'Infinitライトを(X,Y,Z)=(0,0,10)に移動
Translate , 0, 0, 10, siAbsolute, siParent, siObj, siZ


'Infinitライトの注視点オブジェクトをDir_Intという名前で作成し、oDLIntという変数に格納
set oDLInt = GetPrim("Null", "Dir_Int")


'InfinitライトのルートモデルをDir_Rootという名前で作成し、oDLRoot という変数に代入
Set oDLRoot = GetPrim("Null", "Dir_Root")


'DirLight/Dir_IntをoDLRootの子に親子付け
ParentObj oDLRoot, oDL
ParentObj oDLRoot, oDLInt


'DirLightをDir_IntにDirection Constrain
ApplyCns "Direction", oDL, oDLInt


'拘束軸をX軸からZ軸に変更
SetValue oDL & ".kine.dircns.dirz", -1
SetValue oDL & ".kine.dircns.dirx", 0


'サブプロシージャの終了
End Sub

■ For ~ Next による繰り返し処理のステートメント

マイクロソフトのテキスト

ある処理を N 回行なう場合、以下のような For ~ Next ステートメントを使用します。

指定した回数だけ繰り返す


For i = 0 to N-1


<処理内容>

Next


※ 開始番号が 0 になっているので N 回の処理を行なうためには終了番号は N-1 になります。

5個のライトを選択して0を3にすると3、4番目に選択されたライトのみに実行される。

SetValueは値を変更したときなどにログに表示される。

GetValueは現在の値を取得したい時に使う。ログには残らない


■パラメーター値の設定

SetValueコマンドを使用して、パラメータの値を設定することができます。たとえば、Local Transformプロパティページを使用し、「Fluffy」という名のオブジェクトのローカルX座標を変更すると、以下のコマンドのようなコマンドがロギングされます。


      SetValue "Fluffy.kine.global.posx", 5.12


トランスレートパネルで打ち込むとこうなる

Translate , 5.12, 0, 0, siAbsolute, siParent, siObj, siX


ワイルドカードを使用すると、同一の値に複数のパラメータを設定できます。たとえば、以下のコマンドはFluffyのローカルX座標、Y座標、およびZ座標をゼロに設定します。


      SetValue "Fluffy.kine.global.pos.*", 0


パラメーター値の取得

GetValueコマンドを使用して、パラメータの現在の値を取得することができます。コマンドの戻り値は単一のパラメータの値だけです。パラメータ文字列にはワイルドカードは使用できません。 たとえば、次のコマンドは「Fluffy」というオブジェクトの現在のフレームにおけるグローバルX座標を戻します。

	myVar = GetValue ( "Fluffy.kine.global.posx" ) 

また、フレーム番号を明示的に指定することで、現在のフレーム以外のフレームでのパラメータ値を戻すことができます。

たとえば、Fluffyのフレーム25におけるグローバル座標を戻すには、次のように記述します。

     myVar = GetValue ( "Fluffy.kine.global.posx" ), 25 
 


複数選択しているすべてのオブジェクトに同じ処理を行なう方法を紹介します。
サンプルスクリプト Create_DirLight6.vbs をご覧ください。

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

'選択したもの全ての子にヌルを追加する

Set oSelList = GetValue("SelectionList")
For i = 0 to (oSelList.Count -1)

Set oDL = oSelList(i)


logmessage oDL.name


set oNull = GetPrim("Null", oDL+"null",oDL)

SetValue oNull & ".null.size", 0.02
SetValue oNull & ".kine.local.posx", 0
SetValue oNull & ".kine.local.posy", 0
SetValue oNull & ".kine.local.posz", 0



Next


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



<処理内容>

Next


※ 開始番号が 0 になっているので N 回の処理を行なうためには終了番号は N-1 になります。


■ 選択オブジェクトリストの値を取得する

Set oSelList = GetValue("SelectionList")

GetValue コマンドは 指定したパラメータの値を返すコマンドです。
SelectionList は選択しているオブジェクトのリストを返します。

oSelList.Count でリスト内のオブジェクトの数を返します。


■ For ~ Next による繰り返し処理のステートメント

ある処理を N 回行なう場合、以下のような For ~ Next ステートメントを使用します。

For i = 0 to N-1

5個のライトを選択して0を3にすると3、4番目に選択されたライトのみに実行される。