![]() |
Организация системы частиц
Доброго времени суток, друзья! уделите, пожалуйста, немного своего драгоценного времени :)
Помогите пожалуйста правильно организовать вышеупомянутую. я уже как-то писал такое, но использовал в качестве частиц отдельные спрайты... понимаю, что это изврат. читал где-то, что намного быстрее - использовать вместо отдельных 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 треугольника
|
Ответ: Организация системы частиц
Не помню тонкостей именно б3д, в общем случае алгоритм такой:
Здесь же пожно сделать маленький хак - не удалять вертексы, а помечать их как удалённые, полностью скрывать, а когда потребуется - призывать в другом месте. Способы скрывания - от альфы вершин до переноса координат вершин в далекие края. Другой возможный хак - отложенное удаление. Делаем как в верхнем случае скрытие вершин, и раз в X тактов помеченные на удаление (желательно в том такте, где нет большой нагрузки, допустим, делать это всё после основной игровой логики и предварительно замеряв время выполнения этой логики. Потом замерянное время выполнения сравниваем со среднестатистическим значением за последние 1000 кадров (навскидку), и если условия благоприятные (малое время выполнеия логики) - модифицируем сурфейс системы частиц) собственно удаляем. P.S. Пора мне завязывать со вложенными мыслями... Жалко нельзя в формате MindMap ответы писать)) |
Ответ: Организация системы частиц
Цитата:
сделай свой эмиттер из своей медии |
Ответ: Организация системы частиц
память линейно заполненна данными
видеокарта ее рисует надо смещать |
Ответ: Организация системы частиц
Спасибо большое всем за содействие. Ваша помощь дала мне хорошего пинка в работе :)
|
Ответ: Организация системы частиц
Вложений: 1
Привет всем!
Есть вопрос о количестве загружаемых частиц... У меня на компе получилось создать максимум = 13824 Вложение 13869 Вот код: Код:
Graphics3D 640,480,32,2 Возможно ли вопше создать больше, а если да то как? |
Ответ: Организация системы частиц
Примерно как-то так:
http://www.forum.boolean.name/showpo...9&postcount=52 Спрайты самые лаговые. Лучше использовать Квады и AddVertex / AddTriangle / AddMesh Уважаемый ABTOMAT это делал в world.bb, Function buildSide( |
Ответ: Организация системы частиц
Да спасибо... Я понял что ето возможно...
Если я создаю массив частиц хотя бы (25х24х24) - вилетает Memory access violation ... Попробую тогда квадами... |
Ответ: Организация системы частиц
Цитата:
|
Ответ: Организация системы частиц
Цитата:
|
Ответ: Организация системы частиц
Цитата:
|
Ответ: Организация системы частиц
Цитата:
Переставил "-" у "Un_ssp\Scale#" и с первым вертексом что то не то, но остальные нормально на камеру разворачиваются. :( |
Ответ: Организация системы частиц
Как вращать вертексы квада? С Sin и Cos получается совсем не то. :(
|
Ответ: Организация системы частиц
Вложений: 5
Попробовал сделать огонь в Particle AMT :) Вроде не плохо получается... :)
|
Ответ: Организация системы частиц
Цитата:
Пробывал играться с синусами и косинусами и скейлом в итоге ротацию настроил, но стоит только привязать квад ТФормВектор к камере так квад начинает беспорядочно крутиться в разные стороны... в общем не получается.:( Сделал ротацию текстуры, но это не выход, т.к. текстура вертится на всех квадах одинакого, а это совсем не гуд :( В системе частиц которую выложил Tormoz не пашет редактор под windows 7, хоть и можно конечно переписать функцию LoadEmitter в CreateEmitter :) , но если честно то хочется свою систему частиц в которой я как рыба в воде, но вот беда ротацию никак не настрою с ориентацией квада на камеру! |
Ответ: Организация системы частиц
Вообще у тебя есть вектор соединяющий камеру и точку квада. Значит есть плоскость перпендикулярная камере, в которой должен лежать твой квад. Находишь два единичных перпендикулярных вектора.
Условие перпендикулярности векторов (x1*x2+y1*y2+z1*z2)=0 Третий вектор перпендикулярный двум данным получается векторным умножением. И вот у тебя есть точка и два вектора. Позиции четырех вершин. 0 - у меня это была опорная точка, через которую проводились все манипуляции с квадом, как его перемещение, масштабирование и вращение. 1 - 0+первый вектор, 2-0+второй вектор, 3-0 плюс вектор1+вектор 2. Профит. Поворот тоже несложен. Если мыслить правильно и векторами, а не тригонометрией :) Потому как расчитать длину второго катета, шоб гипотенуза повернулась на угол от первого катета несложно, а направляющие векторы катетов у тебя есть :) Результат моих попыток квадов, вроде даже работает почти :) Тут я правда синусами делал :) Этот прием называется поворот осей координат. Код:
Graphics3D 640,480,0,2 |
Ответ: Организация системы частиц
спасибо! твой код очень помог:) Я конечно очень плохо разбираюсь в математике в отличии от тебя, по этому твои выражения немного подпалили мой мозг:-D
А вообще ориентация на нулевой вертекс мне немного не подходит, щас буду пробывать ориентировать на центр квада. |
Ответ: Организация системы частиц
Тогда минусуй половинки векторов, 0 точка дальше также.
Векторы это проще тригонометрии. Я вообще имею желание линчевать того кто придумал преподавать в школе тригонометрию и бэсик. Исчо математики :) По теоремме толи пифагора толи архимеда, длина вектора: d=sqr(x1^2+y1^2+z1^2), единичный вектор (x1/d,y1/d,z1/d) это вектор чья длина равняется единице, этот вектор есть (косинус(угол вектора к оси икс),косинус(к игрек), косинус(к зед)) векторное произведение. Function Cross(x1#,y1#,z1#,x2#,y2#,z2#) vecar(0,0)=y1*z2-y2*z1 ; икс vecar(1,0)=z1*x2-z2*x1; игрек vecar(2,0)=x1*y2-x2*y1;зед End Function А это скалярное косинус( угол между векторами)=(x1*x2+y1*y2+z1*z2)/(l1*l2) Уравнение плоскости в пространстве: ax+by+cz+d=0 вектор(a,b,c) перпендикулярен к этой плоскости, це нормаль. d смещение от оси координат. |
Ответ: Организация системы частиц
Код:
;MsgDebug(str()) |
Ответ: Организация системы частиц
на 4.51 не компилит - ругается на разнообразные ашипки. пытался разгрести, но чем дальше в лес, тем толще партизаны...
|
Ответ: Организация системы частиц
А переписать пошагово не вариант?
|
Часовой пояс GMT +4, время: 13:23. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot