Render.ru

Цвет мата от параметра объекта

iVAt

Знаток
Рейтинг
68
#1
Доброго времени суток.
Такой вопрос - есть бленд материал, цвет нижнего пока просто чёрный, верхнего должен меняться в зависимости от параметра объекта, в идеале от его высоты, но можно в качестве аргумента взять его масштаб.
Вопрос - как поставить в зависимость цвет материала от масштаба объекта, на который он будет назначаться?
картинка прилагается..
 

Вложения

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#2
1. Вешаешь на диффуз первого материала Сolor Correction
2. Устанавливаешь красный цвет у default map
3. Поле выделяешь обьекты с этими материалами
4. Запускаешь скрипт
Код:
fn fit01 val  hmin hmax = ((amax (amin (val as float) hmax) hmin) - hmin) / (hmax - hmin)
for obj in selection do obj.material.map1.diffuseMap.hueShift = 360. * (fit01 ((obj.max - obj.min).z) 10 40) - 180
PS

10 и 40 - это минимальная и максимальная высоты обьектов в пределах которых будет изменяться цвет
 

iVAt

Знаток
Рейтинг
68
#3
сделал, такая ошибка:

fit01()
-- Error occurred in obj loop; filename: ; position: 204; line: 2
-- Frame:
-- obj: $Box01
-- Unknown property: "map1" in 01 - Default:Standard
 

iVAt

Знаток
Рейтинг
68
#4
так записал
fn fit01 val hmin hmax = ((amax (amin (val as float) hmax) hmin) - hmin) / (hmax - hmin)
for obj in selection do obj.material.diffuseMap.hueShift = 360.0 * (fit01 ((obj.max - obj.min).z) 1.0 20.0) - 180.0
работает, но окрашивает все объекты в один цвет..
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#5
Первая ошибка - У тебя стандартный материал вместо бленда как в первом сообщении.
Второй вопрос:
1. Красный в СС у def map установил ?
2. Поверти в СС ползунок Hue Shift ручками - цвет должен меняться
3. Возможно не правильно определил пределы в которой варьируется высота:
Выдели самый маленький и в листенере забей строчку ($.max - $.min).z
Потом самый высокий и запиши эти значения в скрипт

 

iVAt

Знаток
Рейтинг
68
#6
не трудно пример работы скрипта выложить, может ты не совсем точно понял поставленную задачу?
у меня скрипт работает так: цвет меняется от масштаба, но цвет у всех объектов одинаковый.
я реализовал без скрипта, цвет меняется зеленный/красный/синий, но вариант со скриптом очень интересен и предпочтительнее...
вот так получилось (это без скрипта)..
 

Вложения

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#7
А ты как просто скопировал объект ?
А то что на них лежит один и тоже материал не забыл ?
Материал нужно сделать уникальным конечно.
 

igorznag

Мастер
Рейтинг
103
#8
Цитата из этой темы.
в том то и дело что материал один, менталовский. вопрос по большому счёту в следующем: может ли, например, дифузный цвет материала в один момент времени иметь разные значения цвета?
Если материал один, это означает, что объекты имеют "один" идентичный (Instance) материал или "один" разный (Copy) материал?
Если материал один и тот же (Instance) для всех объектов, тогда каким способом ты установил вручную разный цвет материала объектов?
 

iVAt

Знаток
Рейтинг
68
#9
может я не точно поставил задачу.. в общем есть лес вот этих грибов, их может быть много и много подстадий роста и соответсвенно много градаций цвета (зависит от стадии роста - молодые красные, средние зеленные, старые синие). например как на картинке цвет меняется от красного через зелёный до синего.
раскрашивать это уникальными материалами на мой взгляд не рационально.
ну общем вроде удалось реализовать раскраску одним материалом, всё оказалось до не приличия просто, только объекты нужно готовить, если интересно как, то напишу поподробнее.
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#10
iVAt
если речь шла о решении конкретной ситуации то это вполне приемлемый способ
может не самый красивый, но работоспособный

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

По поводу других способов да можно и даже наверно без скрипта.

 

igorznag

Мастер
Рейтинг
103
#11
Savin Denis.
В посте 8 я спросил iVAt-а.

