Render.ru

Как сделать что бы частицы после генерирования, следовали за объектом. MAX 2008

Enterprise-J

Пользователь сайта
Рейтинг
2
#1
Здравствуйте, есть сцена, в которой взрывается косм. корабль, после определённого кол-ва времени часть корабли отрывается и отлетает, продолжая взрываться. Все взрывы сделаны PArray-ем, взрывов много. Тут возникает косяк - после взрыва партиклы остаются на месте и проходят сквозь корабль. Пробовал и через PF сделать(что для меня плохо, т.к. все PArray уже настроены, только этот косяк надо побороть), так же неполучилось. Как сделать что бы после генерирования партиклы поддерживали направление, скорость, т.е. были "привязаны" к эмиттеру? Прикладываю сцену, из-за обилия моделей, она большая, поудалял всё кроме виновника - части корабля(отлетает после 550 кадра) и взрывов. Сцена.
 

Banzay

Знаток
Рейтинг
35
#2
В PF для этого есть галка Inherit Emitter Movement в операторе Position Object.
В PArray остаётся только уменьшать скорость частиц и время жизни.
 

Enterprise-J

Пользователь сайта
Рейтинг
2
#3
Потестировал - партиклы с и без этой галки остаются на месте, при том что эмиттер движется.. Чтож, видимо придётся таки футажи использовать в постобработке, на 4 форумах никто ничего дельного не подсказал...
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#4
Не удивительно у тебя частицы тормозятся DragBinding, в этом случае нужно делать локальное поле что будет тащить за кораблем.
Либо настраивать без DragBinding, и включить у PArray в свитке Object Motion Inheritance:
Influence = 100
Multipler = 1
 

Enterprise-J

Пользователь сайта
Рейтинг
2
#5
Идея с полем вроде понятна, а как её в максе осуществить, каким дефлектором? Без драг работает, но взрыв без драга - ..деньги на ветер...
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#6
Хм да со стандартными частицами можно только ветер присобачить чтоб сдувал. С помощью скрипта и такой-то матери.
По этому лучше делай с помощью PF. Оператро Lock/Bond - может констрейнить к объектам.
Получится чтото вроде этого графа:
 

Вложения

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#7
C Lock/Bond - тоже может быть проблема если частицы еще анимируются и нет возможности переключить на новый эвент,

Тогда просто создаётся такой скритп оператор:
Да не забудь в тексте имя объекта за которым будут таскаться частицы.

Код:
on ChannelsUsed pCont do
(
	 pCont.usePosition = true
)

on Init pCont do 
( 
)

on Proceed pCont do 
(

	obj = $Sphere114    -- Set Object !

	at time (currenttime - 1) p1 = obj.pos
	at time currenttime p2 = obj.pos
	v =  p2 - p1

	count = pCont.NumParticles()

	for i in 1 to count do
	(
		pCont.particleIndex = i
		pCont.particlePosition += v
	)


)

on Release pCont do 
( 
)
 

Enterprise-J

Пользователь сайта
Рейтинг
2
#8
Savin Denis, КАК ЖЕ ВЫ МЕНЯ ВЫРУЧИЛИ!!! РАБОТАЕЕЕТ!!! Большое человеческое вам спасибо!!
Хм, правда в 2008 максе такого оператора в пф как Lock\Bond я не нашёл, но скрипт работает. Этот оператор в 2009 версии появился?
 

Enterprise-J

Пользователь сайта
Рейтинг
2
#10
Даа, по судя по количеству новых операторов, довольно мощная штука. Спасибо ещё раз!
 

Enterprise-J

Пользователь сайта
Рейтинг
2
#11
Тестировал, тестировал скрипт - у пф странное поведение, сначало видно что все партиклы летят прямо за сферой 114 как надо, но стоит выключить и включить скрипт оператор, как партиклы оказываются рядом со сферой(вкл\выкл по прошествии например 100 кадров)..метаморфозы прямо..
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#12
При on/off для корректного результата, потребуется пересчет всей сиквенции, чего по видимому не происходит. Возможно если поиграться с ChannelsUsed можно будет объяснить PF чтоб, пресчитывал,
но будут тормоза. Что так пересчитывать что так.

Кстати так и не понял что должен обозначать этот застывший эффект ?!
 

Enterprise-J

