オブジェクト モデルを使用してコードを記述するには通常、次の手順を実行します。
作業場所を指定します(「ワークスペースを定義する」を参照)。
操作対象のオブジェクトを指定します(「オブジェクトを識別する」を参照)。
操作対象のオブジェクトの使用目的と説明を記述します(「オブジェクト データを取得および設定する」を参照)。
オブジェクト モデルのコンポーネントの使い方に関する詳細は、『C++ API リファレンス』または『コマンドおよびスクリプト リファレンス』の個々のヘルプを参照してください。
検索場所を指定したら、操作するオブジェクトを指定する必要があります。 このプロセスは、オブジェクトをシーンに追加するのか、または既存のオブジェクトを操作するのかによって異なります。
シーンに 3D オブジェクトを追加するには、その親となるオブジェクト(通常はルート モデル)のメソッドを使用します。 たとえば、ポリゴン メッシュの球を作成したい場合は、ルート モデル オブジェクトの AddGeometry メソッドを使用する必要があります。
Set oSphere = ActiveSceneRoot.AddGeometry( "Sphere", "MeshSurface" )
シーン アイテムそのものを他のオブジェクトの親に使用することもできます。 たとえば、phong マテリアルを新しい球に追加したい場合は、以下の記述を前の記述に追加することができます。
Set oMaterial = oSphere.AddMaterial("Phong")
シーン内のオブジェクトを検索するには、検索対象モデルの FindChild メソッドまたは FindChildren メソッドを使用する必要があります。 どちらのメソッドも複数の検索方法を提供しますが、FindChild は条件に合致する最初のオブジェクトを戻し、FindChildren は条件に合致する全オブジェクトのコレクションを戻す点で異なります。
Name: 文字列で表現するオブジェクト名。 「co*」で始まる任意のオブジェクトも検索できるよう、文字列にはワイルドカードを使用できます。
Type: 文字列または定数で表されるオブジェクトのタイプ。 使用できる値の一覧については、siType 定数のリファレンス ページを参照してください。
Family: オブジェクトが所属するファミリの名前。 ファミリとは、接続されるオブジェクトのグループです。 規則性を持たずに接続されることもあれば(ジオメトリ)、非常に似ているタイプが接続することもあります(トポロジ オペレータ)。 使用できる値の一覧については、siFamily 定数のリファレンス ページを参照してください。
' Set up the scene with a cube set oRoot = ActiveSceneRoot oRoot.AddGeometry "Cube", "MeshSurface", "cubeist" ' Find the first thing starting with "cube" Set oCube = oRoot.FindChild( "cube*" ) ' Here's a check to make sure that an empty object doesn't crash the script if Application.ClassName( oCube ) <> "Nothing" then Application.LogMessage "Found " & oCube.Name else Application.LogMessage "Couldn't find it... Sorry." end if ' Script outputs the following: 'INFO : "Found cubeque"
Set oLights = ActiveSceneRoot.FindChildren( , "light" ) ' Once you get the collection of lights you can loop through it ' Here's another check to make sure the collection isn't empty if oLights.Count > 0 then Application.LogMessage "Found the following member(s)..." For Each oMember in oLights Application.LogMessage vbTab & oMember Next else Application.LogMessage "Couldn't find it... Sorry." end if ' Script outputs the following: 'INFO : "Found the following member(s)..." 'INFO : " light"
' Set up two nested nulls under the scene root set oRoot = ActiveSceneRoot set oNested = oRoot.AddNull("Nodule") oNested.AddNull ' Starting at the lower nested level, look for any nulls underneath printFindResults oNested ' Then look at the scene root printFindResults oRoot function printFindResults( in_object ) set oNullColl = in_object.FindChildren( ,,siNullPrimitiveFamily ) ' Check to make sure empty collections won't crash the script if oNullColl.Count > 0 then LogMessage "There are " & oNullColl.Count & " null primitives under " _ & in_object.Parent.Name & ":" for each oNP in oNullColl LogMessage vbTab & oNP.Name & " is nested under " & oNP.Parent.Name next else LogMessage "Couldn't find it...Sorry." end if end function ' Output of above script: 'INFO : "There are 2 null primitives under Scene_Root:" 'INFO : "Nodule is nested under Scene_Root" 'INFO : "null is nested under Nodule" 'INFO : "There are 4 null primitives under Scene_Root:" 'INFO : "Camera_Root is nested under Scene_Root" 'INFO : "Camera_Interest is nested under Camera_Root" 'INFO : "Nodule is nested under Scene_Root" 'INFO : "null is nested under Nodule"
パラメータの中には、オブジェクトに直接定義されるパラメータもあれば(最初に経由するパラメータ セットまたはプロパティ セットが構成されない)、パラメータ セット(プロパティ)経由でしかアクセスできないパラメータもあります。
オブジェクトから直接 ParameterCollection にアクセスするか、PropertyCollection の各メンバを経由して ParameterCollection にアクセスすることによって、オブジェクトのパラメータに関するすべての情報を取得できます。
以下の例は、Softimage からすべてのパラメータ名と説明を取得して、ハード ディスク上のテキスト ファイルに情報をダンプします。
このスクリプトを Softimage の Script Editor にコピー アンド ペーストし、実行します。 実行した後、C:¥Temp¥Camera_Parameter_List.txt. にあるテキストファイルに記述された情報を確認できます。
' First get the camera set oCamera = ActiveSceneRoot.FindChild( ,siCameraPrimType ) ' Check to make sure it found something (prevent it from crashing) if ClassName( oCamera ) <> "Nothing" then ' Write some headers to identify the start and end of ' the list of parameters sOutput = "========================================" & _ "========================================" & vbLf sOutput = sOutput & "PARAMETERS directly on the " & _ oCamera.Name & " object......" & vbLf sOutput = sOutput & "----------------------------------------" & _ "----------------------------------------" & vbLf ' Print out the information for each parameter for each oParam in oCamera.Parameters sOutput = sOutput & oParam.ScriptName & ": " & vbTab & _ "(" & oParam.Name & ")" & vbTab & _ oParam.Description & vbLf next for each oProp in oCamera.Properties ' Write some headers to identify the start and end of ' the list of parameters sOutput = sOutput & "----------------------------------------" & _ "----------------------------------------" & vbLf sOutput = sOutput & "PARAMETERS on the " & oCamera.Name & "." & _ oProp.Name & " property......" & vbLf sOutput = sOutput & "----------------------------------------" & _ "----------------------------------------" & vbLf ' Print out the information for each parameter for each oParam in oProp.Parameters sOutput = sOutput & oParam.ScriptName & ": " & vbTab & _ "(" & oParam.Name & ")" _ & vbTab & oParam.Description & vbLf next next ' Write a footer to identify the end of the file sOutput = sOutput & "========================================" & _ "========================================" & vbLf end if ' Write the output to the external file set fso = CreateObject( "Scripting.FileSystemObject" ) set ts = fso.CreateTextFile( "C:\Temp\Camera_Parameter_List.txt", true ) ts.Write sOutput ts.Close ' Just so you know when it's done Application.LogMessage "Output complete."
スクリプト開発者の多くは、記述したいスクリプトの特定コマンドの構文を正しく記述するために、History Log の自動ログ機能を使用しています。 また、一部の開発者は Softimage の Explorer の[ビュー]メニュー、[スクリプト名の使用]機能を有効にし、スクリプティングにおける各オブジェクトへの参照方法を確認します。
ただし、オブジェクト モデルでは別の方法でオブジェクトやパラメータにアクセスします。 Script Editor の History Log は、コマンドとともに使用できるオブジェクトおよびパラメータの名前(通称ストリング エクスプレッション)を表示しますが、オブジェクト モデルの場合は必ずしもそうではありません。 オブジェクト モデルは固有のオブジェクト名およびパラメータ名のセットを使用し、その中にはショートカットを持つものもあります。
オブジェクト モデルを使用したい場合はショートカットが含まれていることもありますが、検索先を探しておくことは有益です。 Explorer に表示される階層を下に展開していくのみです。
' First get the camera (Camera object) set oCamera = ActiveSceneRoot.FindChild( , siCameraPrimType ) ' Underneath the camera are its properties (Properties returns the ' PropertyCollection) set oProps = oCamera.Properties ' Once you have all the property sets (PropertyCollection) you can specify the ' one you want (the Property object is returned) set oVis = oProps( "visibility" ) ' Now we have a single Property (property set), so we need to get all the ' parameters for that property set (Parameters returns the ParameterCollection) set oParams = oVis.Parameters ' Again we choose the single parameter we want from the collection (the ' Parameter object is returned) ' NB: This is where what appears in the History Log comes into play... set oViewVis = oParams( "viewvis" ) ' And once you have a single Parameter object, you can get it's value... ' (the line below returns 'INFO : "False") logmessage oViewVis.Value ' ...or set it... oViewVis.Value = true ' And you can make as many shortcuts as you like, so... oCamera.Properties( "visibility" ).Parameters( "viewvis" ).Value = false
オブジェクト モデルを使用してパラメータを設定すると、最大値と最小値を省略できます。 ただし、許容範囲外の値を設定すると、予想できない結果が生じる可能性があります。
これを避けるためにも、パラメータの最大値/最小値を変更する前に、許容される最大値/最小値を取得することが、プログラミングでは重要になります。
' Pick a number out of the air for the new value for a parameter dProposedValue = -10.00 ' Set up an object and get its Display::Near Distance to ' Output Camera parameter set oNull = ActiveSceneRoot.AddNull() set oParam = oNull.Properties( "display" ).Parameters( "neardist" ) ' Get the range of allowable values for this parameter dMaxValue = oParam.Max dMinValue = oParam.Min ' Now check the number you were going to use against the range if dProposedValue > dMaxValue then ' Here is where you write some code to handle it Application.LogMessage dProposedValue & " has exceeded the " _ & "maximum value (" & dMaxValue & ") set for this " _ & "parameter. Please adjust the value and try again." elseif dProposedValue < dMinValue then ' Here is where you write some code to handle it Application.LogMessage dProposedValue & " has not met the " _ & "minimum value (" & dMinValue & ") set for this " _ & "parameter. Please adjust the value and try again." else ' Here is where you update the parameter with your value oParam.Value = dProposedValue Application.LogMessage oParam.Name & "'s value = " & oParam.Value end if ' Output of above script: 'INFO : "-10 has not met the minimum value (0) set for this parameter. Please adjust the value and try again."
作業をするオブジェクトを指定した後で、そのオブジェクトに関する説明と、そのオブジェクトの使用目的を記述する必要があります。 たとえば、オブジェクトの名前を Script Editor のヒストリ ペインに表示したい場合は、次のように記述します。
Set oRoot = ActiveSceneRoot Set oThing = oRoot.AddGeometry( "Cube", "MeshSurface" ) Application.LogMessage oThing.Name ' Getting information If you want to change the name of the object instead, you could use this code fragment: Set oRoot = ActiveSceneRoot Set oThing = oRoot.AddGeometry( "Cube", "MeshSurface" ) oThing.Name = "Toybox" ' Setting information