Показать сообщение отдельно
Старый 11.05.2011, 10:00   #4
EvilChaotic
Мастер
 
Аватар для EvilChaotic
 
Регистрация: 05.04.2008
Сообщений: 910
Написано 530 полезных сообщений
(для 3,006 пользователей)
Ответ: Организация системы частиц

Сообщение от 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 любое значение.

Дз будет привести это в божеский вид и сделать функции управления. Делал код почти в форуме так что не тестил.
__________________

EvilChaotic About
(Offline)
 
Ответить с цитированием
Эти 8 пользователя(ей) сказали Спасибо EvilChaotic за это полезное сообщение:
Артем Валерьевич (11.05.2011), Colossus (13.05.2011), LLI.T.A.L.K.E.R. (11.05.2011), mr.DIMAS (12.05.2011), Nex (01.06.2011), Randomize (12.05.2011), St_AnGer (11.05.2011), Vadimich (11.05.2011)