説明:
Parray パーティクル システムを使用する Metaball スクリプトの例を示します。
用途:
Script_Operator オペレータで使用する必要があります。
効果:
Proceed ハンドラで、各パーティクルに頂点を 1 つ持つ新しいメッシュ オブジェクトが 1 つ作成されます。続いて PArray パーティクル システムが作成され、これにより、提供されたメッシュのすべての頂点からメタボール メッシュが 1 つ生成されます。さらに、Mesher 複合オブジェクトにより、生成されたメタボールのスナップショットが作成されます。これが最初のパーティクルの形状を決定します。
例:
--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.usePosition = true pCont.useTime = true pCont.useSpeed = true pCont.useShape = true ) --The Init handler is called on initialization. --It is not used in this case. on Init pCont do ( ) on Proceed pCont do ( --Get the start and end times t1 = pCont.getTimeStart() as float t2 = pCont.getTimeEnd() as float --As long as there are particles if (pCont.NumParticles() > 0) then ( --Disable screen redraws to keep speed up with redraw off ( -- create an empty mesh nMesh = editable_mesh() -- Set the number of vertices and faces to the -- number of particles. nMesh.numVerts = pCont.NumParticles() nMesh.numFaces = pCont.NumParticles() --We will make a single vertex for each particle for i in 1 to pCont.NumParticles() do ( -- Time for the particle to travel at this integration step timeStep = t2 - (pCont.getParticleTime(i) as float) -- Speed is added to foresee the particle position at the end -- of the integration step nMesh.verts[i] = pCont.getParticlePosition(i) + timeStep * pCont.getParticleSpeed(i) -- The face references the same vertex 3 times! nMesh.faces[i] = [i,i,i] ) -- create PArray with particles on vertices of the mesh a = PArray() a.speed = 0 a.formation = 2-- at all vertices a.quantityMethod = 1--use Total a.Total_Number = 1--just initializing a.viewPercent = 100 a.Emitter_Start = 0f a.Emitter_Stop = 0f a.subsampleCreationTime =off a.Display_Until = 2000f a.life = 2000f a.Growth_Time = 0f a.Fade_Time = 0f a.particleType = 1--metaballs a.metaballAutoCoarsness =off a.metaballRenderCoarsness = 0.9 a.metaballViewCoarsness = 0.9 a.Metaparticle_Tension = 1.0 a.size = 5 a.Total_Number = pCont.NumParticles()--use particles count a.emitter = nMesh -- acquire the metaball mesh from the PArray mshr = mesher() --create a Mesher Compound object mshr.pick = a --get the PArray metaballMesh = snapshot mshr --make a snapshot of the Mesher delete a --delete the PArray delete #(mshr, nMesh) --delete the Mesher and our mesh -- speed is added to foresee the particle position at the end -- of the integration step timeStep = t2 - (pCont.getParticleTime(1) as float) spaceOffset = pCont.getParticlePosition(1) + timeStep * pCont.getParticleSpeed(1) -- adjust vertex location to center around the first particle for i in 1 to metaballMesh.verts.count do ( move metaballMesh.verts[i] (-spaceOffset) ) --Create an empty mesh to assign to all particles emptyMesh = editable_mesh() --Assign the empty mesh to all particles. --This makes them invisible pCont.setShapeForAllParticles(emptyMesh.mesh) --First particle carries all the mesh data pCont.setParticleShape 1 metaballMesh.mesh --Delete the empty mesh and the snapshot delete #(emptyMesh, metaballMesh) ) ) ) --The Release handler is used to do cleanup work. --Not used in this case. on Release pCont do ( )