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

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

Тема в разделе "MAXScript", создана пользователем iVAt, 14 янв 2011.

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

    iVAt Знаток

    С нами с:
    03.08.2006
    Сообщения:
    1.138
    Симпатии:
    1
    Баллы:
    46
    Доброго времени суток.
    Такой вопрос - есть бленд материал, цвет нижнего пока просто чёрный, верхнего должен меняться в зависимости от параметра объекта, в идеале от его высоты, но можно в качестве аргумента взять его масштаб.
    Вопрос - как поставить в зависимость цвет материала от масштаба объекта, на который он будет назначаться?
    картинка прилагается..
     

    Вложения:

    • 2113367.jpg
      2113367.jpg
      Размер файла:
      240,5 КБ
      Просмотров:
      69
  2. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    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 - это минимальная и максимальная высоты обьектов в пределах которых будет изменяться цвет
     
  3. iVAt

    iVAt Знаток

    С нами с:
    03.08.2006
    Сообщения:
    1.138
    Симпатии:
    1
    Баллы:
    46
    сделал, такая ошибка:

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

    iVAt Знаток

    С нами с:
    03.08.2006
    Сообщения:
    1.138
    Симпатии:
    1
    Баллы:
    46
    так записал
    работает, но окрашивает все объекты в один цвет..
     
  5. Savin Denis vip

    Savin Denis Moderator Команда форума

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

     
  6. iVAt

    iVAt Знаток

    С нами с:
    03.08.2006
    Сообщения:
    1.138
    Симпатии:
    1
    Баллы:
    46
    не трудно пример работы скрипта выложить, может ты не совсем точно понял поставленную задачу?
    у меня скрипт работает так: цвет меняется от масштаба, но цвет у всех объектов одинаковый.
    я реализовал без скрипта, цвет меняется зеленный/красный/синий, но вариант со скриптом очень интересен и предпочтительнее...
    вот так получилось (это без скрипта)..
     

    Вложения:

    • 2117097.jpg
      2117097.jpg
      Размер файла:
      161,5 КБ
      Просмотров:
      68
  7. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    А ты как просто скопировал объект ?
    А то что на них лежит один и тоже материал не забыл ?
    Материал нужно сделать уникальным конечно.
     
  8. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.255
    Симпатии:
    172
    Баллы:
    65
    Цитата из этой темы.
    Если материал один, это означает, что объекты имеют "один" идентичный (Instance) материал или "один" разный (Copy) материал?
    Если материал один и тот же (Instance) для всех объектов, тогда каким способом ты установил вручную разный цвет материала объектов?
     
  9. iVAt

    iVAt Знаток

    С нами с:
    03.08.2006
    Сообщения:
    1.138
    Симпатии:
    1
    Баллы:
    46
    может я не точно поставил задачу.. в общем есть лес вот этих грибов, их может быть много и много подстадий роста и соответсвенно много градаций цвета (зависит от стадии роста - молодые красные, средние зеленные, старые синие). например как на картинке цвет меняется от красного через зелёный до синего.
    раскрашивать это уникальными материалами на мой взгляд не рационально.
    ну общем вроде удалось реализовать раскраску одним материалом, всё оказалось до не приличия просто, только объекты нужно готовить, если интересно как, то напишу поподробнее.
     
  10. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    iVAt
    если речь шла о решении конкретной ситуации то это вполне приемлемый способ
    может не самый красивый, но работоспособный

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

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

     
  11. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.255
    Симпатии:
    172
    Баллы:
    65
    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 "выбираем" нужный цвет.

    Такой способ является рациональнее?
    Конечно интересно.
     
  12. iVAt

    iVAt Знаток

    С нами с:
    03.08.2006
    Сообщения:
    1.138
    Симпатии:
    1
    Баллы:
    46
    igorznag в приципе всё так, как я реализовал.
    только у меня базовый мат бленд, для него (т.е. тут главное для его карты маск) свой модификатор UVW Mapping (Planar) подогнан для каждого объекта (фит т.е.), а для мата где градиент, по каналу 2 другой модификатор UVW Mapping (Planar), но одинаковый для всех объектов и он берёться от самого крупного объекта.
     
  13. iVAt

    iVAt Знаток

    С нами с:
    03.08.2006
    Сообщения:
    1.138
    Симпатии:
    1
    Баллы:
    46
    igorznag почему то кнопка | Спасибо | для тебя не работает :(
     
  14. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Набросал небольшой примерчик в рамках задачи
    который показывает как обойти некоторые ограничения о которых упоминалось выше.

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

    Код:
    -- 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()
     
  15. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.255
    Симпатии:
    172
    Баллы:
    65
    Наверное способ, который предложил 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;
    ))
     
  16. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Спасибо Игорь за пояснения, не все могут понять что происходит. И за метод hue можно будет сократить контроллер.
     
  17. iVAt

    iVAt Знаток

    С нами с:
    03.08.2006
    Сообщения:
    1.138
    Симпатии:
    1
    Баллы:
    46
    ребят, спасибо за помощь. сейчас нет достаточно времени чтоб протестить скрипты и оценить.
    как появиться попробую сделать и выложу результат.
     
Модераторы: Savin Denis

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