スクリプト コマンドを使ってパラメータ値を処理する場合、SetValue および GetValue コマンドを使用できます。このコマンドを使用するには、パラメータのスクリプト名が分かっている必要があります(「パラメータ名の検索」を参照)。
オブジェクト モデルを使用している場合は、ParameterCollection を使って、どのプロジェクト アイテムからも直接にパラメータ値を取得し設定できます。
これらの両方の方法で、パラメータ名の指定時に冗長な標準形式を省略できるショートカットを使用できます。これらのショートカットはすべてのパラメータのセットに使用できるわけではありません。 詳細については、「ショートカットの使用」を参照してください。
パラメータの値を取得するには、まず対象となるオブジェクトを特定してからパラメータを特定します。 その後で、変数に値を格納するか直接にその値を処理できます。
次のように、引数にパラメータのフルネームを取る GetValue コマンドを使用できます。
rtn = GetValue( "light.Name" );
次のように、パラメータの Parameter.Value プロパティを使用できます。
// Get a pointer to the parameter first var p = oObject.Parameters( "Name" ); rtn = p.Value; // Or just get the value directly rtn = oObject.Parameters( "Name" ).Value;
コマンドまたはオブジェクト モデルのいずれを使用するかによって、パラメータのフル パスを判断する必要があります。 詳細については、「パラメータ名の検索」を参照してください。
例: Softimage ネイティブ コマンドを使用したカメラ視野角の取得
' Get an object containing the camera's fov lFOV = GetValue( "Camera.camera.fov" ) ' Display the value LogMessage "Camera's field of view = " & lFOV
' Get an object containing the camera's fov set oCamera = ActiveSceneRoot.FindChild( "Camera" ) ' Display the value LogMessage oCamera.ActivePrimitive.Parameters( "fov" ).Value ' Or, the identical approach using shortcuts: LogMessage oCamera.fov.Value
値を設定する作業は値を取得する作業に似ていますが、変更予定のパラメータへのリファレンスを指定する以外にパラメータの設定値も指定しなければならない点で異なります。
次のように、第 1 引数にはパラメータのフルネーム、第 2 引数には適用する新しい値を指定する SetValue コマンドを使用できます。
SetValue( "light.Name", "Sparky" );
次のように、パラメータの Parameter.Value プロパティを使用できます。
// Get a pointer to the parameter first var p = oObject.Parameters( "Name" ); p.Value = "Sparky"; // Or just set the value directly oObject.Parameters( "Name" ).Value = "Sparky";
コマンドまたはオブジェクト モデルのいずれを使用するかによって、パラメータのフル パスを判断する必要があります。 詳細については、「パラメータ名の検索」を参照してください。
Softimage ネイティブ コマンドを使用して値を設定する場合、値を相対的に変更したり、値の範囲を使用したり、ランダムな値を使用したりすることができます。 オブジェクト モデルを使用すると、オブジェクトのコレクション全体を対象に値を変更できます(ただし、その値がコレクション全体に関連付けられていることを前提とします)。
Softimage ネイティブ コマンドを使用して複数の球を一括移動するには
この例では、ワイルドカードを含む文字列 sphere*を使用して、「sphere」で始まるすべてのオブジェクトを対象として絞り込んでいます。 ターゲットに続く文字列「.kine.local.posy」は、変更されるパラメータが Y のローカル位置であることを示しています。最終的に、最後の引数は現在の値を 10 単位増やします。 代わりに現在値を 10 に設定する場合は、プラス(+)記号を付けずにその数値を使用してもかまいません。
SetValue "sphere*.kine.local.posy", "10+"
この例では、オブジェクト名に依存していません(球に「Buck」、立方体に「sphere」などの名前が指定される可能性もあるためです)。このため、正確度は多少向上していますが、代わりにシーンにあるすべての球からコレクションが構築されます。 その後、既存の値に 10 を追加してコレクション内にある各球の Y のローカル位置の値を 1 つずつ増分します。
' Find all the spheres under the Scene Root Set oRoot = ActiveProject.ActiveScene.Root Set oSpheres = oRoot.FindChildren( , "Sphere" ) ' Loop through the whole collection and add 10 to ' each sphere's position in Y For Each s in Spheres s.posy = s.posy.Value + 10 Next
上の例では、Y のローカル位置用のパラメータ値は、「posy」(ショートカット名)で表されます。ショートカットおよびその使用方法の詳細については、「ショートカットの使用」を参照してください。
コーディング用のパラメータ名は、Animation パネル上のマークパラメータ表示ボックスの中に表示されるパラメータと同じ名前です。 名前でそのパラメータを参照する方法は、Softimage ネイティブ コマンド内で使用するか、オブジェクト モデルで使用するかによって異なります。
Softimage ネイティブ コマンド内のパラメータの名前には、ターゲットとなるシーン オブジェクトを識別するための文字列式が使用されます。その文字列式を拡張するだけで、それらのオブジェクト上にあるパラメータを含めることができます。
パラメータ用のスクリプト名は、Explorer に表示されるパス名と必ずしも同じではありません。 スクリプト名はスペースを含めることのできない内部的な名前ですが、Explorer にユーザ インタフェースのラベルが表示されます。
スクリプト名とインタフェース ラベル間の相違点の詳細については、Parameter.ScriptName を参照してください。Explorer にスクリプト名を表示する方法については、「Scene Explorer を使用したパラメータ名の判定」を参照してください。
例: Softimage ネイティブ コマンド内のパラメータ名
SetValue "myModel.cone.kine.local.ori.euler.rotx", 90
cone はオブジェクトです。 現在の選択範囲では、オブジェクト名を省略し、残りのパラメータ名の前にピリオドを置くことができます。 たとえば、.kine.local.ori.euler.rotx には現在の選択されているオブジェクト用のローカル X 回転を指定します。
kine.local.ori.euler は次のように分解できる複合体のエレメントを格納します。
kine.local は KinematicState オブジェクトであり、プロパティ セット(kine)とコンパウンド パラメータ(local)から構成されます。
ori.euler は、パラメータの正確なパスとしてori.euler.rotx を格納する特殊な種類のコンパウンド パラメータです。
場合によっては、この複雑なパスの一部を省略できることもあります(「ショートカットの使用」を参照)。
プロジェクト アイテムのパラメータの大半でその情報にアクセスする場合、オブジェクト モデルでは ParameterCollection を使用します。Softimage ネイティブ コマンドと同様、まずターゲットを特定してから、コレクションとしてのそのパラメータにアクセスする必要があります。
Autodesk Softimage SDK のすべてのコレクションと同様、メンバのインデックス(0 から開始する番号を基準とした位置)またはメンバ名を使用して、メンバの識別を可能にしています。 ParameterCollection の場合、Softimage ネイティブ コマンド内に使用されているパラメータのスクリプト名を使用できます。
Set oRoot = ActiveProject.ActiveScene.Root Set oCone = oRoot.AddGeometry("Cone", "MeshSurface") oCone.Kinematics.Local.Parameters("rotx") = 90
ショートカットを使用すると、オブジェクトおよびそのパラメータ間にある階層の一部を省けます。 詳細については、「ショートカットの使用」を参照してください。
Set oRoot = ActiveProject.ActiveScene.Root Set oCone = oRoot.AddGeometry("Cone", "MeshSurface") oCone.rotx = 90
パラメータ名を判定するには、プロパティ エディタでパラメータの値を変更して、コマンド ヒストリの中にログ出力される内容を確認するのも 1 つの方法です。以下のようにします。
オブジェクト(または Explorer 内の任意のノード。目的のオブジェクトを探すには、スコープおよびフィルタ オプションを使用)を選択します。
Enter キーを押してプロパティ エディタを開くとオブジェクトのプロパティが表示されます。[Alt]+[Enter]を押してプロパティ エディタを開くとオブジェクトのプロパティがすべて表示されます。
結果コマンドが Script Editor のヒストリ ペインに表示されます。 表示形式は以下のとおりです。
SetValue "[Model.]Object.Property.Parameter", Value
Explorer でパラメータにマークを付けてから SetMarking コマンド結果の引数を検査して、パラメータ名を判定することもできます。ただし、SetMarking コマンド実行時は、ログ出力される名前は現在選択されているノードを基準としたものであるため、プロパティ セットが一部しか表示されない場合もあります。
Scene Explorer を使用してパラメータ名を判定する
スクリプトのパラメータ名を判定する方法としては、上記以外にも、スコープを Selection または Scene のどちらかに設定した状態で Explorer にスクリプト名を表示する方法があります。
Explorer ウィンドウのメニューから項目を選択し、表示するシーン構造を選択することができます。
A |
表示するシーン構造を選択するには、[スコープ](scope)ボタンをクリックします。 |
B |
メニューにチェックマークの付いている項目は、現在表示されているビューを示します。 |
C |
メニューの太字の項目は、前回表示されていたビューを示します。 [スコープ](scope)ボタンを中央クリックすると、このビューをすばやく選択できます。 |
[ビュー](Show)[スクリプト名の使用](Use Script Names)を選択すると、ノードとパラメータにスクリプト名が使用されます。 たとえば、[Kinematics]>[Global Transform]>[Pos]>[X]にスクリプト名を使用すると、[kine]>[global]>[pos]>[posx]になります。
階層が短縮された場合にマウス ポインタをパラメータの上に移動すると、プロパティ パスとパラメータの名前を確認できます。ツールチップが開き、パラメータのパスと名前が表示されます。 スクリプト名の使用がオンの場合は、ツールチップにスクリプトのパスと名前が表示されます。 スクリプトに必要ない文字列(kine など)は、ツールチップに表示されるパスから省略されます。
名前が同じ複数のパラメータ セットの 1 つに属するパラメータへアクセスしたい場合があります。 たとえば、同じタイプの複数のコンストレイント(位置コンストレイントなど)をシーン オブジェクトに適用する場合です。 たとえば、同じタイプのコンストレイントが「Position Cns」という名前でコンストレイント スタックに 3 つ存在することもあります。
ミュート設定などを目的にどの位置コンストレイントにアクセスするかを識別するには、[Scene Explorer]内でその位置コンストレイントの横に表示されるインデックス番号(開始番号は 0)を指定する必要があります。
Softimage の複雑なオブジェクトは、数百個、時に数千個の個々のパラメータによって記述される場合があります。 これらのパラメータは、プロパティ、オペレータ、プリミティブ、シェーダ、別のエレメント(この複雑なオブジェクトを記述する別のオブジェクト)から構成される階層全体にわたって分布された状態で存在します。
オブジェクト モデルを使用するとこの階層内を移動できるので、各 ProjectItem オブジェクトを検索し、そのパラメータを見つけ出すことができます。 ただし、使用頻度の高いパラメータの一部は、利便性を考慮して階層の上位に昇格された形もとっており、X3DObject 親に直接関連付けられたパラメータのように扱うことが可能です。 これらはショートカットと呼ばれます。
スクリプトではショートカットを使用することも、プロパティとパラメータのフルネーム構文を使用することも可能ですが、コンパイル済みコードではパラメータのフルネーム構文のみがサポートされています。 ショートカットを使用するとフル ネームを指定する必要がなく、中間ノードの名前を省略できます。ショートカットはスクリプトの作成時にコマンドとオブジェクト モデルの両方で使用できます。
プロパティ セット名に含まれるノード名のうち、以下のものは省略可能です。
たとえば、cone が選択されている場合、以下のステートメントは同等です。
SetValue "cone.kine.local.ori.euler.rotx", 90 SetValue ".kine.rotx", 90 Selection(0).Kinematics.Local.Parameters("rotx").Value = 90 Selection(0).rotx.Value = 90
C++ では、残念ながらショートカットを使用できません。 パラメータは通常の構文で参照する必要があります(これはショートカットとして表示されるパラメータにも当てはまります)。
たとえば、「立方体」オブジェクトの各パラメータの名前と値を出力するために、以下のコード断片を使用できます。
using namespace XSI; Application app; Model root = app.GetActiveSceneRoot(); X3DObject myCube; root.AddGeometry( L"Cube", L"MeshSurface", CString(L"MyCube"), myCube ); // print the names of all parameter exposed by the cube object CRefArray params = myCube.GetParameters(); for (long i = 0 ; i < params.GetCount(); ++i ) { Parameter param(params[i]); app.LogMessage ( param.GetScriptName() + L" = " + param.GetValue().GetAsText() ); }
オブジェクト モデルのショートカット使用法に関する詳細情報を入手する
オブジェクト モデルのショートカットに対応しているエレメントには、以下のようにいくつかの種類があります。
3D オブジェクト(カメラ、コントロール オブジェクト、ラティス、ライト、モデル プリセット(人物用スケルトンのプリセット、プリミティブなど)
Scene プロパティ(アンビエント ライティング、アノテーション、表示、ジオメトリ アプロクシメーション、マテリアル、テクスチャ投影、表示/非表示、ウェイトマップなど)
すべてのシェーダ(異方性、Blinn、コンスタント、Cook-Torrance、Lambert、Phong、ストロースなど)
コンストレイント(2 ポイント、3 ポイント、バウンディング ボリューム、カーブ パス、方向、距離、オブジェクトをクラスタに、向き、ポーズ、位置、スケーリング、サーフェイス パス、アップ ベクトルなど)
すべてのパラメータがすべてのオブジェクトでサポートされているわけではありません。 各カテゴリで使用できるプロパティについては、「ショートカット リファレンス」で説明しています。