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

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

Тема в разделе "MAXScript", создана пользователем Александр Якушев, 10 дек 2015.

Модераторы: Savin Denis
  1. Александр Якушев

    Александр Якушев Активный участник

    С нами с:
    13.08.2009
    Сообщения:
    77
    Симпатии:
    1
    Баллы:
    7
    Задача, казалось бы, простая. Надо покрасить выделенные в модификаторе VertexPaint элементы.
    Покопался в нете, пока нашел только такую возможность:

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

    Вложения:

  2. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.254
    Симпатии:
    172
    Баллы:
    65
    Окно 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"
     
    Александр Якушев нравится это.
  3. Александр Якушев

    Александр Якушев Активный участник

    С нами с:
    13.08.2009
    Сообщения:
    77
    Симпатии:
    1
    Баллы:
    7
    Спасибо igorznag за оперативность!
    Очень хитрый способ:)! Прекрасно работает!

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

    Александр Якушев Активный участник

    С нами с:
    13.08.2009
    Сообщения:
    77
    Симпатии:
    1
    Баллы:
    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 $
    то ничего не происходит!:confused:

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

    Вложения:

  5. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.254
    Симпатии:
    172
    Баллы:
    65
    Разница в выделении 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 $
     
    Александр Якушев нравится это.
  6. Александр Якушев

    Александр Якушев Активный участник

    С нами с:
    13.08.2009
    Сообщения:
    77
    Симпатии:
    1
    Баллы:
    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 и виноваты настройки макса и т.п.
     

    Вложения:

  7. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.254
    Симпатии:
    172
    Баллы:
    65
    Используем модификатор 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
     
    Последнее редактирование: 30 дек 2015
    Александр Якушев нравится это.
  8. Александр Якушев

    Александр Якушев Активный участник

    С нами с:
    13.08.2009
    Сообщения:
    77
    Симпатии:
    1
    Баллы:
    7
    igorznag c Unwrap UVW, конечно, круто придумано, но нужно именно с Edit Mesh.

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

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.254
    Симпатии:
    172
    Баллы:
    65
    Такое простое действие не получается заскриптовать.
    Если кнопка для выбора цвета будет видна на экране, тогда можно скриптом "вручную" выполнить это простое действие.



    Код:
    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
     
    Александр Якушев нравится это.
  10. Александр Якушев

    Александр Якушев Активный участник

    С нами с:
    13.08.2009
    Сообщения:
    77
    Симпатии:
    1
    Баллы:
    7
    igorznag просто рулишь! спасибо! То, что нужно!
     
Модераторы: Savin Denis

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