VolumeDocking サンプル スクリプト
説明:
次のサンプルは、Laszlo Sebo の VolumeDocking01.max シーンに基づいています。このサンプルでは、パーティクル フロー での次の MAXScript 操作について説明します。
-
共通アクションの作成
-
アクションをイベントに追加
-
アクションをイベントに挿入
-
アクションとイベントの複製
-
ワイヤリング
-
パーティクル ビュー内のイベントの再配置
用途:
このスクリプトは自己収容型で、すべてのオブジェクトと パーティクル フロー イベントおよびアクションを迅速に作成できます。
効果:
このスクリプトは、対応するアクションおよびイベントを備えたジオメトリ プリミティブと PF_Source を 2 つずつ作成します。
ジオメトリ オブジェクトは、パーティクルを塗り潰すボリュームとして使用されます。パーティクルの初期位置は、particleVector チャネルにダンプされます。パーティクルは、Find_Target アクションを使って、一方のボリュームからもう一方のボリュームへの道筋を検出し、旋回して位置を切り替えます。
例:
|
-----------------
-- SCENE SETUP --
-----------------
-- Set scene animation range to 150 frames
animationRange = interval 0f 150f
-- Create Cylinder primitive
cyl=cylinder radius:44 height:44 heightsegs:5 sides:18 pos:[-60, -55, 0]
-- Create a Torus primitive
tor=torus radius1:55 radius2:20 smooth:2 pos:[135, 120, 0]
-- Create a Vortex Space Warp
vor=vortex timeOff:33 axialStrength:22 rotationStrength:33 iconSise:40 rotation:(quat -1 0 0 0) pos:[20,35,-5]
-- PF_Flow setup
pf=PF_Source Show_Logo:off Show_Emitter:off Quantity_Viewport:100 isSelected:true
-------------------------------------
-- Action List - Appending Example --
-------------------------------------
-- Disable automatic Event Encapsulation & begin editing:
ParticleFlow.BeginEdit()
a1 = RenderParticles()--define Action 1
pf.AppendAction a1--append the Action to PF_Source
ParticleFlow.EndEdit()--End editing, enable Auto-Encapsulation
x=y=1--Initialize two variables
--Get the location of the PF_Source in Particle View:
pf.GetPViewLocation &x &y
------------------------
-- Define First Event --
------------------------
ParticleFlow.BeginEdit()--start editing
-- Create a Birth Action for Event 1
ev1_a1 = Birth Emit_Start:0 Emit_Stop:0 Amount:300
-- Create a Position Object Action for Event 1
ev1_a2 = Position_Object Location:4 Emitter_Objects:#(tor) name:"PositionObjectFirst"
-- Comment the Position Object
pf.SetComments ev1_a2 "The operator defines the destination point inside the target volume"
-- Create a Script Operator
ev1_a3 = Script_Operator()
-- Set the script operator’s script code as string.
-- The code enables Position and Vector channels,
-- the writes the particle position in the Vector channel
-- for all new particles.
ev1_a3.proceed_script = "on ChannelsUsed pCont do
(
pCont.usePosition = true
pCont.useVector = true
)
on Init pCont do
(\n
)
on Proceed pCont do
(
count = pCont.NumParticles()
for i in 1 to count do
(
pCont.particleIndex = i
if (pCont.particleNew) then
( pCont.particleVector = pCont.particlePosition)
)
)
on Release pCont do
(\n
)"
-- Comment the action:
pf.SetComments ev1_a3 "The script is used to dump particle position to script vector channel"
-- Clone the Position_Object action from Event 1
-- The result of the cloning will be stored in the
-- by-reference variable dc.
maxOps.cloneNodes ev1_a2 newNodes:&dc
-- Get the clone (first element of array)
ev1_a4 = dc[1]
-- Set the name of the action
ev1_a4.name ="PositionObjectSecond"
-- Set the Cylinder as the Emitter
ev1_a4.Emitter_Objects = #(cyl)
-- Comment the action:
pf.SetComments ev1_a4 "The operator defines the initial position of a particle inside a start volume. The destination position is overwritten but the real value is kept in Script Vector channel"
-- Create some more actions needed to control the particle system
ev1_a5 = Speed Direction:3
ev1_a6 = Rotation()
ev1_a7 = ShapeStandard Shape:1
ev1_a8 = DisplayParticles Type:6 Color:(color 255 0 0)
-- Create a new empty event, then append all already created
-- actions to it:
ev1 = Event()
ev1.AppendAction ev1_a1
ev1.AppendAction ev1_a2
ev1.AppendAction ev1_a3
ev1.AppendAction ev1_a4
ev1.AppendAction ev1_a5
ev1.AppendAction ev1_a6
ev1.AppendAction ev1_a7
ev1.AppendAction ev1_a8
-- Disable editing, enable Auto-Event-Encapsulation
ParticleFlow.EndEdit()
-- Append the event as the Initial Action List to the PF_Source.
-- This will connect the Event to the PF_Source.
pf.appendInitialActionList ev1
-- Position the Event inside the Particle View
ev1.SetPViewLocation x (y+100)
-------------------------------------
-- Action List - Inserting Example --
-------------------------------------
--Begin Editing again
ParticleFlow.BeginEdit()
ev1_a9 = Spin SpinRate:200 Variation:55--Create a Spin action
ev1_a10 = Force Influence:111--Create a Force
--Set the Vortex as Space Warp in the Force
ev1_a10.Force_Space_Warps = #(vor)
--Create and setup a Find_Target action:
ev1_a11 = Find_Target()
ev1_a11.name ="FindTarget"
ev1_a11.Cruise_Speed_Variation = 1000
ev1_a11.Acceleration_Limit=3000
ev1_a11.Aim_Point_Type = 2
ev1_a11.Icon_Size = 0
-- Comment the action:
pf.SetComments ev1_a11 "The destination point is defined by script vector. The script vector value was defined by the Script Operator 01 from the Position Object 01"
-- Insert the new actions into the existing Event
ev1.InsertAction ev1_a9 8
ev1.InsertAction ev1_a10 9
ev1.InsertAction ev1_a11 10
ParticleFlow.EndEdit()
-- Create a Second Event and its actions:
ParticleFlow.BeginEdit()
ev2_a1 = Speed Speed:0
ev2 = Event()
ev2_a2 = DisplayParticles Type:6 Color:(color 0 255 0)
ev2.AppendAction ev2_a1
ev2.AppendAction ev2_a2
ParticleFlow.EndEdit()
--Connect the second Event to the Find_Target
ev1_a11.setNextActionList ev2 ev1_a11
--Reposition the even
ev2.SetPViewLocation x (y+400)
-- Make copy of PF_Source and exchange Emitter objects
-- for Position_Object operators:
-- Clone the PF_Source and the two Emitters,
-- store the clones in a by-reference variable
maxOps.CloneNodes #(pf, ev1, ev2) newNodes:&dc
-- Get the PF_Source and Emitter clones
pfc = dc[1]
ev1c = dc[2]
ev2c = dc[3]
-- Get the current position of the Particle View...
x=y=1
pfc.GetPViewLocation &x &y
-- Reposition the two Events
ev1c.SetPViewLocation x (y+100)
ev2c.SetPViewLocation x (y+400)
-- Copy the emitter objects from the original Position_Objects
if $PositionObjectFirst01 != undefined then (
$PositionObjectFirst01.Emitter_Objects = ev1_a4.Emitter_Objects
)
if $PositionObjectSecond01 != undefined then (
$PositionObjectSecond01.Emitter_Objects = ev1_a2.Emitter_Objects
)
-- Bind the Find_Target Test output to the clone of the Second Event
if $FindTarget01 != undefined then (
$FindTarget01.setNextActionList ev2c $FindTarget01
)
-- Switch to Modify Tab
max modify mode
-- Open Particle View to see what happened...
ParticleFlow.OpenParticleView()
|