Как перемещать эмитттер у которого анимирована позиция?

Обсуждение специальной версии Magic Particles (Dev), предназначенной для разработчиков игр.

Как перемещать эмитттер у которого анимирована позиция?

Сообщение Anton Petrov » Пн дек 04, 2017 12:33 am

Я видел на форуме похожий вопрос, но в нем предлагалось частное решение для эмиттера который ездит по кругу, а мне нужно общее.

1. Я хочу прицепить эффект к подвижному объекту в 3D сцене (объект может двигаться, поворачиваться и т.д.). В общем случае я не знаю какой эффект сделает художник, он возможно применит анимацию эмиттера и будет его двигать или вращать.
Я не могу использовать model-view матрицу от 3D объекта при отрисовке эффекта, потому что это сломает ориентацию частиц на камеру. Вызвать Magic_SetEmitterPosition() и Magic_SetEmitterDirection() я не могу потому что это сломает анимацию движения эмиттера из редактора, которую задавал художник. Что делать?

2. Я думал что могу поместить эффект в анимированную папку, она как бы создаст новую неанимированную систему координат и я смогу двигать/вращать/скейлить эту папку не ломая анимацию вложенного в неё эмиттера. Но при попытке сделать Magic_SetScale() для анимированной папки эффект вообще визуально сломался. Мне показалось (могу ошибаться) что scale применился к размеру частиц вложенного в папку эмиттера, но не применился к их координатам. Как правильно двигать, масштабировать анимированные папки?

3. Как действуют вызовы API применяемые к анимированным папкам на вложенные эффекты? То есть в каких случаях вообще нужен вызов Magic_GetEmitter()? В доках написано что это нужно для визуализации эмиттеров из папки, но как я понял они все таки визуализируются "сами" когда делаешь Magic_PrepareRenderArrays() для анимированной папки.
Anton Petrov
 
Сообщения: 12
Зарегистрирован: Ср ноя 29, 2017 11:36 pm

Re: Как перемещать эмитттер у которого анимирована позиция?

Сообщение Odin_KG » Пн дек 04, 2017 2:12 am

Вообще координаты эмиттера устанавливаются через Magic_SetEmitterPosition(). Эта функция должна не просто ставить эмиттер в определенную точку, а выполнять пересчет всех координат анимации таймлайна, т.е. эффект должен встать по указанным координатам и при этом он должен продолжать двигаться по своей траектории, если она задана в редакторе.

Но при попытке сделать Magic_SetScale() для анимированной папки эффект вообще визуально сломался.

Я могу допустить, что в последней официальной версии 3.45 есть глюки. У меня есть новая версия, в которой я очень много чего поправил по мелочи. Вот новые версии для Win/Mac: http://astralax.ru/temp/magic_win_mac.zip
Обратите внимание, что враппер тоже немного поменялся, т.е. старый враппер не будет работать с новым API. Но изменения, на мой взгляд, незначительные. Кроме того, новая версия поддерживает многопоточность - можно выполнять Magic_Update() для разных эмиттеров в разных потоках. Также это касается всего процесса рендера, начиная от Magic_PrepareRenderArrays() - можно разные эмиттеры визуализировать разными потоками.

То есть в каких случаях вообще нужен вызов Magic_GetEmitter()?

В основном для прямого обращения к типам частиц через Magic_LockParticlesType, т.е. к внутренностям. А так... Magic_PrepareRenderArrays() нужно вызывать только для анимированной папки.
Аватара пользователя
Odin_KG
Administrator
Administrator
 
Сообщения: 841
Зарегистрирован: Чт янв 15, 2009 2:57 pm

Re: Как перемещать эмитттер у которого анимирована позиция?

Сообщение Anton Petrov » Пн дек 04, 2017 10:05 am

Odin_KG писал(а):Вообще координаты эмиттера устанавливаются через Magic_SetEmitterPosition(). Эта функция должна не просто ставить эмиттер в определенную точку, а выполнять пересчет всех координат анимации таймлайна, т.е. эффект должен встать по указанным координатам и при этом он должен продолжать двигаться по своей траектории, если она задана в редакторе.


Я проанимировал эмиттер в редакторе чтобы он двигался по квадрату. Когда я стал делать для него Magic_SetEmitterPosition(), то эта команда переопределила анимацию координат и эмиттер "прилип" к точке которую я передаю в Magic_SetEmitterPosition().
Anton Petrov
 
Сообщения: 12
Зарегистрирован: Ср ноя 29, 2017 11:36 pm

Re: Как перемещать эмитттер у которого анимирована позиция?

Сообщение Odin_KG » Пн дек 04, 2017 10:40 am

Я проанимировал эмиттер в редакторе чтобы он двигался по квадрату. Когда я стал делать для него Magic_SetEmitterPosition(), то эта команда переопределила анимацию координат и эмиттер "прилип" к точке которую я передаю в Magic_SetEmitterPosition().

Если так, то это ошибка в API. Дайте мне ваш ptc-файл и код, которым вы перемещали эффект.
Аватара пользователя
Odin_KG
Administrator
Administrator
 
Сообщения: 841
Зарегистрирован: Чт янв 15, 2009 2:57 pm

Re: Как перемещать эмитттер у которого анимирована позиция?

Сообщение Anton Petrov » Вт дек 05, 2017 9:44 am

Я не понимал что Magic_SetScale() не влияет на координаты эмиттера и частиц, поэтому у меня возникали странные глюки с позиционированием.
После аккуратной реализации перехода от 3D-координат Magic Particles к игровым координатам всё заработало. Не стоило для этого использовать Magic_SetScale().
Anton Petrov
 
Сообщения: 12
Зарегистрирован: Ср ноя 29, 2017 11:36 pm

Re: Как перемещать эмитттер у которого анимирована позиция?

Сообщение Odin_KG » Вт дек 05, 2017 10:29 am

Действительно, Magic_SetScale() не меняется координаты эмиттера.
Аватара пользователя
Odin_KG
Administrator
Administrator
 
Сообщения: 841
Зарегистрирован: Чт янв 15, 2009 2:57 pm


Вернуться в Magic API

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron