Назначение материала полигонам через скрипт

Главные вкладки

5 сообщений [Последнее сообщение]

flynt2010

с mymodo 10 дней
2
Голос за!
0
Голос против!

Всем привет!

Собственно надо назначить списку полигонов материал. Идем в справку по СДК, примеры http://modo.sdk.thefoundry.co.uk/td-sdk/examples.html, находим это Assigning a material to individual polygons вставляем пример, добавляем определения переменных

import modo

scene = modo.Scene()

geo = modo.Mesh('Mesh').geometry

# continuing from the previous example ...

 

# We will assign the material per polygon, so we need to use a mask item

mask = scene.addItem('mask', name='Blue Mask')

 

# Create a new material with a blue diffuse color

mat = scene.addMaterial(name='Blue')

mat.channel('diffCol').set((0.0, 0.0, 1.0))

 

# Set all materials to double sided

for material in scene.items(mat.type):

material.channel('dblSided').set(True)

 

# Tell the mask to use our 'Blue' material

mask.channel('ptag').set('Blue')

 

# Parent the material to the mask

mat.setParent(mask, index=1)

 

# This places the mask item below the base shader in the hierarchy of the Shader Tree

mask.setParent(scene.renderItem, index=1)

 

 

# Assign the matertial only to the first polygon

geo.polygons[0].materialTag = 'Blue'

 

# Update the mesh to see the result

geo.setMeshEdits()

в итоге получаю это

# Result:

Traceback (most recent call last):

File "<string>", line 28, in <module>

File "C:\Program Files\Foundry\Modo\11.2v2\extra\Python\modules\modo\meshgeometry.py", line 1837, in materialTag

self.setTag(lx.symbol.i_POLYTAG_MATERIAL, material)

File "C:\Program Files\Foundry\Modo\11.2v2\extra\Python\modules\modo\meshgeometry.py", line 1825, in setTag

loc.Set(tagType, value)

RuntimeError: bad result: NOACCESS

 

Хорошо, задачу упрощаю. Вручную определяю материалы. Осталась только в скрипте переназначить материал полигону и что бы исключить все, читаем материал полигона и его же пытаемся назначить обратно (то же будет и при назначении любого другого материала)

 

import modo

scene = modo.Scene()

geo = modo.Mesh('Mesh').geometry

 

mat = geo.polygons[0].materialTag

print mat

geo.polygons[0].materialTag = mat

geo.setMeshEdits()

Ошибка та же, если закоментить последние 2 строки, действительно возвращает текущий материал. Подскажите пожалуйста в чем подвох? 

 

ЗЫ Извиняюсь за возможные ошибки в оформлении, это мой первый пост.

biotron

с mymodo 1850 дней
398
Голос за!
8
Голос против!
АммбассМедаль Троллямодонафт

Судя по всему не работает

geo.polygons[0].materialTag = mat

причины не ясны. Может всё в процессе правки.

попробуй вместо этого использовать 

geo.polygons[151].select(0)

где [151] Это набор поликов которые нужно выделить.

Дальше lx.eval() - назначаешь им мат через модо команды. Только не забудь import lx.

Может тебе и не нужно выделять полики. Т.е изначально предполагается что ты их выделил вручную.

Автор

flynt2010

с mymodo 10 дней
2
Голос за!
0
Голос против!

Спасибо за ответ. Эта же мысль посетила и меня, хоть криво но решилось

Но появилась новая проблема, похоже не работает вообще poligon.setTag,  для любого lx.symbol.i_POLYTAG_*. Так конкретно тот же результат и с i_POLYTAG_PART.  Что бы было понятно, это плагин импорта и в первом случае набор полигонов шел по порядку для каждого материала и это хоть и криво, но проходило. А с группами полный мрак, идет в разнобой и делать для каждого

                plg.select()

                lx.eval('poly.setSmooth %s' %sg)

                lx.eval('select.drop polygon')

затратно по времени. Для 200к треугольников, можно ставить на ночь, не вариант.

biotron

с mymodo 1850 дней
398
Голос за!
8
Голос против!
АммбассМедаль Троллямодонафт

С группами не всё так хорошо. Там сколько не мудри можно накосячить с именами. Нужно формировать имена очень большие. Но на практике и это не проходит. Если у имени хоть 1-на буква совпадает это уже одна группа. Попробуй по-другому. Назначай не группы непосредственно а селекшин сеты. Потом когда геометрия будет создана можно назначить группы по селекшин сетам. А ещё лучше по партам. Ещё лучше избавиться полностью от смус групп уже в модо. Т.е по баундинг селекшин сета назначить острые эджи. Безусловно если можно решить не через селект геометрии то так и нужно. Селектить это мрак.

Автор

flynt2010

с mymodo 10 дней
2
Голос за!
0
Голос против!

Да собственно мне без разницы, по каким группам разбить геометрию, но и парты так же, как смус надо поштучно загонять. Возможно через селекшин сет и подошло бы, но я что то пока не нашел подход к нему через API.

Вообще группы сглаживания как таковые и не нужны, т.к. в оригинале данные идут приблизительно такого формата для каждого полигона

poligons[i]          группа хз чего           edge1   [xxxxxxxx, xxxxxxxx]  судя по всему нормали вертексов

                                                               edge2   [xxxxxxxx, xxxxxxxx]

                                                               edge3   [xxxxxxxx, xxxxxxxx]

эти длинные циферки "xxxxxxxx" пока не дешифровал и куда их пристроить пока не понял.))