プリミティブを指定してエミッタを作成し、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;
}