Пользователь сайта
Рейтинг
2
#13
Застывшый эффект, всмысле эти системы частиц(в т.ч. пф)? Это взрывы, к ним применён в Environment, Afterburn-плагин. Ещё тестировал - при рендеринге частицы так же располагаются не надо сферой а около неё, т.е. частицы улетают куда то в сторону а не летят за сферой, может скрипт неточно работает? Простите что подвергаю сомнению вашу работу, понимаю, что это всё непросто, програмировать, но проблема есть и я уже хотел было вообще отказаться от взрывов на движущейся части корабля, как тут появился шанс на решение проблемы. Кстати, пробовал Lock\Bond, он тоже странно работает, если просто включать выключать к примеру оператор Display, то каждый раз он будет ставить частицы в новых местах, иногда даже совсем не там где нужно.
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#14
Сделай тестовую сцене гляну, только запиши туда одну эту систему все лишнее прибей и в PF графе тоже. В сторону могут улетать опять же если не последовательно проигрываеш.
Lock\Bond, скорее всего не убрал где нибудь вариационные параметры. Нужно переключить все частицы за один кадр на эвент с Lock\Bond, делается по абсолютному времени.
К этому моменту все частицы должны уже быть за остановлены.

PS
То что взрыв понятно, не понятно за чем его тащить за кораблем ?
По всем законам отлетевшие частицы не как не связанны с породившим объектом. а чтоб притягивать своей массой скорости слишком большие.
Да и драг это эмуляция сопротивления в атмосфере, в космосе ничего не будет препятствовать им лететь с начальной скоростью.
 

Enterprise-J

Пользователь сайта
Рейтинг
2
#15
Сделал сцену - там в пф два эвента, со скриптом и с лок\бондом, частицы вроде останавливаются, но половина остаётся на месте, половина за шаром тащиться. Если со скриптом проигрывать последовательно, то частицы появляются в виде точки около шара(сконцентрированы в одной точке что ли). Да, ни под какие законы взрыв не попадает, но это связано с возможностями афтербурна - я пробовал делать удефлектор, чтоб частицы просто огибали корабль, но тогда получалось, что взрыв как вода растекается по поверхности, а сквозь корабль проходить - это ещё хуже. Драг использую тоже отчасти по причине афтербурна - если не останавливать частицы, то это будет совсем не как в "звёздных воинах" и тому подобных, а так же компа просто не хватит на постоянно увеличивающийся афтербурн эффект+это будет уже на взрыв мало похоже. Сцена.
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#16
Там есть одна хитрость script нужно ставить выше оператора Position чтоб небыло конфликта.
Написал новый скрипт, старый не обновлялся во время рендера.
Новый с подержкой Subframe Sampling:
Код:
on ChannelsUsed pCont do 
( 
pCont.useTime = true
pCont.usePosition = true 
) 

on Init pCont do 
( 
) 

on Proceed pCont do 
( 

global PFTmpTime01  -- Set unique Name.

obj = $Sphere01 -- Set Object ! 

count = pCont.NumParticles() 

t = currenttime
if count > 0 do t = pCont.getParticleTime 1

if PFTmpTime01 == undefined do PFTmpTime01 = t      -- Set unique Name.

t1 = PFTmpTime
t2 = t

at time t1 p1 = obj.pos 
at time t2 p2 = obj.pos 
v = p2 - p1 

PFTmpTime01 = t2     -- Set unique Name.

for i in 1 to count do 
( 
pCont.particleIndex = i 
pCont.particlePosition  += v 
) 
) 

on Release pCont do 
( 
)
В коде, для каждого нового эммитера нужно будет найти изаменить в тексте все включения имени PFTmpTime01 на уникальное.
 

Enterprise-J

Пользователь сайта
Рейтинг
2
#17
Странно, вставляю скрипт в скриптоператор, проверяю - имя сферы совпадает, ставлю над position, так как эмиттер один, то PFTmpTime01 изменять не надо, смотрю - и ничего не происходит, как будто там нет скрипта! Сцена на всякий случай У вас он работает? Может с максом что, хотя врядли, предыдущий скрипт ведь работает..
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#18
Да опечатка, лови

Код:
on ChannelsUsed pCont do 
( 
pCont.useTime = true 
pCont.usePosition = true 
) 

on Init pCont do 
( 
) 

on Proceed pCont do 
( 

global PFTmpTime01 -- Set unique Name. 

obj = $Sphere01 -- Set Object ! 

count = pCont.NumParticles() 

t = currenttime 
if count > 0 do t = pCont.getParticleTime 1 

if PFTmpTime01 == undefined do PFTmpTime01 = t -- Set unique Name. 

t1 = PFTmpTime01 -- Set unique Name. 
t2 = t 

at time t1 p1 = obj.pos 
at time t2 p2 = obj.pos 
v = p2 - p1 

PFTmpTime01 = t2 -- Set unique Name. 

for i in 1 to count do 
( 
pCont.particleIndex = i 
pCont.particlePosition += v 
) 
) 

on Release pCont do 
( 
)
 
Сверху