SimulationEnvironment

Object Hierarchy | 関連する C++クラス:SimulationEnvironment

継承

SIObject

ProjectItem

SimulationEnvironment

導入

v4.2

詳細

SimulationEnvironment オブジェクトは、シミュレーションを定義するために使用される構造を表します。現在 SimulationEnvironment オブジェクトは RigidBody シミュレーションにのみ使用されます。シミュレーション環境は接続コンテナのセットです。各コンテナはシミュレーション内のエレメントの種類(リジッドボディオブジェクト、リジッドボディコンストレイント、フォース)に対応します。この環境ではシミュレーション内のオブジェクト間の関係が追跡され、ダイナミクスオペレータが適用されるオブジェクトが決定します。ダイナミクス オペレータは、この環境内のすべてのエレメントについてシミュレーションを計算します。 さらに、TimeControl オブジェクトでは、この環境のシミュレーションをどのように再生するかを指定します。

環境は、CreateActiveRigidBodyまたはCreatePassiveRigidBodyを使用して取得できる RigidBody オブジェクトを作成すると、作成されます。CreateEnvironment を使用して、環境を明示的に作成することもできます。SimulationEnvironment オブジェクトは、Scene.ActiveSimulationEnvironment または Scene.SimulationEnvironments によって取得できます。

メソッド

AddCustomOp AddICEAttribute AddScriptedOp AddScriptedOpFromFile
AnimatedParameters2 BelongsToオペレータ EvaluateAt FindCacheForModel
GetICEAttributeFromName IsA IsAnimated2 IsClassOfオペレータ
IsEqualToオペレータ IsKindOf IsLockedオペレータ IsSelectedオペレータ
LockOwners RemoveICEAttribute SetAsSelectedオペレータ SetCapabilityFlagオペレータ
SetLock TaggedParameters UnSetLock  
       

プロパティ

Application BranchFlagオペレータ Caches Capabilitiesオペレータ
Categories Containers EvaluationID Familiesオペレータ
FullNameオペレータ Help HierarchicalEvaluationID ICEAttributes
LockLevelオペレータ LockMastersオペレータ LockTypeオペレータ Model
Nameオペレータ NestedObjects ObjectID Operators
Origin OriginPath Owners PPGLayoutオペレータ
Parametersオペレータ Parent Parent3DObject Selectedオペレータ
SimulationTimeControl Typeオペレータ    
       

1. JScript の例

/*

This example illustrates how to create a cached RigidBody simulation and 

apply that cache to animate the simulated objects directly without using

the simulation.

*/

NewScene( null, false );

var oCone = ActiveSceneRoot.AddGeometry( "cone","MeshSurface" );

var oModel = ActiveSceneRoot.AddModel();

oModel.Name = "Model";

var oGrid = oModel.AddGeometry( "grid","MeshSurface" );

// Move the cone

oCone.posy.value = 6.0;

// Modify the grid

oGrid.ulength.value = 24;

oGrid.vlength.value = 24;

oGrid.subdivu.value = 24;

oGrid.subdivv.value = 24;

// The following line creates the SimulationEnvironment object.

CreatePassiveRigidBody( oGrid );

CreateActiveRigidBody( oCone );

CreateForce( "Gravity" );

var oEnvironment = ActiveProject.ActiveScene.ActiveSimulationEnvironment;

var oSimulationTimeControl = oEnvironment.SimulationTimeControl;

// Turn the caching on.

oSimulationTimeControl.caching.value = true;

oSimulationTimeControl.playmode.value = 0; //Standard play mode.

// Simulate

// To make sure that all frames get simulated

for ( i=0; i<100; i++ ) {

	NextFrame();

	Refresh();

}

// Get all models in the scene (getting the identifier of the Scene Root's class = Model)

var sModelClassID = XSIUtils.DataRepository.GetIdentifier( ActiveSceneRoot, siObjectCLSID );

var oModels = FindObjects( "", sModelClassID );

ApplyCurrentEnvironmentCacheToSimulateObjectForModels( oModels );

// The FCurve animated objects

PlayForwardsFromStart();

// This function takes the cached simulation and copies it directly

// on the driven objects as FCurves. It also turns off the simulation

// so that we could

function ApplyCurrentEnvironmentCacheToSimulateObjectForModels( in_models )

