Render.ru
Поддержать

Помогите разобраться в VertexPaint

Александр Якушев

Активный участник
Рейтинг
7
Задача, казалось бы, простая. Надо покрасить выделенные в модификаторе VertexPaint элементы.
Покопался в нете, пока нашел только такую возможность:

AssignVertexColors.ApplyNodes $ vertexPaint:$.modifiers[#VertexPaint]
update $
Но почему-то выделенные фрагменты красятся в красный. Хотя указывал конкретный цвет:
v = VertexPaintTool()
ReferenceTarget:Vertex_Paint_Floater
v.paintColor = blue
Помогите разобраться, пожалуйста.

Вложения

igorznag

Мастер
Рейтинг
103
Александр ЯкушевНадо покрасить выделенные в модификаторе VertexPaint элементы.
Окно VertexPaint всегда открыто?
Если да, тогда можно скриптом нажимать кнопку "Paint All".
У меня получилось так:
v = VertexPaintTool()
v.paintColor = blue
v.brushsize=v.brushsize

h = windows.getChildHWND 0 "VertexPaint" parent:#max
hc=windows.getChildrenHWND h[1]
UIAccessor.PressButton hc[28][1]  --button  "Paint All"

Александр Якушев

Активный участник
Рейтинг
7
Спасибо igorznag за оперативность!
Очень хитрый способ🙂! Прекрасно работает!

Предполагается, что окно VertexPaint будет открыто, но, конечно, было бы неплохо сделать работу более универсальной и прописать возможность работать с закрытым окном.

Александр Якушев

Активный участник
Рейтинг
7
Вопрос немного не по этой теме.
Помогите с VertexColors на уровне геометрии.
Какой-то глюк с VertexColors на модификаторе Edit Mesh.
Допустим есть геометрия:
Teapot radius:25 smooth:on segs:4 body:on handle:on spout:on lid:on mapcoords:on realWorldMapSize:on pos:[0,0,0] isSelected:on
convertToMesh $
$.showVertexColors = on
$.vertexColorType = 0
$.displaybylayer = off
Назначим модификатор Edit Mesh:
addmodifier $ (Edit_Mesh())
Далее красим тело чайника:
meshop.setFaceColor $ 0 #{1..496} green
update $
Суть проблемы:
Если тоже самое проделать руками, кроме покраски, затем выделить элемент чайника и покрасить уже кодом
meshop.setFaceColor $ 0 (getFaceSelection $) green
update $
то ничего не происходит!😕

В чем разница?

Вложения

igorznag

Мастер
Рейтинг
103
Александр ЯкушевВ чем разница?
Разница в выделении Face-ов модификатора Edit Mesh.
Для чего вам нужен модификатор Edit Mesh? Объясните подробнее.
Teapot radius:25 smooth:on segs:4 body:on handle:on spout:on lid:on mapcoords:on realWorldMapSize:on pos:[0,0,0] isSelected:on
convertToMesh $
$.showVertexColors = on
$.vertexColorType = 0
$.displaybylayer = off
addmodifier $ (Edit_Mesh())
setFaceSelection $ 1 #{1..496}
meshop.setFaceColor $ 0 #{1..496} green
update $

Александр Якушев

Активный участник
Рейтинг
7
Спасибо igorznag, но setFaceSelection $ 1 #{1..496} - не помогает, хотя непонятно почему(
У меня в сцене на неcколько объектов наброшен модификатор Edit Mesh. И скрипт должен уметь красить выделенный пользователем элемент на уровне модификатора. Соответсвенно мы должны сразу увидеть изменение цвета на уровне модификатора.
Прикладываю пример сценки с "неправильным" модификатором.
Если выделеить все три чайника и выполнить код:
for i in geometry do(
        setFaceSelection i 1 #{1..496}
        meshop.setFaceColor i 0 #{1..496} red
        update i
    )
То ничего не произойдет (точнее произойдет, но на уровне base object), НО если его убить и назначить новый, то все начинает работать, непонятно почему! Может быть у вас все заработает с оригинальным модификаторм Edit Mesh и виноваты настройки макса и т.п.

Вложения

igorznag

Мастер
Рейтинг
103
Изменено: 2 #7
Александр ЯкушевУ меня в сцене на неcколько объектов наброшен модификатор Edit Mesh.
И скрипт должен уметь красить выделенный пользователем элемент на уровне модификатора.
Соответсвенно мы должны сразу увидеть изменение цвета на уровне модификатора
Используем модификатор Unwrap UVW вместо модификатора Edit Mesh.
Teapot radius:25 smooth:on segs:4 body:on handle:on spout:on lid:on mapcoords:on realWorldMapSize:on pos:[0,0,0] isSelected:on
convertToMesh $
$.showVertexColors = on
$.vertexColorType = 0
$.displaybylayer = off
addmodifier $ (Unwrap_UVW())
max modify mode; m=$.modifiers[1]; m.setVC on
for i=1 to m.NumberVertices() do m.SetVertexPosition 0 i [1,1,1]
m.selectFaces #{1..496}; m.faceToVertSelect()
vs=(m.getSelectedVerticesByNode $) as array
c=green; c=[c.r,c.g,c.b]/255
for v in vs do m.SetVertexPosition 0 v c

Александр Якушев

Активный участник
Рейтинг
7
igorznag c Unwrap UVW, конечно, круто придумано, но нужно именно с Edit Mesh.

Если создать несколько объектов, на них набросить Edit Mesh и вручную красить элементы, то прекрасно работает. Казалось бы, такое простое действие не получается заскриптовать?

igorznag

Мастер
Рейтинг
103
Александр ЯкушевКазалось бы, такое простое действие не получается заскриптовать?
Такое простое действие не получается заскриптовать.
Если кнопка для выбора цвета будет видна на экране, тогда можно скриптом "вручную" выполнить это простое действие.



try destroydialog test catch()
rollout test "Test"
(
    colorpicker cp_vertex "Vertex Color:" pos:[5,5] color:green
    button btn_apply "Apply" pos:[25,30] width:70
    on btn_apply pressed do
    (
        h = windows.getChildHWND #max "Edit Vertex Colors:"
        if h!=undefined do
        (
            hc=windows.getChildrenHwnd h[2]
            h_color_swatch=undefined; for c in hc where c[4]=="ColorSwatch" do (h_color_swatch=c[1]; exit)
            if h_color_swatch!=undefined do
            (
                Windows.sendMessage h_color_swatch 0x201 0 0 --Left Mouse Button Down
                Windows.sendMessage h_color_swatch 0x202 0 0 --Left Mouse Button Up

                h_color_selector = windows.getChildHWND 0 "Color Selector: Vertex Color" parent:#max
                if h_color_selector!=undefined do
                (
                    cs_childs=windows.getChildrenHwnd h_color_selector[1]
                    cs_edits=#(); for c in cs_childs where c[4]=="Edit" do append cs_edits c[1]
                    if cs_edits.count>=3 do
                    (
                        c=cp_vertex.color; cr=((c.r as integer) as string);cg=((c.g as integer) as string); cb=((c.b as integer) as string)
                        WM_CHAR=0x0102; VK_RETURN= 0x000D
                        UIAccessor.SetWindowText cs_edits[1] cr
                        windows.sendMessage cs_edits[1] WM_CHAR VK_RETURN 0 -- press ENTER key
                        UIAccessor.SetWindowText cs_edits[2] cg
                        windows.sendMessage cs_edits[2] WM_CHAR VK_RETURN 0 -- press ENTER key
                        UIAccessor.SetWindowText cs_edits[3] cb
                        windows.sendMessage cs_edits[3] WM_CHAR VK_RETURN 0 -- press ENTER key
                        UIAccessor.SendMessageID h_color_selector[1] #IDOK
                    )--if cs_edits.count>=3 do
                )--if h_color_selector!=undefined do
            )--if h_color_swatch!=undefined do
        )--if h!=undefined do
    )--on btn_apply pressed do
); createdialog test 120 55