パーティクル クラウドの作成

 
 
 

プリミティブを指定してエミッタを作成し、EmitPointsFromObject コマンドの基準として使用できるようにします。このコマンドは、基本的に新しいポイントクラウド上で作業するシミュレート ICE ツリーを設定します。このエミッタは、パーティクルの標準設定(寿命、サイズ、方向、質量など)を保存するために、エミッタオブジェクトの作成、オペレータスタックへの ICE ツリーオペレータの追加、および多くの ICE ノードとコンパウンドの追加を行います。

ツリーが設定されたら、SetValue コマンドで以下の構文を使用して、個々の値の変更を開始できます。

<PointCloud>.<PointCloudPrimitive>.ICETree.<nodename>.<portname>

AddICENode または AddICECompoundNode を呼び出し、ConnectICENodes を使用して接続することで、ICE ツリーに新しい基本ノードまたはコンパウンド ノードを追加できます。これらのテクニックは、すべて以下の例で説明されています。

JScript の例: スクリプトを解してパーティクル システムを設定する

この例では、ディスク パーティクル エミッションを設定し、最終的に球を追加することでシミュレート ICE ツリーを変更する方法を示します。

// Set up the emitter
NewScene("", false);
var emitter = CreatePrim("Disc", "MeshSurface");
var ptcloud = EmitPointsFromObject("disc");

// Set up goal (make it move around a bit)
var goal = SetMovementOnGoal();
AddICECompoundNode("Move Towards Goal", "PointCloud.pointcloud.ICETree");
AddPortToICENode("PointCloud.pointcloud.ICETree.port3", siNodePortDataInsertionLocationAfter);
AddICENode("GetDataNode", "PointCloud.pointcloud.ICETree");
ConnectICENodes("PointCloud.pointcloud.ICETree.port4", "PointCloud.pointcloud.ICETree.Move_Towards_Goal.Execute");
SetValue("PointCloud.pointcloud.ICETree.Move_Towards_Goal.Test_Distance", 0, null);
SetValue("PointCloud.pointcloud.ICETree.SceneReferenceNode[1].reference", "sphere", null);
ConnectICENodes("PointCloud.pointcloud.ICETree.Move_Towards_Goal.Geometry1", "PointCloud.pointcloud.ICETree.SceneReferenceNode[1].value");

// Test it out
FirstFrame();
PlayForwardsFromStart();
FirstFrame();
PlayForwardsFromStart();


// Helper
function SetMovementOnGoal()
{
	var sph = CreatePrim("Sphere", "NurbsSurface");
	SetValue("sphere.sphere.radius", 1.5);
	SaveKey("sphere.kine.local.posx,sphere.kine.local.posy,sphere.kine.local.posz", 1, null, null, null, false);

	SetValue("PlayControl.Key", 32);
	SetValue("PlayControl.Current", 32);
	Translate(sph, 6.70968113705515, 4.86256743059746, -0.486256743059746, siRelative, siView, siObj, siXYZ, 
		null, null, null, null, null, null, null, null, null, 0);
	SaveKey("sphere.kine.local.posx,sphere.kine.local.posy,sphere.kine.local.posz", 32, null, null, null, false);
	
	SetValue("PlayControl.Key", 60);
	SetValue("PlayControl.Current", 60);
	Translate(sph, -14.9707336352791, 2.77860996034141, -0.277860996034141, siRelative, siView, siObj, siXYZ, 
		null, null, null, null, null, null, null, null, null, 0);
	SaveKey("sphere.kine.local.posx,sphere.kine.local.posy,sphere.kine.local.posz", 60, null, null, null, false);
	
	SetValue("PlayControl.Key", 98);
	SetValue("PlayControl.Current", 98);
	Translate(sph, 1.86164563340259, -14.1631924367402, 1.41631924367402, siRelative, siView, siObj, siXYZ, 
		null, null, null, null, null, null, null, null, null, 0);
	SaveKey("sphere.kine.local.posx,sphere.kine.local.posy,sphere.kine.local.posz", 98, null, null, null, false);
	
	StoreAction(sph, "sphere.kine.local.sclx,sphere.kine.local.scly,sphere.kine.local.sclz,sphere.kine.local.rotx,"
		+ "sphere.kine.local.roty,sphere.kine.local.rotz,sphere.kine.local.posx,sphere.kine.local.posy,sphere.kine"
		+ ".local.posz,sphere.kine.global.sclx,sphere.kine.global.scly,sphere.kine.global.sclz,sphere.kine.global."
		+ "rotx,sphere.kine.global.roty,sphere.kine.global.rotz,sphere.kine.global.posx,sphere.kine.global.posy,sp"
		+ "here.kine.global.posz", 5, "StoredAnimAction", null, 1, 98, null, null, true, 1);
	
	return sph;
}

また、パーティクル クラウドを操作するためのパーティクル オペレータを記述する方法を示す ParticleOp のサンプルを参照することもできます。このサンプルは、Softimage SDK のインストール フォルダにある examples フォルダにあります。