1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

Рендер обьектов отдельно от сцены. Проблема

Тема в разделе "MAXScript", создана пользователем Дядя Миша, 27 авг 2013.

Модераторы: Savin Denis
  1. Дядя Миша

    Дядя Миша Пользователь сайта

    С нами с:
    27.08.2012
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    4
    Здравствуйте, была необходимость ускорить процесс рендера объектов отдельно от сцены, знаний в макскрипте = 0, но удалось собрать рабочий прототип который все же при выделении нескольких объектов рендерит каждый в отдельном окне отдельно от сцены. Появилась проблема с группами, скрипт их не видит и рендерит все объекты в них отдельно, в итоге имеется куча бесполезного мусора вместо одного скажем диванчика.

    Вот собственно сам скрипт (без лишних кнопок,роллаутов, чекеров и сейвера рендера)

    Код:
    (
            local current_object = 0 
    	for i in selection do  
    		 (
    		myobj = selection as array 
    		current_object += 1 
     		if current_object > 0 do
    			(
    			$*.renderable = on 
    			$*.primaryVisibility = off 	-- visible to camera
    			myobj[current_object].renderable = on 
    			myobj[current_object].primaryVisibility = on 
    			render myobj[current_object] 
                              )   
                      )                     
    )
    
    Может кто подскажет чем эти каракули подправить чтобы оно группы как отдельный обьект воспринимало?
     
  2. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Простой пример для частного случая:
    В новой сцене создаем 2 чайника и группируем их.
    Выделяем чайники и группу. Запускаем скрипт.
    Код:
    ( 
    local current_object = 0 
    for i in selection do 
    ( 
    myobj = selection as array 
    current_object += 1 
    if current_object > 0 do 
    ( 
    $*.renderable = on 
    $*.primaryVisibility = off -- visible to camera 
    if isGroupHead  myobj[current_object]  and myobj[current_object].parent==undefined then
    (
    myobj[current_object].children.renderable = on 
    myobj[current_object].children.primaryVisibility = on 
    render ()
    )
    else if( not (isGroupHead  myobj[current_object] or  isGroupMember myobj[current_object]) )then
    (
    myobj[current_object].renderable = on 
    myobj[current_object].primaryVisibility = on 
    render ()
    )
    ) 
    ) 
    )
     
    nat79 нравится это.
  3. Дядя Миша

    Дядя Миша Пользователь сайта

    С нами с:
    27.08.2012
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    4
    Спасибо за помощь, на этом примере понял как с группами можно работать, добавил к нему еще проверку объекта состоит ли он в открытой группе,а то не хотел рендерить. Теперь всё летает :D
     
  4. Дядя Миша

    Дядя Миша Пользователь сайта

    С нами с:
    27.08.2012
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    4
    Появилась новая проблема. Он не рендерит группы если в них есть еще группы =\. Можно добавить проверку на группу в группе, но я так понимаю если будет тройная или больше группа (несколько раз группирован обьект) то на каждый новый уровень групп прийдется добавлять новую проверку. Может есть какой-то универсальный способ?

    P.S. Мучает чувство что решение элементарное,но знаний пока не хватает самому додумать
     
  5. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Простой пример для частного случая:
    В новой сцене создаем 2 чайника и группируем их (Group1).
    Создаем 2 сферы и группируем их (Group2).
    Выделяем 2 группы и группируем их (Group3).
    Выделяем основную группу (Group3), родитель которой является Scene Root.
    Запускаем скрипт.
    Код:
    (
    fn group_children_all g &g_c= 
    ( 
    if(g.children.count>0)then 
    for obj in g.children do 
    (append g_c obj; group_children_all obj &g_c) 
    )--fn group_children_all g &g_c= 
     
    local current_object = 0 
    for i in selection do 
    ( 
    myobj = selection as array 
    current_object += 1 
    if current_object > 0 do 
    ( 
    $*.renderable = on 
    $*.primaryVisibility = off -- visible to camera 
    if isGroupHead  myobj[current_object]  and myobj[current_object].parent==undefined then
    (
    obj_children=#(); group_children_all myobj[current_object] obj_children 
    obj_children.renderable = on 
    obj_children.primaryVisibility = on 
    render ()
    )
    else if( not (isGroupHead  myobj[current_object] or  isGroupMember myobj[current_object]) )then
    (
    myobj[current_object].renderable = on 
    myobj[current_object].primaryVisibility = on 
    render ()
    )
    ) 
    ) 
    )
     
    nat79 нравится это.
  6. nat79

    nat79 Пользователь сайта

    С нами с:
    19.08.2014
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    2
    Весь мозг сломал - как пакетно сохранять все frame buffer на диск? Когда много элементов в сцене, проблематично вручную сохранять каждый из них.
    А если указывать путь в настройках, то последний затирает все предыдущие.
     
  7. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Пример: В новой сцене создаем 2 чайника и выделяем их.
    Открываем окно Render Scene (клавиша F10).
    На вкладке Common, в свитке Common Parameters, в группе Render Output нажимаем кнопку Files.
    В новом окне указываем нужный путь, название и тип файла (bmp, jpg, png).
    Запускаем скрипт.
    Код:
    (
    fn group_children_all g &g_c= 
    ( 
    if(g.children.count>0)then 
    for obj in g.children do 
    (append g_c obj; group_children_all obj &g_c) 
    )--fn group_children_all g &g_c= 
    
    if(rendOutputFilename!="")then
    (
    renderSceneDialog.close();
    render_folder=getFilenamePath rendOutputFilename
    render_filename=getFilenameFile rendOutputFilename
    render_filename_type=getFilenameType rendOutputFilename
    current_object = 0;currrent_render=1
    for i in selection do 
    ( 
    myobj = selection as array 
    current_object += 1
    if current_object > 0 do 
    ( 
    $*.renderable = on 
    $*.primaryVisibility = off -- visible to camera
    if isGroupHead  myobj[current_object]  and myobj[current_object].parent==undefined then
    (
    obj_children=#(); group_children_all myobj[current_object] obj_children 
    obj_children.renderable = on 
    obj_children.primaryVisibility = on
    rendOutputFilename=render_folder+render_filename+(currrent_render as string)+render_filename_type
    max quick render;currrent_render+=1
    )
    else if( not (isGroupHead  myobj[current_object] or  isGroupMember myobj[current_object]) )then
    (
    myobj[current_object].renderable = on 
    myobj[current_object].primaryVisibility = on
    rendOutputFilename=render_folder+render_filename+(currrent_render as string)+render_filename_type
    max quick render;currrent_render+=1
    )--else if( not (isGroupHead
    )--if current_object > 0 do 
    )--for i in selection do 
    rendOutputFilename=render_folder+render_filename+render_filename_type
    )--if(rendOutputFilename!="")then
    )
     
    nat79 нравится это.
  8. nat79

    nat79 Пользователь сайта

    С нами с:
    19.08.2014
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    2
    Спасибо, работает.
    Хотел бы немного отблагодарить. См. личку.
     
Модераторы: Savin Denis

Поделиться этой страницей