Render.ru

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

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

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

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

Вложения

igorznag

Мастер
Рейтинг
103
#2
Надо покрасить выделенные в модификаторе 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
#3
Спасибо igorznag за оперативность!
Очень хитрый способ:)! Прекрасно работает!

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

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

Активный участник
Рейтинг
7
#4
Вопрос немного не по этой теме.
Помогите с 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 $
то ничего не происходит!:confused:

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

Вложения

igorznag

Мастер
Рейтинг
103
#5
Разница в выделении 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
#6
Спасибо 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
#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
#8
igorznag c Unwrap UVW, конечно, круто придумано, но нужно именно с Edit Mesh.

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

igorznag

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


Код:
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
 
Сверху