Render.ru

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

asg

Активный участник
Рейтинг
13
#1
Доброго времени суток!

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

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

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

RENDERATOR

Активный участник
Рейтинг
15
#2
Все дело в том, что материал 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: Совет на будующее, когда чего не работает, посмотрите как это делает макрорекордер.
 

asg

Активный участник
Рейтинг
13
#3
Большое Вам спасибо за подробный и содержательный ответ! Сегодня вечером обязательно попробую сделать, а пока еще один вопрос: если второй материал будет называться не shellacMtl2, а напр. BakedMaterial, сработает ли этот скрипт? С уважением, ASG.
 

RENDERATOR

Активный участник
Рейтинг
15
#4
Сработает, как бы не назывался.
shellacMtl1 и shellacMtl2 - это не имена(names) материалов, а свойства(properties) класса Shellac. Поэтому НЕ вздумайте написать sceneMaterials[m].BakedMaterial.selfIllumColor = white.
 

asg

Активный участник
Рейтинг
13
#5
Еще раз большое спасибо за информацию. Будем пробовать...
 

asg

Активный участник
Рейтинг
13
#6
Воспользовавшись 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?
 

asg

Активный участник
Рейтинг
13
#7
Этот скрипт я хотел бы использовать для нормального использования RenderToTexture в связке с Vray для сохранения сцены, например в Cult3D или ViewPoint, с использованием "запеченных" текстур (GI).

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

RENDERATOR

Активный участник
Рейтинг
15
#8
ASG сказал(а):
Воспользовавшись MacroRecorder-ом получил:
Все теперь ясно. :))) Это не 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'ом тоже). То есть вы хотите экпортнуть сцену?
 

asg

Активный участник
Рейтинг
13
#9
С Vray не очень знаком, но помоему у VRayMtl вроде же даже нет такого параметра Self-Illumination. (Да и с Viewpoint'ом тоже).
Действительно 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 (т.е. настраиваем материалы для просмотра в окне или для рендера) и устанавливаем самосвечение.

Но если для одного простого объекта

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

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

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

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

RENDERATOR

Активный участник
Рейтинг
15
#10
Я честно говоря не понял зачем Вам устанавливать Self-Illumination для всех материалов в сцене?

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




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

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

ASG сказал(а):
то вручную обработать более серьезную сцену становится очень проблематично :-((
Все ОК, просто запустите скрипт и экспортируйте.
 

asg

Активный участник
Рейтинг
13
#11
Большое спасибо 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/
 
Сверху