Организация системы частиц
Доброго времени суток, друзья! уделите, пожалуйста, немного своего драгоценного времени :)
Помогите пожалуйста правильно организовать вышеупомянутую. я уже как-то писал такое, но использовал в качестве частиц отдельные спрайты... понимаю, что это изврат. читал где-то, что намного быстрее - использовать вместо отдельных Entity квады, объедененные в один Mesh, но как это сделать ума не приложу :( т.е. вроде создавать сёрфейсы у меня получается, но в каком массиве хранить идентификаторы каждого квада и их индивидуальные параметры, правильно трансформировать. вот набросал небольшой примерчик (ниже). Не могли бы вы сделать его аналог с использованием объедененных квадов. Буду очень признателен за помощь -----------------------Example: Graphics3D 800,600,32,2 SetBuffer BackBuffer() cam = CreateCamera(): PositionEntity cam,0,0,-15 t = CreateTimer(60) EmitterCreate (0,0,20) ; создание Эмиттера Repeat WaitTimer(t) EmitterUpdate(); Обновление Эмиттера UpdateWorld RenderWorld Flip(0) Until KeyHit(1) End ;================================================= ===================Functions Type Emitter Field interval, timer Field x#, y# Field entity End Type Type particle Field entity Field speed# Field turn# Field alpha# End Type Function EmitterCreate (x,y, interval) e.Emitter = New Emitter e\interval = interval e\timer = e\interval e\x = x e\y = y e\entity = CreateSprite(): SpriteViewMode e\entity,2: EntityAlpha e\entity,.5 ; создаем простенький эмиттер End Function Function EmitterUpdate () For e.Emitter = Each Emitter ; запуск частиц e\timer = e\timer+1 If e\timer>e\interval ;================================================= =================== p.particle = New particle p\speed# = .1 p\turn = 1 p\alpha = .5 p\entity = CreateSprite(): SpriteViewMode p\entity,2 PositionEntity p\entity,e\x, e\y,0: RotateEntity p\entity, 0,0,EntityRoll (e\entity) EntityAlpha p\entity,p\alpha e\timer = 0 ;================================================= =================== EndIf ;обновление частиц ;================================================= =================== For p.particle = Each particle p\turn = p\turn+2 MoveEntity p\entity,0,p\speed,0 RotateSprite p\entity,p\turn Next Next End Function |
Ответ: Организация системы частиц
Не рекомендуется иметь в цикле:
Цитата:
А не легче изучить готовые партикл системы? (передумал написать "а не легче использовать...") |
Ответ: Организация системы частиц
Спасибо. это был маленький примерчик. в уже готовой есть функция копирования ентити (SetReference (Entity) )
просто я хочу серьезно расширить функционал уже существующей.. но если уж переписывать столько кода, то уж сразу делать это правильно... CopyEntity ведь наверное тоже не экономичнее созданного полика и добавленного к одной сетке? а чем быстрее она будет работать, тем больше частиц можно будет генерить. |
Ответ: Организация системы частиц
Цитата:
Для работы с сингсюрфейсными партиклами(управление квадами) нам нужно хранить его индексы вершин в системе. Отсюда мы можем вручную написать функции скейла, ротации и перемещения для квада. Камерра Global Un_SinglesurfaceParticleSys_Camera Максимум партиклов в системе Const Un_SinglesurfaceParticleSys_MaxParticle = 100 Тип системы Код:
Type Un_SinglesurfaceParticleSys_Emitter Код:
Un_SinglesurfaceParticleSys_Camera = твоя камера Перемещения можно сделать, прибавив вектор x = x + x1 y = y + y1 z = z + z1 Ротация Это sin/cos со scale и углом. Скейл Это просто установить к переменной в типе Scale любое значение. Дз будет привести это в божеский вид и сделать функции управления. Делал код почти в форуме так что не тестил. |
Ответ: Организация системы частиц
не понял как вращать всётаки, а вернее что вращать?
|
Ответ: Организация системы частиц
EvilChaotic Спасибо огромное за то что уделил столько времени! сейчас работу разгребу и буду разбираться с этим всем :) Я тоже считаю, что подобный опыт просто необходим
|
Ответ: Организация системы частиц
а есть ли возможность создавать эмиттеры с индивидуальным максимальным количеством частиц.. скажем, один эмиттер испускает дым, другой искры а третий - выбрасывает гильзы или делает всплески.. для них для всех требуются разные значения.. если для брызг может доходить до десятков, то для гильз достаточно и нескольких штук. Стоит ли задумываться о экономии размеров массивов, если одновременно на экране будет десяток эмиттеров или это экономия на спичках?
|
Ответ: Организация системы частиц
|
Ответ: Организация системы частиц
таки подключил амт частицы, но на фоне такой графики они смотрятся как-то убого... попробую подставить сюда еще и аним-спрайты с настоящим огнем.
http://myblitz3d.nextmail.ru/temp/fire.jpg |
Ответ: Организация системы частиц
Спасибо!
протестил квады по сравнению с entity - прирост производительности экстримальный! извините, если вопрос совсем уж невежественный, но как квадам, относящимся к одному surface одного mesh'a сделать разную прозрачность? |
Ответ: Организация системы частиц
задавать альфу вершинам
использовать EntityFX, 32 кажется |
Ответ: Организация системы частиц
А несколько сотен (или тысяч) пустых ячеек(не занятых частицами) в массиве[ ] погоды не делают? Просто мне однажды кто-то посоветовал использовать как можно меньше массивов.. вот и парюсь теперь :(
|
Ответ: Организация системы частиц
Ну смотри, грубо говоря частица, на самом деле хранимая в том массиве - это не частица, а ссылка на неё (соответсвенно, Null если ссылки нет). Я могу конечно сильно ошибаться, но думаю, это так. Далее, ссылка - это 32 бита информации. Представим, что у тебя в стандартном таком массиве 1000 частиц (не зависимо от того, сколько их на самом деле). Тогда это 4кБ инфы. А теперь подумай, насколько много у тебя должно быть систем частиц единовременно, на какую оперативную память ты рассчитываешь и стоит ли париться.
Если я не прав на счёт ссылок, и в массиве действительно хранится элемент типа частицы, то навскидку кол-во инфы в таком типе: x,y,z + то же самое для углов и масштабов = 9 float (а флоаты в б3д = 32 бита) ещё 4 флоата - для цвета в формате RGBA (если по-хорошему (нужна избыточная инфа для HDR, но я не могу себе представить такую необходимость в б3д), по-плохому-то там и одного флоата достаточно :-D) Ещё флоат - время жизни частицы Ещё 3 флоата - направление перемещения от предыдущего шага (зная его, удобнее делать всякие спиральные траектории для, допустим, искр от костра) - ну это уже опция. Итого в средне-гнущихся партиклах мы получаем... 14 флоат-переменных, что равно 14*4 = 56 байт на партикл. Опять же, 1000 партиклов ~ 56 кБ инфы в памяти. Если у тебя конечно по 10000 партиклов в системе, да ещё самих систем частиц "хорошо за 100" - то это уже серьёзно, 56 МБ памяти на частицы. Но если это не так - я бы не заморачивался. |
Ответ: Организация системы частиц
я думаю, Ты прав.. первый случай вернее.. ведь если ячейка не занята, то в ней нет не ссылки на экземпляр типа, ни других параметров вроде времени жизни, размера, скорости.. т.к. они должны храниться в самом экземпляре. Спасибо :)
|
Ответ: Организация системы частиц
хм.. а как удалить квад? не думал, что с этим будут проблемы, но команды я такой ещё не нашел.. clearSurface удаляет всё, а нужно снести только 2 треугольника
|
Часовой пояс GMT +4, время: 08:31. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot