Подскажите пожалуйста, как у всех Shellac материалов сцены ( sceneMaterials ) у ShellacMaterial-а включить самосвечение (Self-Illumination) и установить его цвет равным 255,255,255 (white) ?
Попробовал реализовать при помощи следующего скрипта, но что-то не идет :-(
for m=1 to sceneMaterials.count do
setSceneMaterial(m).selfIllumAmount = 1
sceneMaterials[m].selfIllumColor = white
Все дело в том, что материал 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: Совет на будующее, когда чего не работает, посмотрите как это делает макрорекордер.
Большое Вам спасибо за подробный и содержательный ответ! Сегодня вечером обязательно попробую сделать, а пока еще один вопрос: если второй материал будет называться не shellacMtl2, а напр. BakedMaterial, сработает ли этот скрипт? С уважением, ASG.
Сработает, как бы не назывался.
shellacMtl1 и shellacMtl2 - это не имена(names) материалов, а свойства(properties) класса Shellac. Поэтому НЕ вздумайте написать sceneMaterials[m].BakedMaterial.selfIllumColor = white.
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?
Этот скрипт я хотел бы использовать для нормального использования RenderToTexture в связке с Vray для сохранения сцены, например в Cult3D или ViewPoint, с использованием "запеченных" текстур (GI).
Просто очень неохота вручную настраивать около 200-та материалов и это в пока простенькой сцене.
Все теперь ясно. 🙂)) Это не Shellac, a Shell_Material!
то есть добавьте в цикл:
if (classof sceneMaterials[m]) == Shell_Material do
(
sceneMaterials[m].bakedMaterial.useSelfIllumColor = on
sceneMaterials[m].bakedMaterial.selfIllumColor = white
)
ASGВ сцене 183 материалов: первым идет VrayMtl, затем около 40 Shellac, один Standard, еще около 60 Shellac, остальные вперемешку.
Задача несколько сложнее, чем кажется на первый взгляд. Self-Illumination есть только у стандартного материала. У всех прочих материалов таких как Multi/SubObject, Double-Sided, Shellac и т.д. его нет. Поэтому просто так не установишь - придется их просматривать в поиске свойства типа material, проверять, что свойству назначен стандартный материал, и только после этого устанавливать уже ему selfIllumColor = white. Учитывая то, что сами свойства также могут содержать нестандартные материалы, свойства которых также могут содержать материалы-"контейнеры" и так далее до бесконечности, получим сумашедшую иерархию, которую придется просматривать рекурсивно. Не говоря уже о том, что у каждого материала эти своства называются по разному (например, у материала doubleSided, это - .material1 и .material2).
То есть если материалы в сцене слишком сложные, то написание универсального скрипта может превратится в настоящий гемор.
Может Вам в действительности и не нужно менять Self-Illumination у всех материалов, а только у стандартных назначенных Шеллу?
ASGМожет в условии использовать не do, а then вместе с else?
Это без разницы. if можно писать с do, если он используется без else.
ASGЭтот скрипт я хотел бы использовать для нормального использования RenderToTexture в связке с Vray для сохранения сцены, например в Cult3D или ViewPoint, с использованием "запеченных" текстур (GI).
С Vray не очень знаком, но помоему у VRayMtl вроде же даже нет такого параметра Self-Illumination. (Да и с Viewpoint'ом тоже). То есть вы хотите экпортнуть сцену?
Да, недавно попался на глаза этот урок (Basic Texture Baking with V-Ray http://www.spot3d.com/vray/help/150R1/tutorials_baking_part1.htm).
Согласно этому уроку нужно: настроить сцену (материалы, свет и т.д.), затем используется Render to Texture (с его помощью происходит автоматический UVW Mapping, создаются текстуры с "запеченным" светом, тенями и т.д., затем эти материалы передаются в сцену), после чего необходимо установить флаг Render или Viewport (т.е. настраиваем материалы для просмотра в окне или для рендера) и устанавливаем самосвечение.
Но если для одного простого объекта
создается такая текстура ,
то вручную обработать более серьезную сцену становится очень проблематично :-((
Можно конечно объединить несколько объектов сцены в один, но при этом очень сильно увеличивается размер создаваемой текстуры и соответственно ухудшается итоговое качество.
Хотя наверняка существует другой, более простой и легкий путь. Будем искать 🙂
Я честно говоря не понял зачем Вам устанавливать Self-Illumination для всех материалов в сцене?
ASG, у Вас же по идее все гораздо проще. Я тут пробежался по уроку.
После того как Вы пропекли материалы (я смотрел по туториалу), у Вас для каждого объекта будет создан материал Shell, у которого Original Material - содержит начальную копию материала, а Baked Material - содержит стандартный материал с пропеченной текстурой в канале Self-Illumination(если согласно пункту 2.9, Вы выбрали стандартный материал, конечно. (А Вы его и выбирайте, чтобы лишний раз не мучаться)).
Все, что Вам нужно сделать после этого - это установить для стандартного материала Self-Illumination = 100 и DiffuseColor = White.
Все остальные материалы в сцене после этого можно вообще удалить, так как эти новые стандартные материалы уже представляют собой "сколлапснутые" оригинальные материалы, какими бы навороченными первые не были и каким бы рендерером Вы не пользовались.
ASGто вручную обработать более серьезную сцену становится очень проблематично :-((
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
)
)
Доступ к резюме доступен только по пакетному доступу HR менеджерам зарегистрированных компаний. Узнать о вариантах корпоративных пакетов можно по ссылке.
asg
Подскажите пожалуйста, как у всех Shellac материалов сцены ( sceneMaterials ) у ShellacMaterial-а включить самосвечение (Self-Illumination) и установить его цвет равным 255,255,255 (white) ?
Попробовал реализовать при помощи следующего скрипта, но что-то не идет :-(
RENDERATOR
Поэтому код в Вашем случае по идее должен выглядеть так:
Кстати selfIllumAmount = 100 прописывать необязательно, Вы же цвет используете.
PS: Совет на будующее, когда чего не работает, посмотрите как это делает макрорекордер.
asg
RENDERATOR
shellacMtl1 и shellacMtl2 - это не имена(names) материалов, а свойства(properties) класса Shellac. Поэтому НЕ вздумайте написать sceneMaterials[m].BakedMaterial.selfIllumColor = white.
asg
asg
Собственно скрипт:
В сцене 183 материалов: первым идет VrayMtl, затем около 40 Shellac, один Standard, еще около 60 Shellac, остальные вперемешку.
print "YES" и "NO" добавил для проверки, т.к. материалы не изменились, а надпись "YES" ни разу не появилась, только "NO".
Может в условии использовать не do, а then вместе с else?
asg
Просто очень неохота вручную настраивать около 200-та материалов и это в пока простенькой сцене.
RENDERATOR
то есть добавьте в цикл:
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'ом тоже). То есть вы хотите экпортнуть сцену?
asg
Согласно той-же справке, это можно реализовать лишь при помощи 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 (т.е. настраиваем материалы для просмотра в окне или для рендера) и устанавливаем самосвечение.
Но если для одного простого объекта
создается такая текстура
то вручную обработать более серьезную сцену становится очень проблематично :-((
Можно конечно объединить несколько объектов сцены в один, но при этом очень сильно увеличивается размер создаваемой текстуры и соответственно ухудшается итоговое качество.
Хотя наверняка существует другой, более простой и легкий путь. Будем искать 🙂
Большое спасибо за помощь!
RENDERATOR
ASG, у Вас же по идее все гораздо проще. Я тут пробежался по уроку.
После того как Вы пропекли материалы (я смотрел по туториалу), у Вас для каждого объекта будет создан материал Shell, у которого Original Material - содержит начальную копию материала, а Baked Material - содержит стандартный материал с пропеченной текстурой в канале Self-Illumination(если согласно пункту 2.9, Вы выбрали стандартный материал, конечно. (А Вы его и выбирайте, чтобы лишний раз не мучаться)).
Все, что Вам нужно сделать после этого - это установить для стандартного материала Self-Illumination = 100 и DiffuseColor = White.
Все остальные материалы в сцене после этого можно вообще удалить, так как эти новые стандартные материалы уже представляют собой "сколлапснутые" оригинальные материалы, какими бы навороченными первые не были и каким бы рендерером Вы не пользовались.
Все ОК, просто запустите скрипт и экспортируйте.
asg
В итоге скрипт имеет вид:
При помощи данного скрипта (а также VRay, RenderToTexture, Photoshop, TurnToTool, Macromedia Dreamweaver 🙂) был создан раздел "Интерактивное 3D" http://asg-3d.ru//content/view/10/51/ моего сайтаhttp://asg-3d.ru/