Object Hierarchy | 関連する C++クラス:SimulationEnvironment
SimulationEnvironment
v4.2
SimulationEnvironment オブジェクトは、シミュレーションを定義するために使用される構造を表します。現在 SimulationEnvironment オブジェクトは RigidBody シミュレーションにのみ使用されます。シミュレーション環境は接続コンテナのセットです。各コンテナはシミュレーション内のエレメントの種類(リジッドボディオブジェクト、リジッドボディコンストレイント、フォース)に対応します。この環境ではシミュレーション内のオブジェクト間の関係が追跡され、ダイナミクスオペレータが適用されるオブジェクトが決定します。ダイナミクス オペレータは、この環境内のすべてのエレメントについてシミュレーションを計算します。 さらに、TimeControl オブジェクトでは、この環境のシミュレーションをどのように再生するかを指定します。
環境は、CreateActiveRigidBodyまたはCreatePassiveRigidBodyを使用して取得できる RigidBody オブジェクトを作成すると、作成されます。CreateEnvironment を使用して、環境を明示的に作成することもできます。SimulationEnvironment オブジェクトは、Scene.ActiveSimulationEnvironment または Scene.SimulationEnvironments によって取得できます。
/* 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(); } |
# # 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() |