Сообщение от LLI.T.A.L.K.E.R.
А не легче изучить готовые партикл системы?
|
Легче, но рано или поздно он должен знать как это работает. И только тогда он будет развиваться.
Для работы с сингсюрфейсными партиклами(управление квадами) нам нужно хранить его индексы вершин в системе. Отсюда мы можем вручную написать функции скейла, ротации и перемещения для квада.
Камерра
Global Un_SinglesurfaceParticleSys_Camera
Максимум партиклов в системе
Const Un_SinglesurfaceParticleSys_MaxParticle = 100
Тип системы

Type Un_SinglesurfaceParticleSys_Emitter
Field Mesh
Field Surface
; - Texture
Field Particles[Un_SinglesurfaceParticleSys_MaxParticle]
Field ParticleCount
End Type
Тип квада
Type Un_SinglesurfaceParticleSys_Particle
Field Surface
; Vertex Index
Field v_In[3]
; 0 - Current coords 1 - Dest Coords 2 -StandartCoords
Field x,y,z#
End Type
Создание системы
Function Un_SinglesurfaceParticleSys_CreateEmitter()
Un_sse.Un_SinglesurfaceParticleSys_Emitter = New Un_SinglesurfaceParticleSys_Emitter
Un_sse\Mesh = xCreateMesh()
Un_sse\Surface = xCreateSurface(Un_sse\Mesh)
xEntityFX Un_sse\Mesh,1+2+8
Return Handle(Un_sse)
End Function
Апдейт системы
Function Un_SinglesurfaceParticleSys_Update()
For Un_sse.Un_SinglesurfaceParticleSys_Emitter = Each Un_SinglesurfaceParticleSys_Emitter
For i = 0 To Un_sse\ParticleCount - 1
Un_SinglesurfaceParticleSys_UpdateParticle(Un_sse\Particles[i])
Next
End Function
Добавить квад в систему
Function Un_SinglesurfaceParticleSys_AddParticle(h)
Un_sse.Un_SinglesurfaceParticleSys_Emitter = Object.Un_SinglesurfaceParticleSys_Emitter(h)
For i = 0 To Un_SinglesurfaceParticleSys_MaxParticle - 1
If Un_sse\Particles[i] = 0
Un_sse\Particles[i] = Un_SinglesurfaceParticleSys_CreateParticle(Un_sse\Surface) : Exit
End If
Next
Un_sse\ParticleCount = Un_sse\ParticleCount + 1
Return Un_sse\Particles[i]
End Function
Описание создание квада
Function Un_SinglesurfaceParticleSys_CreateParticle(surface)
Un_ssp.Un_SinglesurfaceParticleSys_Particle = New Un_SinglesurfaceParticleSys_Particle
Un_ssp\Surface = surface
Un_ssp\v_In[0] = xAddVertex(Un_ssp\Surface, 0, 0, 0, 0, 1)
Un_ssp\v_In[1] = xAddVertex(Un_ssp\Surface, 0, 0, 0, 1, 1)
Un_ssp\v_In[2] = xAddVertex(Un_ssp\Surface, 0, 0, 0, 0, 0)
Un_ssp\v_In[3] = xAddVertex(Un_ssp\Surface, 0, 0, 0, 1, 0)
xAddTriangle(Un_ssp\Surface, Un_ssp\v_In[1], Un_ssp\v_In[2], Un_ssp\v_In[3])
xAddTriangle(Un_ssp\Surface, Un_ssp\v_In[2], Un_ssp\v_In[1], Un_ssp\v_In[0])
; - Set Param
Un_ssp\Scale#= 1.0
Un_ssp\x# = Rnd(-3,3) : Un_ssp\y# = Rnd(-3,3) : Un_ssp\z# = Rnd(-3,3)
Return Handle(Un_ssp)
End Function
Ну и апдейт квада, поворачиваем его на камеру.
Function Un_SinglesurfaceParticleSys_UpdateParticle(h)
Un_ssp.Un_SinglesurfaceParticleSys_Particle = Object.Un_SinglesurfaceParticleSys_Particle(h)
xTFormVector -Un_ssp\Scale#,-Un_ssp\Scale#,0,Un_SinglesurfaceParticleSys_Camera,0
xVertexCoords Un_ssp\Surface,Un_ssp\v_In[0],Un_ssp\x+xTFormedX#(),Un_ssp\y+xTFormedY#(),Un_ssp\z+xTFormedZ#()
xTFormVector Un_ssp\Scale#,-Un_ssp\Scale#,0,Un_SinglesurfaceParticleSys_Camera,0
xVertexCoords Un_ssp\Surface,Un_ssp\v_In[1],Un_ssp\x+xTFormedX#(),Un_ssp\y+xTFormedY#(),Un_ssp\z+xTFormedZ#()
xTFormVector -Un_ssp\Scale#,Un_ssp\Scale#,0,Un_SinglesurfaceParticleSys_Camera,0
xVertexCoords Un_ssp\Surface,Un_ssp\v_In[2],Un_ssp\x+xTFormedX#(),Un_ssp\y+xTFormedY#(),Un_ssp\z+xTFormedZ#()
xTFormVector Un_ssp\Scale#,Un_ssp\Scale#,0,Un_SinglesurfaceParticleSys_Camera,0
xVertexCoords Un_ssp\Surface,Un_ssp\v_In[3],Un_ssp\x+xTFormedX#(),Un_ssp\y+xTFormedY#(),Un_ssp\z+xTFormedZ#()
End Function
Un_SinglesurfaceParticleSys_Camera = твоя камера
e = Un_SinglesurfaceParticleSys_CreateEmitter()
for i = 0 to 9
p = Un_SinglesurfaceParticleSys_AddParticle(e)
next
В цикл
Un_SinglesurfaceParticleSys_Update()
Далее функции ротации и перемещения и скейла.
Перемещения можно сделать, прибавив вектор
x = x + x1
y = y + y1
z = z + z1
Ротация
Это sin/cos со scale и углом.
Скейл
Это просто установить к переменной в типе Scale любое значение.
Дз будет привести это в божеский вид и сделать функции управления. Делал код почти в форуме так что не тестил.