3D オブジェクトフィルタの記述

 
 
 

3D オブジェクト ファミリに属しているオブジェクト(たとえば、ポリゴン メッシュ、サーフェイス、カーブ、インプリシット プリミティブ、コントロール オブジェクト、モデル、ヌル、カメラ、ライト)は、3D オブジェクト フィルタを使用してフィルタされます。

ユーザが 3D オブジェクト選択フィルタをアクティブにすると、3D ビュー(オブジェクト ビュー)内またはスケマティック内で選択が試みられた各 3D オブジェクトに対して Match が呼び出されます。 スケマティック内の非 3D オブジェクト(たとえば、Material オブジェクトや ParticleType オブジェクト)に対しては Match が呼び出されません。 3D オブジェクト フィルタがアクティブの場合、それらのタイプのオブジェクトをクリックすると、[すべて選択解除]コマンドが起動します。

同様に、ユーザが 3D オブジェクト フィルタを Explorer ビューに適用すると、ビュー内に現在リストされている各 3D オブジェクトに対して Match が呼び出されます(ただし、Subset が未定義の場合は、3D オブジェクトのリストに対して Subset が呼び出されます)。

Match

Softimage で Match が呼び出されると、コンテキストの Input 属性に 3D オブジェクトが格納されます。 入力オブジェクトを取得するには、Context.GetAttribute()メソッドを使用します。 入力オブジェクトを取得して、その入力オブジェクトに保持されているポイントが 50 未満かどうかをチェックする方法を、次の例に示します。

function MySmallMesh_Match( oContext )
{
	// Get the object from the Input attribute of the context
	var o3DObject = oContext.GetAttribute( "Input" );

	// Check if the object matches the filter conditions
	var bMatch = ( classname( o3DObject ) == "X3DObject" ) &&
		( o3DObject.ActivePrimitive.Geometry != undefined ) &&
		( o3DObject.ActivePrimitive.Geometry.Points.Count <= 50 );

	// Return true to keep the object, false to filter the object out
	return ( bMatch );
}

フィルタは、コンテキストから 3D オブジェクトを取得した後、そのオブジェクトが X3DObject であるかどうかをチェックします。 3D オブジェクト ファミリの他のメンバ(たとえば、ヌル、カメラ、ライト)は、ポリゴン メッシュ、サーフェイス、カーブのようなポイントを持たないため、除外されます。

フィルタは Points.Count へのアクセスを試みる前に、3D オブジェクトがジオメトリを持つかどうかを確認します。なぜなら、一部の 3D オブジェクト(たとえば、インプリシット プリミティブ、コントロール オブジェクト、ジオメトリ シェーダ プリミティブ)は、Geometry プロパティを持たないためです。

Subset

ユーザが Explorer ビューに 3D オブジェクト フィルタを適用すると、Subset コールバックが呼び出されます。 Subset コールバックを指定しない限り、各オブジェクトに対して Match が呼び出され、サブセット コレクションが単独でビルドされます。

Softimage で Subset が呼び出されると、コンテキストの Input 属性に XSICollection が格納されます。 このコレクションには、3D オブジェクト(たとえば、X3DObject、Camera、Light、Null、Model、ChainEffector)が包含されています。 Subset コールバックのジョブは、フィルタ条件に適合するオブジェクトだけを保持する新規のコレクション(サブセット)をビルドし、この新規のコレクションをコンテキストの Output 属性に格納することです。

たとえば、次の Subset コールバックは、ポイントが 50 未満の 3D オブジェクトのコレクションをビルドします。 サブセットが空の場合でも Output 属性を設定する必要があるので、注意してください。 戻り値は、サブセットが空かどうかを示します。

function MySmallMesh_Subset( oContext )
{
	// Get a new collection to hold the output subset
	var cloOutput = new ActiveXObject( "XSI.Collection" );

	// Get the collection of objects to filter
	var cloInput = oContext.GetAttribute( "Input" );

	// Enumerate the objects. If an object matches, add it to the output subset
	for (var enumerator = new Enumerator(cloInput) ; !enumerator.atEnd(); enumerator.moveNext())
	{
		var o3DObject = enumerator.item();
		if ( object_isamatch( o3DObject ) )
		{
			cloOutput.Add( o3DObject );
		}

	}

	// Put the subset in the Output attribute		
	oContext.SetAttribute( "Output", cloOutput );

	// Return true if the subset is non-empty
	return (cloOutput.Count > 0);
}

// Helper function that checks if a 3D object matches the filter conditions
function object_isamatch( o )
{
	return	(
		classname( o ) == "X3DObject" &&
		o.ActivePrimitive.Geometry != undefined &&
		o.ActivePrimitive.Geometry.Points.Count <= 50
		) ;
}