Конверсия Instancer’а в геометрию
Type: Python Script (py) Name: sag_instancerToGeometry Version: 1.4 Released: 2012.05.05 Download
v1.4 - corrected GUI for older maya versions v1.3: - doesn't set visibility to off prior to the starting frame of conversion - doesn't pay attention to 'start from current frame' if custom range is defined v1.2: - reworked GUI - uses long names correctly (no problems with objects of the same name anymore) - doesn't freeze source objects' rotations or error if channels have keyframes - keeps input connections for instances also - works with different rotation orders of source objects and instancer itself - each baked object is inside it's own group which actually gets all keyframes - works with any linear units of the scene (switches to cm and back, actually) v1.1: - duplicates now maintain original input connections - only translate, rotate, scale and visibility are keyframed now
Практически каждый раз когда использую instancer для размножения геометрии по частицам, в итоге неминуемо хочется перевести полученный результат в обычные объекты с ключевой анимацией, дабы подправить отдельные из них или удалить вовсе.
Вот наконец-то собрался и написал утилиту для решения этой задачи.

Использование:
- файл sag_instancerToGeometry.py надо положить в любую папку, откуда Maya читает скрипты;
- запустить python-скрипт:
from sag_instancerToGeometry import *
sag_instancerToGeometry()
- выделить instancer‘ы, которые нужно сконвертировать и нажать Convert в окне утилиты. Будет произведена конвертация, удаление static channels и применен euler filter.
Опции:
Make Duplicates/Instances – в первом случае созданные объекты будут независимыми дубликатами, во втором – инстансами от исходного объекта (который воткнут в instancer);
Start from Current Frame – если включено, вне зависимости от таймлайна или выставленного вручную диапазона фреймов, начнет конвертацию с текущего фрейма;
Playback/Custom Range – в первом случае диапазон фреймов будет взят из таймлайна, во втором – можно ввести значения начального и конечного фрейма;
Convert – [...описание оказалось столь длинным и замороченным, что было удалено редактором...]
Help – линк на эту страницу.
Примечания:
Разумеется, есть ряд ограничений и попросту недоработок… Из тех что могу сейчас отметить:
- вращения конвертятся только из канала Rotation instancer‘а, всякие Aim я пока не учитывал и пока даже не знаю буду ли вообще, потому как в принципе наиболее используемую ориентацию объектов по velocity можно легко написать экспрешеном в тот же Rotation, к примеру:
float $vel[] = velocity;
float $ang[] = `angleBetween -euler -v1 1 0 0 -v2 $vel[0] $vel[1] $vel[2]`;
rotPP = <<$ang[0], $ang[1], $ang[2]>>;
- если на какой-то из каналов instancer‘а назначен “необычный” атрибут, который не получится прочитать – скрипт работать не будет. На данный момент я не могу себе представить зачем кто-то будет такое делать, хотя в ходе тестов столкнулся с тем, что некто поставил на Scale атрибут Ramp Velocity и тот не читался утилитой. Вероятно могут быть проблемы с какими-то полезными атрибутами, так что тут как раз возможность для апдейтов.
- для правильной передачи вращений с учетом разных rotationOrder приходится фризить rotate каналы воткнутых в instancer объектов. Соответственно, если они проанимированы ключами или экспрешеном, или попросту залочены – скрипт завалится. Смысла крутить исходный объект вместо того чтобы крутить как полагается партикловыми экспрешенами лично я не вижу, поэтому этот нюанс тоже не решался.
В общем, пробуйте, пользуйтесь и пишите багРепорты/пожелания – я постараюсь их исправить/добавить.
In: FX · Tagged with: instancer, maya, particles, python, sag_instancerToGeometry, script, tool, utility