{

	var eModels = new Enumerator( in_models );

	var oCurrEnvironment = ActiveProject.ActiveScene.ActiveSimulationEnvironment;

	var oSimulationTimeControl = oCurrEnvironment.SimulationTimeControl;

	// Deactivate the simulation so that objects are driven by their 

	// animation.

	oSimulationTimeControl.Active.Value = false;

	for ( ; !eModels.atEnd(); eModels.moveNext() ) {

		var oCurrModel = eModels.item();

		var oCache = oCurrEnvironment.FindCacheForModel( oCurrModel );

		var oSourceItems = oCache.SourceItems;

		var eSourceItems = new Enumerator(oSourceItems);

		for( ; !eSourceItems.atEnd(); eSourceItems.moveNext() ) {

			var oSourceItem = eSourceItems.item();

			strTarget = oSourceItem.Target;

			if ( oCurrModel.IsEqualTo(ActiveSceneRoot) == false ) {

				// ActionSource keeps the relative name of an

				// animated parameter. We need to prepend the

				// model name if the model owner is not the scene

				// root in order to fetch the parameter.

				strTarget = oCurrModel.Name + "." + strTarget;

			}

			var oTargetParameter = Dictionary.GetObject(strTarget);

			// The RigidBody simulation caches linear acceleration which

			// is not animatable. We won't be copying those values on 

			// the global transform.

			if ( oTargetParameter.Animatable ) {

				var oCachedFCurve = oSourceItem.Source;

				CopyFCurveOnParameter( oCachedFCurve, oTargetParameter );

			}

		}

	}

}

// This function creates a copy of an FCurve on a parameter by creating a new 

// FCurve on the parameter and adding all keys. It will take use the default

// Tangent and Interpolation.

function CopyFCurveOnParameter( in_FCurve, in_Parameter )

{

	var oNewFCurve = in_Parameter.AddFCurve2();

	var oFCurveKeys = in_FCurve.Keys;

	var eFCurveKeys = new Enumerator( oFCurveKeys );

	oNewFCurve.BeginEdit();

	for( ; !eFCurveKeys.atEnd(); eFCurveKeys.moveNext() ) {

		var oCurrentKey = eFCurveKeys.item();

		oNewFCurve.AddKey( oCurrentKey.time, oCurrentKey.value );

	}

	oNewFCurve.EndEdit();

}

2. Python の例

#

#     This example illustrates how to create cached RigidBody simulations, export 

#     that cache as an action source, import it into a new scene, and then 

#     instantiate it as a clip in the new mixer.

#

from win32com.client import constants as c

Application.NewScene( "", 0 )

oRoot = Application.ActiveSceneRoot

oCone = oRoot.AddGeometry( "cone","MeshSurface" )

oModel = oRoot.AddModel()

oModel.Name = "TestModel"

oGrid = oModel.AddGeometry( "grid","MeshSurface" )

# Move the cone

oCone.posy.Value = 6.0

# Modify the grid

oGrid.ulength.Value = 24

oGrid.vlength.Value = 24

oGrid.subdivu.Value = 24

oGrid.subdivv.Value = 24

# The following line creates the SimulationEnvironment object.

Application.CreatePassiveRigidBody( oGrid )

Application.CreateActiveRigidBody( oCone )

Application.CreateForce( "Gravity" )

oEnvironment = Application.ActiveProject.ActiveScene.ActiveSimulationEnvironment

oSimulationTimeControl = oEnvironment.SimulationTimeControl

# Turn the caching on.

oSimulationTimeControl.caching.Value = 1;

oSimulationTimeControl.playmode.Value = 0; #Standard play mode.

# Simulate, making sure that all frames get simulated

i=0

while i < 100 :

	Application.NextFrame()

	Application.Refresh()

	i = i + 1

# Export the action sources

aModelNames = [ "two", "one", "two", "one" ]

sPath = Application.InstallationPath( c.siProjectPath )

for oActionSource in oEnvironment.Caches :

	Application.ExportAction( oActionSource, sPath + "\\Actions\\SimCache" 

		+ aModelNames.pop() + ".xsi" )

# Dump the current scene and open a new one

Application.NewScene( "", 0 )

oRoot = Application.ActiveSceneRoot

oCone = oRoot.AddGeometry( "cone","MeshSurface" )

oGrid = oRoot.AddGeometry( "grid","MeshSurface" )

# Reload the sources

oNewAction = Application.ImportAction( oRoot, sPath + "\\Actions\\SimCache" 

	+ aModelNames.pop() + ".xsi", "MyImportedAction1", c.siSourceStorageTypeInternal )

Application.AddClip( oRoot, oNewAction )

oNewAction = Application.ImportAction( oRoot, sPath + "\\Actions\\SimCache" 

	+ aModelNames.pop() + ".xsi", "MyImportedAction2", c.siSourceStorageTypeInternal )

Application.AddClip( oRoot, oNewAction );

# Playback the results

Application.PlayForwardsFromStart()

関連項目

Scene.ActiveSimulationEnvironment Scene.SimulationEnvironments SetCurrentEnvironment