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

Включение и установка значения Self-Illumination

Тема в разделе "MAXScript", создана пользователем asg, 9 сен 2007.

Модераторы: Savin Denis
  1. asg

    asg Активный участник

    С нами с:
    13.11.2006
    Сообщения:
    372
    Симпатии:
    0
    Баллы:
    19
    Доброго времени суток!

    Подскажите пожалуйста, как у всех Shellac материалов сцены ( sceneMaterials ) у ShellacMaterial-а включить самосвечение (Self-Illumination) и установить его цвет равным 255,255,255 (white) ?

    Попробовал реализовать при помощи следующего скрипта, но что-то не идет :-(

    Код:
    for m=1 to sceneMaterials.count do
    setSceneMaterial(m).selfIllumAmount = 1
    sceneMaterials[m].selfIllumColor = white
    
     
  2. RENDERATOR

    RENDERATOR Активный участник

    С нами с:
    27.01.2003
    Сообщения:
    83
    Симпатии:
    0
    Баллы:
    12
    Все дело в том, что материал shellac - это "контейнер" из двух материалов shellacMtl1 (для основного) и shellacMtl2(для верхнего). У самого шеллака нет свойств selfIllumColor и selfIllumAmount. Они только у standardMaterial.

    Поэтому код в Вашем случае по идее должен выглядеть так:

    Код:
    for m=1 to sceneMaterials.count do 
    (
    	if (classof sceneMaterials[m]) == Shellac do
    	(
    		sceneMaterials[m].shellacMtl1.useSelfIllumColor = on
    		sceneMaterials[m].shellacMtl1.selfIllumColor = white
    		sceneMaterials[m].shellacMtl2.useSelfIllumColor = on
    		sceneMaterials[m].shellacMtl2.selfIllumColor = white
    	)
    )
    
    Кстати selfIllumAmount = 100 прописывать необязательно, Вы же цвет используете.

    PS: Совет на будующее, когда чего не работает, посмотрите как это делает макрорекордер.
     
  3. asg

    asg Активный участник

    С нами с:
    13.11.2006
    Сообщения:
    372
    Симпатии:
    0
    Баллы:
    19
    Большое Вам спасибо за подробный и содержательный ответ! Сегодня вечером обязательно попробую сделать, а пока еще один вопрос: если второй материал будет называться не shellacMtl2, а напр. BakedMaterial, сработает ли этот скрипт? С уважением, ASG.
     
  4. RENDERATOR

    RENDERATOR Активный участник

    С нами с:
    27.01.2003
    Сообщения:
    83
    Симпатии:
    0
    Баллы:
    12
    Сработает, как бы не назывался.
    shellacMtl1 и shellacMtl2 - это не имена(names) материалов, а свойства(properties) класса Shellac. Поэтому НЕ вздумайте написать sceneMaterials[m].BakedMaterial.selfIllumColor = white.
     
  5. asg

    asg Активный участник

    С нами с:
    13.11.2006
    Сообщения:
    372
    Симпатии:
    0
    Баллы:
    19
    Еще раз большое спасибо за информацию. Будем пробовать...
     
  6. asg

    asg Активный участник

    С нами с:
    13.11.2006
    Сообщения:
    372
    Симпатии:
    0
    Баллы:
    19
    Воспользовавшись MacroRecorder-ом получил:

    Код:
    sceneMaterials[m].renderMtlIndex = 1 -- Здесь мы выбрали использование материала для рендера
    sceneMaterials[m].bakedMaterial.useSelfIllumColor = on --Флаг использования SelfIllum.
    sceneMaterials[m].bakedMaterial.selfIllumColor = color 255 255 255 --Цвет SelfIllum.
    Собственно скрипт:

    Код:
    for m=1 to sceneMaterials.count do
    (
    if (classof sceneMaterials[m]) == Shellac do
    (
    print "YES"
    sceneMaterials[m].renderMtlIndex = 1
    sceneMaterials[m].bakedMaterial.useSelfIllumColor = on
    sceneMaterials[m].bakedMaterial.selfIllumColor = color 255 255 255
    )
    print "NO"
    )
    В сцене 183 материалов: первым идет VrayMtl, затем около 40 Shellac, один Standard, еще около 60 Shellac, остальные вперемешку.

    print "YES" и "NO" добавил для проверки, т.к. материалы не изменились, а надпись "YES" ни разу не появилась, только "NO".

    Может в условии использовать не do, а then вместе с else?
     
  7. asg

    asg Активный участник

    С нами с:
    13.11.2006
    Сообщения:
    372
    Симпатии:
    0
    Баллы:
    19
    Этот скрипт я хотел бы использовать для нормального использования RenderToTexture в связке с Vray для сохранения сцены, например в Cult3D или ViewPoint, с использованием "запеченных" текстур (GI).

    Просто очень неохота вручную настраивать около 200-та материалов и это в пока простенькой сцене.
     
  8. RENDERATOR

    RENDERATOR Активный участник

    С нами с:
    27.01.2003
    Сообщения:
    83
    Симпатии:
    0
    Баллы:
    12
    Все теперь ясно. :))) Это не Shellac, a Shell_Material!

    то есть добавьте в цикл:

    if (classof sceneMaterials[m]) == Shell_Material do
    (
    sceneMaterials[m].bakedMaterial.useSelfIllumColor = on
    sceneMaterials[m].bakedMaterial.selfIllumColor = white
    )


    Задача несколько сложнее, чем кажется на первый взгляд. Self-Illumination есть только у стандартного материала. У всех прочих материалов таких как Multi/SubObject, Double-Sided, Shellac и т.д. его нет. Поэтому просто так не установишь - придется их просматривать в поиске свойства типа material, проверять, что свойству назначен стандартный материал, и только после этого устанавливать уже ему selfIllumColor = white. Учитывая то, что сами свойства также могут содержать нестандартные материалы, свойства которых также могут содержать материалы-"контейнеры" и так далее до бесконечности, получим сумашедшую иерархию, которую придется просматривать рекурсивно. Не говоря уже о том, что у каждого материала эти своства называются по разному (например, у материала doubleSided, это - .material1 и .material2).
    То есть если материалы в сцене слишком сложные, то написание универсального скрипта может превратится в настоящий гемор.
    Может Вам в действительности и не нужно менять Self-Illumination у всех материалов, а только у стандартных назначенных Шеллу?

    Это без разницы. if можно писать с do, если он используется без else.

    С Vray не очень знаком, но помоему у VRayMtl вроде же даже нет такого параметра Self-Illumination. (Да и с Viewpoint'ом тоже). То есть вы хотите экпортнуть сцену?
     
  9. asg

    asg Активный участник

    С нами с:
    13.11.2006
    Сообщения:
    372
    Симпатии:
    0
    Баллы:
    19
    Действительно VRayMtl не поддерживает Self-Illumination (http://www.spot3d.com/vray/help/150R1/material_params.htm)
    Согласно той-же справке, это можно реализовать лишь при помощи VRayLightMtl (http://www.spot3d.com/vray/help/150R1/vray_light_mtl.htm).

    Может быть в моем случае можно использовать VRayOverrideMtl (http://www.spot3d.com/vray/help/150R1/vray_overridemtl.htm), но это уже тема для другого раздела форума.

    Да, недавно попался на глаза этот урок (Basic Texture Baking with V-Ray http://www.spot3d.com/vray/help/150R1/tutorials_baking_part1.htm).
    Согласно этому уроку нужно: настроить сцену (материалы, свет и т.д.), затем используется Render to Texture (с его помощью происходит автоматический UVW Mapping, создаются текстуры с "запеченным" светом, тенями и т.д., затем эти материалы передаются в сцену), после чего необходимо установить флаг Render или Viewport (т.е. настраиваем материалы для просмотра в окне или для рендера) и устанавливаем самосвечение.

    Но если для одного простого объекта
    [​IMG]
    создается такая текстура [​IMG],
    то вручную обработать более серьезную сцену становится очень проблематично :-((

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

    Хотя наверняка существует другой, более простой и легкий путь. Будем искать :)

    Большое спасибо за помощь!
     
  10. RENDERATOR

    RENDERATOR Активный участник

    С нами с:
    27.01.2003
    Сообщения:
    83
    Симпатии:
    0
    Баллы:
    12
    Я честно говоря не понял зачем Вам устанавливать Self-Illumination для всех материалов в сцене?

    ASG, у Вас же по идее все гораздо проще. Я тут пробежался по уроку.
    После того как Вы пропекли материалы (я смотрел по туториалу), у Вас для каждого объекта будет создан материал Shell, у которого Original Material - содержит начальную копию материала, а Baked Material - содержит стандартный материал с пропеченной текстурой в канале Self-Illumination(если согласно пункту 2.9, Вы выбрали стандартный материал, конечно. (А Вы его и выбирайте, чтобы лишний раз не мучаться)).

    [​IMG]


    Все, что Вам нужно сделать после этого - это установить для стандартного материала Self-Illumination = 100 и DiffuseColor = White.

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

    Все ОК, просто запустите скрипт и экспортируйте.
     
  11. asg

    asg Активный участник

    С нами с:
    13.11.2006
    Сообщения:
    372
    Симпатии:
    0
    Баллы:
    19
    Большое спасибо Renderator-у за оказанную помощь!

    В итоге скрипт имеет вид:

    Код:
    for m=1 to sceneMaterials.count do
    (
    if (classof sceneMaterials[m]) == Shell_Material do
    (
    sceneMaterials[m].renderMtlIndex = 1
    sceneMaterials[m].viewportMtlIndex = 1
    sceneMaterials[m].bakedMaterial.useSelfIllumColor = on
    sceneMaterials[m].bakedMaterial.selfIllumColor = white
    )
    )
    При помощи данного скрипта (а также VRay, RenderToTexture, Photoshop, TurnToTool, Macromedia Dreamweaver :)) был создан раздел "Интерактивное 3D" http://asg-3d.ru//content/view/10/51/ моего сайтаhttp://asg-3d.ru/
     
Модераторы: Savin Denis

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