Softimage オブジェクトモデルの使い方(初心者向け)

 
 
 

オブジェクト モデルを使用してコードを記述するには通常、次の手順を実行します。

  1. 作業場所を指定します(「ワークスペースを定義する」を参照)。

  2. 操作対象のオブジェクトを指定します(「オブジェクトを識別する」を参照)。

  3. 操作対象のオブジェクトの使用目的と説明を記述します(「オブジェクト データを取得および設定する」を参照)。

オブジェクト モデルのコンポーネントの使い方に関する詳細は、『C++ API リファレンス』または『コマンドおよびスクリプト リファレンス』の個々のヘルプを参照してください。

ワークスペースを定義する

最初に示す必要があるのは、操作対象のオブジェクトを検索する場所です。 通常はシーン ルートで検索を開始します。

シーンのルート モデルを取得するには

  • Application オブジェクトには、直接ルートにアクセスするプロパティがあります。

    Application.ActiveSceneRoot
    注:

    ご使用のスクリプトが Softimage 内部で実行されている場合は、Application という単語を省略できます。 これは、Application オブジェクトがグローバルであるためです。 つまり、以下の 2 つの記述は同じ意味を持ちます。

    ActiveSceneRoot
    Application.ActiveSceneRoot
    ヒント:

    Set 構文を使用してオブジェクトを変数に割り当てて、以降の手順ですばやくそれらを参照できるようにします。 必要に応じて、Set 構文を組み合わせることができます。 次の構文を使用すると、オブジェクト ポインタがシーン ルートに置かれます。

    set oRoot = ActiveSceneRoot

アクティブ シーンを取得するには

  • Project オブジェクトの ActiveScene プロパティにアクセスします。

    Application.ActiveProject.ActiveScene

アクティブ プロジェクトを取得するには

  • Application オブジェクトの ActiveProject プロパティにアクセスします。

    Application.ActiveProject

オブジェクトを識別する

検索場所を指定したら、操作するオブジェクトを指定する必要があります。 このプロセスは、オブジェクトをシーンに追加するのか、または既存のオブジェクトを操作するのかによって異なります。

シーンに追加する

シーンに 3D オブジェクトを追加するには、その親となるオブジェクト(通常はルート モデル)のメソッドを使用します。 たとえば、ポリゴン メッシュの球を作成したい場合は、ルート モデル オブジェクトの AddGeometry メソッドを使用する必要があります。

Set oSphere = ActiveSceneRoot.AddGeometry( "Sphere", "MeshSurface" )

シーン アイテムそのものを他のオブジェクトの親に使用することもできます。 たとえば、phong マテリアルを新しい球に追加したい場合は、以下の記述を前の記述に追加することができます。

Set oMaterial = oSphere.AddMaterial("Phong")

既存の Softimage オブジェクトを使った操作

シーン内のオブジェクトを検索するには、検索対象モデルの FindChild メソッドまたは FindChildren メソッドを使用する必要があります。 どちらのメソッドも複数の検索方法を提供しますが、FindChild は条件に合致する最初のオブジェクトを戻し、FindChildren は条件に合致する全オブジェクトのコレクションを戻す点で異なります。

以下の条件を使って検索できます。

  • Name: 文字列で表現するオブジェクト名。 「co*」で始まる任意のオブジェクトも検索できるよう、文字列にはワイルドカードを使用できます。

  • Type: 文字列または定数で表されるオブジェクトのタイプ。 使用できる値の一覧については、siType 定数のリファレンス ページを参照してください。

  • Family: オブジェクトが所属するファミリの名前。 ファミリとは、接続されるオブジェクトのグループです。 規則性を持たずに接続されることもあれば(ジオメトリ)、非常に似ているタイプが接続することもあります(トポロジ オペレータ)。 使用できる値の一覧については、siFamily 定数のリファレンス ページを参照してください。

    注:

    指定できる他のパラメータは、ブール(False または True のいずれかにのみ指定できる)値である Recursive です。 False を指定した場合、メソッドは現在のオブジェクトの子のみを検索します。それ以外の場合は、その子孫がすべて検索されます。

「cube」で始まる最初のオブジェクトにアクセスするには

	' 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"
ヒント:

この例では Name パラメータでワイルドカードが使用されているため、このメソッドは最初に検索されたものに応じて「cube」、「cube99」、または「cubeist」を戻します。

Type パラメータを使ってシーン ルート以下のすべてのライトにアクセスするには

	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"
ヒント:

この例では Light Primitive タイプの文字列名が使用されていることに注意してください。 代わりに、siLightPrimType(引用符を含まない)の定数の名前を使用することもできます。

シーン内の null プリミティブの数を検索するには

' 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