iVAt.
Если нужно использовать только один материал (Instance), тогда можно сделать так:
1. Назначаем карту Gradient Ramp в качестве Diffuse Map. В свитке Coordinates устанавливаем Map Channel=2, а в свитке Gradient Ramp Parameters устанавливаем нужные цвета (синий, зеленый, красный).
2. Каждому объекту добавляем уникальный модификатор UVW Mapping (Planar). В свитке Parameters в группе Mapping увеличиваем значения Length или Width. В свитке Parameters в группе Channel в поле Map Channel вводим число 2. С помощью подобъекта Gizmo модификатора UVW Mapping "выбираем" нужный цвет.

Такой способ является рациональнее?
если интересно как, то напишу поподробнее.
Конечно интересно.
 

iVAt

Знаток
Рейтинг
68
#12
igorznag в приципе всё так, как я реализовал.
только у меня базовый мат бленд, для него (т.е. тут главное для его карты маск) свой модификатор UVW Mapping (Planar) подогнан для каждого объекта (фит т.е.), а для мата где градиент, по каналу 2 другой модификатор UVW Mapping (Planar), но одинаковый для всех объектов и он берёться от самого крупного объекта.
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#14
Набросал небольшой примерчик в рамках задачи
который показывает как обойти некоторые ограничения о которых упоминалось выше.

Также примечателен реализованным механизмом авто варьирования параметров при копировании.

Код:
-- Set Parameters
hmin = 20
hmax = 150
-- 
-- Init Gometry
obj = Teapot()
obj = convertToPoly(obj)
polyop.setMapSupport obj 0 true
polyop.defaultMapFaces obj 0


-- Create Controller
obj.scale.controller = scale_script()
obj.scale.controller.addNode "obj" obj
hobj = (obj.max - obj.min).z
str = ""
str += "fn fit01 val  hmin hmax = ((amax (amin (val as float) hmax) hmin) - hmin) / (hmax - hmin)\n"
str += "tl = (trimright obj.name \"1234567890\").count\n"
str += "if obj.name.count == tl then seed(0)\n"
str += "else ( sd = ((substring obj.name (tl+1) -1) as integer) + 4235; seed (sd + obj.name.count );(random .1 123.);for i = 1 to (random 1 6) do random 1 6;seed(random 22 100000);random .1 123.;random 3 16;)\n"
str += "hmin = " + (hmin as string) + " as float\n"
str += "hmax = " + (hmax as string) + " as float\n"
str += "h = random hmin hmax\n"
str += "col=color 255 0 0\n"
str += "col.hue = (fit01 h hmin hmax) * 255.\n"
str += "polyop.SetFaceColor obj 0 #All col\n"
str += "hscale = h / " + (hobj as string) + " \n"
str += "[1,1,hscale]\n"
obj.scale.controller.setExpression str
 
 -- Create Meterial
obj.material = Standardmaterial ()
tvc = Vertex_Color()
obj.material.diffuseMap = tvc
obj.material.selfIllumMap = tvc
--obj.material.useSelfIllumColor = on
	
-- Clone Nodes
clobj = #(obj)
undo off (
for i = 1 to 25 do ( maxops.clonenodes #(obj)  offset:[0, hobj * 1.5 * i,0] actualNodeList:&c newNodes:&d; join clobj d;)
for i = 1 to 25 do ( maxops.clonenodes clobj  offset:[ hobj * (-1.5) * i,0,0] actualNodeList:&c newNodes:&d; )
)
-- Render 
render()
 

igorznag

Мастер
Рейтинг
103
#15
Наверное способ, который предложил Savin Denis в посте 14 самый подходящий.

Простой пример.
1. В новой сцене создаем несколько объектов с разной высотой от hmin до hmax (ось Z) и конвертируем их в Editable Poly.
2. В окне Material Editor создаем материал (например Standard) и назначаем карту Vertex Color в качестве Diffuse Map.
3. Применяем материал сразу ко всем объектам. Выделяем объекты и запускаем скрипт:
Код:
fn fit01 val hmin hmax = ((amax (amin (val as float) hmax) hmin) - hmin) / (hmax - hmin)
hmin = 10; hmax = 80;
for obj in selection do ( if(classof obj.baseobject==Editable_Poly)then
(
hobj = (obj.max-obj.min).z;
col=color 255 0 0; col.hue=(fit01 hobj hmin hmax)*255.0;
polyop.SetFaceColor obj 0 #All col;
))
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#16
Спасибо Игорь за пояснения, не все могут понять что происходит. И за метод hue можно будет сократить контроллер.
 

iVAt

Знаток
Рейтинг
68
#17
ребят, спасибо за помощь. сейчас нет достаточно времени чтоб протестить скрипты и оценить.
как появиться попробую сделать и выложу результат.
 
Сверху