on 17 November 2009 at 5:44
Permalink
hello,friend,can you send python script to me
mail:yuyu8401936@hotmail.com
on 23 November 2009 at 19:33
Permalink
Отличная утилита!!!
on 11 June 2010 at 0:14
Permalink
I’m getting a “Bad Magic Number” error when trying to import.
Can you send me the script please? dans@floathybrid.com
Thanks.
on 11 June 2010 at 3:23
Permalink
I’ve put original .py instead of compiled .pyc, so there should be no issues anymore.
Положил исходный .py вместо скомпилированного .pyc, поэтому проблем больше не должно быть.
on 23 June 2010 at 17:13
Permalink
this is awesome man. thanks a lot.
on 6 August 2010 at 16:15
Permalink
Возможно вас заинтересует http://somesanctus.blogspot.com/2010/08/smartrotation.html
и вы пересмотрите свое отношение к каналам Aim и Up
это – пожелание включить их в утилитую.
on 6 August 2010 at 22:28
Permalink
Да, спасибо. Я в курсе что это нужно и важно, просто пока не успел обдумать как это все конвертить во вращения.
on 26 November 2010 at 10:49
Permalink
Whenever i try to source this script I keep getting a // Error: invalid directive // I’ve tried putting the script in every script folder there is in maya. What am i doing wrong? I use maya 2010 btw.
on 26 November 2010 at 11:03
Permalink
Have you tried the latest .py version? I heard old .pyc caused problems on different OSes, so I’ve put .py eventually.
on 26 November 2010 at 12:01
Permalink
Hey thanks for the quick reply, i figured out the problem, In the script editor i forgot to choose the Python menu before loading the script.
Now I have loaded the script with no errors, it seems to have loaded just fine, now my question is… Shouldn’t there apear a GUI box whenever i load this script? cause nothing happens.
Am i missing a step or something? Pardon my noobness, I’ve never loaded a python script before.
on 26 November 2010 at 12:06
Permalink
Oh I forgot to mention that after i loaded the script I ran the “from sag_instancerToGeometry import *
sag_instancerToGeometry()” lines, and a GUI box apears, but it only contains “Start from Current Frame” button.
We are running linux here at the company, perhaps thats the reason, rest of the GUI is missing?
on 26 November 2010 at 12:15
Permalink
well I guess you could just delete my posts, I got it to work now for some odd reason. = /
Thanks for the help btw.
on 26 November 2010 at 12:25
Permalink
This tool is really neat at creating objects that translates along with the instanced objects, my question now is… it is possible for it to simulate the rotation of each instanced object/particle as well?
on 26 November 2010 at 22:56
Permalink
Good that everything is working eventually.
Script bakes rotations, but from ‘Rotation’ channel only – no aims. There’s a mention about that in notes above. So, if you have it mapped – everything should be fine, if you use aims – you should try to convert them into rotations for baking or rotate baked objects afterward.
on 29 November 2010 at 12:45
Permalink
Alright thanks alot for the tip Sagroth, very appreciated.
on 15 December 2010 at 1:58
Permalink
Love the script. Thanks for putting it out there!
on 28 January 2011 at 21:22
Permalink
Your script works beautifully. Thank you so much for making it available. I very often have to create instances on a surface which is the goal of the particles. The instances Aim Direction is connected to Goal World Normal 0 PP so that they get oriented along the surface normal. Is there a way to transfer the instances orientation to the Rotation channel so that your script evaluates it?
Thank you!
on 28 January 2011 at 22:57
Permalink
Yeap, you just need to use your goalWorldNormal0PP instead of velocity in the angleBetween formula I wrote above. And I think goalWorldNormal0PP won’t get generated at birth, so put this script into runtime expression instead of creation.
on 31 January 2011 at 19:12
Permalink
Thanks so much Sagroth. It works great!!
on 28 February 2011 at 15:24
Permalink
Thanks a lot, It saved me quite a lot of time today
on 21 April 2011 at 9:35
Permalink
you are a great person!!!
on 29 March 2012 at 5:38
Permalink
Thanks a million!
I only needed a single frame baked, but when I checked out multi-frame baking all the frames except the final frame were keyed invisible for each instanced object.
Another anomaly:
On my first attempt, the baked instances didn’t match the Instancer. I found that one of the original meshes didn’t have it’s pivot at the origin. I moved it and centered the pivot, and then it worked.
Very grateful.
on 29 March 2012 at 16:21
Permalink
A followup on the visibility issue:
When I bake the particleInstancers, a visibility keyframe is added to the original geometry as well as all the baked instances. I’ve checked the geometry, instancers, and particles, and none have keyframes on visibility before I run your script…
on 29 March 2012 at 18:51
Permalink
Thanks for the feedback. I’ve made a lot of improvements to the utility a long time ago already. A pack of issues were solved, maybe some of these as well. I’ve just forgotten to update it here – I’ll try to recheck the issues you’ve mentioned and make an update in a couple of days.
on 5 April 2012 at 9:58
Permalink
thank man, very good script
on 28 April 2012 at 22:25
Permalink
Hi,
I’m testing the script now on a particle instancer… It’s been running for 10+ minutes now but I don’t see anything happing.. is the viewport updated during the process?.. I have 14000 particles on here so I’m thinking it might take a while but… Could you add a progressbar to this?
Heh.. I should have tested this on a simpler Instancer
on 29 April 2012 at 10:48
Permalink
Yeah, 14k seems to be too much