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

Переборка и изменение свойств материалов

Тема в разделе "MAXScript", создана пользователем aly8, 5 окт 2011.

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

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

    С нами с:
    22.12.2005
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    10
    Здравствуйте форумчане.

    Надо научиться менять определенные параметры материалов.

    Вот примерный код, но он не работает:

    (
    ------------------------------------
    fn edit_maps mat =
    (
    if mat.numsubs != 0 then
    (
    for i = 1 to mat.numsubs do
    (
    if mat != undefined then
    (
    if classof mat == SubAnim then
    (
    if superclassof mat.object == Missing_TextureMap then
    (
    print mat
    )
    )
    edit_maps mat
    )
    )
    )
    )
    ------------------------------------
    for o in objects do
    (
    if o.material != undefined do
    (
    edit_maps o.material
    )
    )
    )


    вот его упрощенная и немного измененная версия:
    (
    ------------------------------------
    fn edit_maps mat =
    (
    for i = 1 to mat.numsubs do
    (
    if mat != undefined then
    (
    if classof mat == Missing_TextureMap do print mat
    edit_maps mat
    )
    )
    )
    ------------------------------------
    for o in objects do edit_maps o.material

    )

    В данном случае нужно найти все "Missing_TextureMap" и удалить их или заменить на какие-нить другие, например на Cellular () или просто распечатать.

    Если обращаться к материалу напрямую, то все работает:
    iskindof materialsEditor[2].diffuseMap Missing_TextureMap - хоть так
    classOf materialsEditor[2].diffuseMap == Missing_TextureMap или так,
    то все работает, легко находит Missing_TextureMap и меняет.

    Вышеописанный способ, при запросе СlassOf выдает SubAnim - везде.
    Просто офигеть. Помогите, пожалуйста, разобраться.
     
  2. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Попробуй так:
    Код:
    ( 
    ------------------------------------ 
    fn edit_maps mat = 
    ( 
    if mat.numsubs != 0 then 
    ( 
    for i = 1 to mat.numsubs do 
    ( 
    if mat[i] != undefined then 
    ( 
    if classof mat[i] == SubAnim then 
    ( 
    if classof mat[i].value == Missing_TextureMap then 
    ( 
    print mat[i].value
    mat[i].value=undefined
    --mat[i].value=cellular();
    ) 
    ) 
    edit_maps mat[i] 
    ) 
    ) 
    ) 
    ) 
    ------------------------------------ 
    for o in objects do 
    ( 
    if o.material != undefined do 
    ( 
    edit_maps o.material 
    ) 
    ) 
    )
     
  3. aly8

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

    С нами с:
    22.12.2005
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    10
    igorznag - супер! то, что нужно, все работает. спасибо большое! уже думал, что никто не поможет.
     
  4. aly8

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

    С нами с:
    22.12.2005
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    10
    Спасибо igorznag! все заработало, но есть небольшое продолжение)
    Столкнулся с проблемой в материале VrayDirt. Дело в том, что вышеприведенный перебор свойств материала почему-то не видит материалы на .texmap_radius , .texmap_occluded_color, .texmap_unoccluded_color, .texmap_reflection_glossiness.

    К примеру, если на диффуз положить VrayDirt и обратиться через numsubs к диффузу, то получим 10:
    meditmaterials[1].diffuseMap.numsubs

    если же запросить свойства, то получим гораздо больше:
    showproperties meditmaterials[1].diffuseMap
    .radius : worldUnits
    .occluded_color : RGB color
    .unoccluded_color : RGB color
    .distribution : float
    .falloff : float
    .subdivs : integer
    .bias : point3
    .affect_alpha : boolean
    .ignore_for_gi : boolean
    .consider_same_object_only : boolean
    .invert_normal : boolean
    .work_with_transparency : boolean
    .environment_occlusion : boolean
    .mode : integer
    .reflection_glossiness : float
    .affect_reflection_elements : boolean
    .texmap_radius : texturemap
    .texmap_radius_on : boolean
    .texmap_radius_multiplier : float
    .texmap_occluded_color : texturemap
    .texmap_occluded_color_on : boolean
    .texmap_occluded_color_multiplier : float
    .texmap_unoccluded_color : texturemap
    .texmap_unoccluded_color_on : boolean
    .texmap_unoccluded_color_multiplier : float
    .texmap_reflection_glossiness : texturemap
    .texmap_reflection_glossiness_on : boolean
    .texmap_reflection_glossiness_mult : float
    .excludeList : node array
    .includeList : node array
    .resultAffectExcludeList : node array
    .resultAffectIncludeList : node array
    false



    Соответсвенно, если у нас в сцене есть VrayDirt с Missing_TextureMap, то вышеприведенный алгоритм Missing_TextureMap просто не увидит (.

    Можно ли как-нибудь усовершенствовать код, чтобы были видны все материалы, в том числе и подматериалы VrayDirt???
    Как вариант - уже написал доп. функцию, которая проверяет на наличие VrayDirt и и справляет ошибки, если они есть. Но это как-то сложно получается и не автоматизируется. Шаг в сторону и опять дописывать функции) - нехорошо.

    Может быть есть вариант, как-нить через функцию getPropNames организовать?

    Или никак?

    Помогите усовершенствовать, пожалуйста, если это возможно!
    Взамен потом могу поделиться исходником )
     
  5. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Vray у меня не установлен, поэтому помочь не могу.
    Может быть исходник скрипта set Bitmap Parameters чем-то поможет.
     
  6. aly8

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

    С нами с:
    22.12.2005
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    10
    igorznag спасибо за ссылку! отличные скриптики и главное код доступный. Буду изучать, обязательно потом отпишусь)
     
Модераторы: Savin Denis

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