フラグメントのサンプル スクリプト
説明:
次の例は、Parray パーティクル システムと Mesher Compound オブジェクトを使用してその場でオブジェクト フラグメントを生成するフラグメントのサンプル
スクリプトを示しています。
用途:
Birth_Script アクション内で、フラグメント パーティクルを作成するために使用します。
効果:
Init ハンドラ内で、スクリプトは、フラグメントを保持するためのフラグメント ソース オブジェクト、単一の PArray、単一の Mesher Compound、および
2 つの編集可能メッシュを用意します。次に、PArray を Mesher に割り当てます。
Proceed ハンドラで、スクリプトは、パーティクル システムの時間がフレーム 0 で、パーティクルが存在していないことを確認します。この場合、スクリプトは Mesher
から PArray のメッシュを取得し、そのメッシュを要素に分解し、新しいパーティクルを発生させ、それらにメッシュとフラグメントの位置を割り当てます。
スクリプトによってフラグメントのあるパーティクルが作成されたら、それらは通常どおり パーティクル フロー のオペレータでコントロールできます。
例:
|
--The ChannelsUsed handler defines the channels
--to be made available to the script.
--For the list of all channels, see
--Interface: MaxscriptParticleContainer
--The parameter pCont passed to the handler
--contains the Particle Container the script is applied to
on ChannelsUsed pCont do
(
pCont.useTime = true--enable the Time channel
pCont.useAge = true--enable the Age channel
pCont.usePosition = true--enable the Position channel
pCont.useSpeed = true--enable the Speed channel
pCont.useShape = true--enable the Shape channel
)
--The Init handler is called on initialization.
--This is where preparation works can be performed.
--The parameter pCont passed to the handler
--contains the Particle Container the script is applied to
on Init pCont do
(
-- Create a geometry primitive to break into fragments.
global bb = $Teapot_69e13b6c--a unique name
-- Create a PArray particle system to create the fragments.
global a = $PArray_36ce15a4--a unique name
-- Create a Mesher Compound object to turn PArray into mesh.
global mshr = $Mesher_23951616--a unique name
-- Create a mesh to hold the total mesh.
global totalMesh = $EMesh_5990501d--a unique name
-- Create a mesh to hold separate fragments.
global fragmentMesh = $EMesh_1589735c-- a unique name
--Disable screen redraw to speed up execution
withredrawoff(
-- If the source object does not exist in the scene...
if (bb == undefined) then (
-- create a Teapot for fragmentation, give it a unique name
bb = Teapot radius:20 smooth:on segs:6 body:on handle:on spout:on lid:on mapCoords:off
bb.name ="Teapot_69e13b6c"
hide bb-- hide the teapot
)
-- If the PArray object does not exist in the scene...
if (a == undefined) then
(
-- Create and setup a PArray
a = PArray()
a.name ="PArray_36ce15a4"
a.speed = 0
a.emitter = b
ba.particleType = 2
a.viewtype = 2
hide a
)
-- If the Mesher object does not exist in the scene...
if (mshr == undefined) then (
-- Create a Mesher Compound Object
-- The Mesher gets mesh data out of the PArray
mshr = mesher()
mshr.name ="Mesher_23951616"
mshr.pick = a-- Assign the Parray to the Mesher
select mshr
modPanel.addModToSelection (Edit_Mesh ()) ui:on
clearSelection()
hide mshr
)
-- If the total Emesh object does not exist in the scene...
if(totalMesh == undefined)then(
-- Create a new editable meshes with unique name
totalMesh = editable_mesh()
totalMesh.name ="EMesh_5990501d"
hide totalMesh
)
-- If the fragments Emesh object does not exist in the scene...
if(fragmentMesh == undefined)then(
-- to create editable meshes our of Mesher
fragmentMesh = editable_mesh()
fragmentMesh.name ="EMesh_1589735c"
hide fragmentMesh
)
)
)
--The Proceed handler contains the particle creating script
--The parameter pCont passed to the handler
--contains the Particle Container the script is applied to:
on Proceed pCont do(
-- Get the time range
t1 = pCont.getTimeStart() as float
t2 = pCont.getTimeEnd() as float
-- Only if the current time is at moment 0...
if((t1 <= 0) and (t2 >= 0))then(
-- Initialize a counter
i = 0
-- If there are still no particles in the system
if(pCont.NumParticles() <= 0)then
(
print("should be making fragments")
-- You can modify the fragmentation parameters here:
a.Fragment_Thickness = 1
a.fragmentmethod = 1
a.fragChunkMinimum = 202
-- Get the complete mesh from the mesher
totalMesh.mesh = mshr.mesh
-- Create a bitarray with all faces set
print("assigning particles")
-- Repeat while there are still faces in the mesh
while totalMesh.numfaces != 0 do
(
-- Get the mesh element the first face belongs to
el = meshop.getelementsusingface totalMesh #{1}
-- Detach the faces of the element
tMesh = meshop.detachFaces totalMesh el delete:true asMesh:true
-- Set the mesh of the fragment Emesh to the element
fragmentMesh.mesh = tMesh
-- Update the fragment Emesh
update fragmentMesh
-- Get the center of the fragment mesh
meshCenter = fragmentMesh.center
-- The original particle position is the center of the fragment
particlePos = fragmentMesh.center
-- Adjust vertex location to center around the chunk pivot
for j in 1 to fragmentMesh.verts.count do
(
curVert = getVert fragmentMesh.mesh j
curVert = curVert - meshCenter
setVert fragmentMesh.mesh j curVert
)
-- Move the pivot of the fragment to the original center
-- of the fragment
fragmentMesh.pivot = meshCenter
-- Give birth to a new particle
pCont.AddParticle()
-- Increase the counter
i += 1
-- Set the current particle index to the counter
pCont.particleIndex = i
-- Set particle time and age to 0 (newborn particle!)
pCont.particleTime = 0
pCont.particleAge = 0
-- Set the particle’s position to the original fragment position
pCont.particlePosition = particlePos
-- Reset the speed to 0
pCont.particleSpeed = [0,0,0]
-- Set the shape of the particle to the mesh of the fragment
pCont.particleShape = fragmentMesh.mesh
)
print("assigned particles "+ (pCont.NumParticles() as string))
)
)
)
--The Release handler is used to do cleanup work.
--Not used in this case.
on Release pCont do
(
)
|