Render.ru

Вопросы по Max Script (всего понемногу)

dl80802

Пользователь сайта
Рейтинг
2
добрый день
интересуют несколько вопросов по скриптам
подскажите как должен выглядеть готовый код
1. скрипт интерполирующий выделенные вершины до и после выполнения команды (или действия скрипта)
- выделяем вершины в модификаторе едит поли
-запускаем скрипт, скрипт запоминает текушее положение вершин
- далее в скрипте прописана команда релакс (например)
-далее скрипт запоминает новое положение вершин
- и расчитывает положение вершин (старое положение)+(новое положение)/2
(т.е. вершины становяться на 50% пути после применения к ним релакса)

(также как апдейт к скрипту пришла мысль делать тоже самое только с множественными командами и бегунком смены интерполяции между старым и новым положение: запускаем скрипт нажимаем в нем кнопку "текушее положение" всех вершин, далее двигаем маштабируем релаксим.... , нажинаем кнопку "новое положение" и доступным бегунком интерполируем от 0 до 100% между двумя положениями) получаеться чтото вроде морфера только в текушем модификаторе едит поли.


2. есть ли проверка находиться ли курсор над кнопкий?
идея вызывать менюшку по нажатию хоткея, в менюшке несколько кнопок и при наведени курсора на кнопку срабатывает скрипт определенный.
т.е. нажали хоткей, изменили положение курсора, скрипт сработал (без дополнительного нажатия на ету кнопку или кнопки мыши)


3. возможно ли сделать скрипт (если да то помогите кодом) который:
-запускаем скрипт хоткеем
-сдвигаем мышку по одному из 8 направлений, (расходящиеся звездий от текушего положения курсора)
- черес 500мс скрипт проверяет куда сместился курсор и запускает соответствующую команду (действие)
(т.е. задействован один клик хоткей, и смешение курсора)
либо возможны вариации как реализовать можно?
 

ASK'R

Активный участник
Рейтинг
5
3. возможно ли сделать скрипт (если да то помогите кодом) который:
-запускаем скрипт хоткеем
-сдвигаем мышку по одному из 8 направлений, (расходящиеся звездий от текушего положения курсора)
- черес 500мс скрипт проверяет куда сместился курсор и запускает соответствующую команду (действие)
(т.е. задействован один клик хоткей, и смешение курсора)
либо возможны вариации как реализовать можно?
по 1: скорость такого решения на сколько-нибудь тяжелом меше будет никакая, чем морфер не устраивает?
по 2:
on <Rollout> mousemove <Point2> do ()
--Called when the mouse is being moved within the dialogs client area.
по 3: есть таймер в макскрипте, логичнее 200мс период сделать если уж на движение мыши, отрисовка возможна средствами dotnet (там есть прозрачные формы и можно прицепиться из макскрипта к основному окну максы)
 

Geekson

Знаток
Рейтинг
44
Доброго времени суток! Есть ли в макс скрипте функция вроде ожидания ввода с клавиатуры?
Пример: у меня есть клавиши A, S, D, F, занятые под разные операции. При активации скрипта, на Editable poly кидается модификатор Symmetry, а те самые клавиши (ASDE) теперь отвечают не за прошлые функции, а ,например, за выбор оси симметрии, Flip, weld, и так далее. Symmetry просто как пример.
Конечно, я могу написать что то вроде смартфункций для каждой из этих клавиш, вроде "if Symmetry активен, то сменить ось на Х, иначе - Align", или что то в этом духе. Но, черт побери, это же сколько мороки будет все это редактировать в случае необходимости?
 
Рейтинг
229
Доброго времени суток! Есть ли в макс скрипте функция вроде ожидания ввода с клавиатуры?
Пример: у меня есть клавиши A, S, D, F, занятые под разные операции. При активации скрипта, на Editable poly кидается модификатор Symmetry, а те самые клавиши (ASDE) теперь отвечают не за прошлые функции, а ,например, за выбор оси симметрии, Flip, weld, и так далее. Symmetry просто как пример.
Конечно, я могу написать что то вроде смартфункций для каждой из этих клавиш, вроде "if Symmetry активен, то сменить ось на Х, иначе - Align", или что то в этом духе. Но, черт побери, это же сколько мороки будет все это редактировать в случае необходимости?
Есть готовые решения типа https://www.onikanabo.com/keyhydra , в самом максе вроде только Keyboard Shortcut Override
 

Geekson

Знаток
Рейтинг
44
Еще один вопрос: есть ли какой нибудь готовый инструмент вроде стандартного Paint Selection Region, работающий в режиме Unwrap UVW?
Я активно использую вот эту простую тулзу, но она работает только при Editable Poly. Если я правильно понял, это в первую очередь из за того, что используются методы polyops, а я со своим никудышным пока знанием MS не смог приспособить его под свои нужды.
Заранее спасибо.
 

Geekson

Знаток
Рейтинг
44
Используйте кнопку UV Paint Selection.
Прошу прощения, кажется я выразился неясно: Paint Selection нужен для работы во вьюпорте, а не в UV эдиторе. Стандартный максовский - ужасен, выделяет все подряд, несмотря на включенный Ignore Backfacing, а единственный самописный которой я нашел, и который не лагает - не работает при включенном модификаторе Unwrap UVW.
 

igorznag

Мастер
Рейтинг
103
Какую версию программы 3d max вы используете?
Можно выделить полигоны в Editable Poly, а потом активировать модификатор Unwrap UVW.
Такой вариант подходит для вас?

1.gif
 

Geekson

Знаток
Рейтинг
44
Какую версию программы 3d max вы используете?
Можно выделить полигоны в Editable Poly, а потом активировать модификатор Unwrap UVW.
Такой вариант подходит для вас?

Посмотреть вложение 248460
2017-ую версию. Насчет того, что unwrap "наследует" выделение с предыдущего уровня я знаю, но переключаться между модификаторами ради выделения нового островка - такое себе удовольствие). Я использую Paint Selection для быстрого анврапинга игровых лоуполек, с довольно таки плотной сеткой, чтобы не выделять каждый полигон отдельным нажатием, т.е. весь смысл в скорости процесса. И так как стандартный селектор убог, ищу ему альтернативы)

Вот образец отличного и простого инструмента от Olli Koskelainen
Код:
macroScript OK_Paint_Select
category:"OK_scripts"
buttontext:"Paint Select"
tooltip:"Paint Select"
(
    local bary = [0,0,0]
    local faceIndex = 0
    local theObj
    local theMesh
    local SelectMode
    fn StartStroke = (
        thePainterInterface.undoStart()
    )
    fn CancelStroke = (
        thePainterInterface.undoAccept()
    )
    fn EndStroke = (
        thePainterInterface.undoAccept()
        SelectMode = undefined
    )
    fn PaintStroke =    (
        oldFaceIndex = faceIndex
        thePainterInterface.getHitFaceData &bary &faceIndex theObj 0
        if SelectMode == undefined then (
            SelectMode = NOT     (getFaceSelection theMesh)[faceIndex]
        )
        if faceIndex != oldFaceIndex then (
            verts = meshop.getVertsUsingFace theMesh #{faceIndex}
            vertFaces = #()
            for v in verts do (
                append vertFaces (polyop.getFacesUsingVert theObj v)
            )
            face = vertFaces[1]
            for f = 2 to vertFaces.count do (
                face = face * vertFaces[f]
            )
            if SelectMode then ( -- True is additive, False is substractive
                polyop.setFaceSelection theObj (append (polyop.getFaceSelection $) (face as array)[1])
            ) else (
                polyop.setFaceSelection theObj ((polyop.getFaceSelection $) - face)
            )
        )
    )
  
    fn startPainting = (
        theObj = $
        theMesh = theObj.mesh
        thePainterInterface.pointGatherEnable = true
        thePainterInterface.initializeNodes 0 #(theObj)
        thePainterInterface.offMeshHitType = 2
        thePainterInterface.drawNormal = false
        thePainterInterface.drawTrace = false
        thePainterInterface.maxSize = 3
        thePainterInterface.ScriptFunctions startStroke paintStroke endStroke cancelStroke SystemEndPaintSession
        thePainterInterface.startPaintSession()
    )
    if (subobjectlevel == 4) and (classof (modpanel.getCurrentObject()) == editable_poly) then (
        if thePainterInterface.inPaintMode() then (
            thePainterInterface.endPaintSession()
        ) else (
            startPainting()
        )
    )
)

К сожалению, он работает только при Editable Poly (изза методов polyop как мне думается), и я пока не нашел в документации макса ничего подходящего из методов Unwrap_UVW для замены.
В общем, если у вас нет на примете подобных инструментов, я просто продолжу ковыряться в этом коде, хороший повод освоить MaxScript в кои то веки)
 

igorznag

Мастер
Рейтинг
103
К сожалению, он работает только при Editable Poly (изза методов polyop как мне думается), и я пока не нашел в документации макса ничего подходящего из методов Unwrap_UVW для замены.
Я изменил скрипт. С его помощью можно выделять полигоны только в модификаторе UnwrapUVW.
Запускаем скрипт. Меню Customize > Customize UI > Keyboard > Category:"_igorznag"
Назначаем клавишу для действия igorznag_unwrap_Paint_Select.
Выделяем один объект. Активируем подобъет Polygon в модификаторе UnwrapUVW и нажимаем клавишу.

Базовый объект должен быть EditablePoly.
Количество полигонов в EditablePoly и UnwrapUVW должно быть одинаково.
Удерживаем клавишу Alt, чтобы снять выделение с полигонов.

2.gif
 

Вложения

Skap

Знаток
Рейтинг
44
Можно ли как то получить координаты в sme (хм как это назвать) центральной точки отображения? Допустим я передвинул слейт и теперь центр, который 0.0 он вообще не видел, и мне нужно получить координаты центра того что сейчас отображается в стейт. Надеюсь хоть как то удалось обьяснить
 

ASK'R

Активный участник
Рейтинг
5
Можно ли как то получить координаты в sme (хм как это назвать) центральной точки отображения? Допустим я передвинул слейт и теперь центр, который 0.0 он вообще не видел, и мне нужно получить координаты центра того что сейчас отображается в стейт. Надеюсь хоть как то удалось обьяснить
Посмотрите в интерфейсе самой вьюхи (http://help.autodesk.com/view/3DSMA...GUID_7E144C67_4F97_4A2A_924E_711870C7DF6E_htm вниз промотать). Но что вы хотите сделать-то?
 

Skap

Знаток
Рейтинг
44
Посмотрите в интерфейсе самой вьюхи (http://help.autodesk.com/view/3DSMA...GUID_7E144C67_4F97_4A2A_924E_711870C7DF6E_htm вниз промотать). Но что вы хотите сделать-то?
Это смотрел.
На картинке будет может немного понятнее


Только это место создания ноды всегда будет меняться, но она всегда должна создаваться в центре отображаемого view только вот как координаты вычислить я пока не могу понять
 

Вложения

ASK'R

Активный участник
Рейтинг
5
Может достаточно создавать где угодно, а потом зумиться? "Zooms the Node View to show all nodes or all selected nodes according to the type optional keyword argument."
 

Skap

Знаток
Рейтинг
44
Может достаточно создавать где угодно, а потом зумиться? "Zooms the Node View to show all nodes or all selected nodes according to the type optional keyword argument."
Ну это не совсем выход. Ибо дерево в слейте может быть очень большое и потом оттаскивай эту ноду куда надо
 

Игорь Видлацкий (Stalker_Lom)

Платиновый спонсор
Рейтинг
152
Дорогие люди, прошу объяснить, что вы делаете, чтобы Maxscript работал. Обязательно ли заказывать алтарь для жертвоприношений, например?

Код:
if $.constrainType == 0 then
        $.constrainType = 1
    else
        $.constrainType = 0
Всегда ставит constrainType в 0. Всегда.

Когда я просто обдумывал скрипт в консоли он выдал это
Т.е., как я понимаю, он вместо 1 принта сделал 4 и только после этого сказал о том, что в синтаксисе ошибка.
Про то, что в один прекрасный момент крипты вообще перестают работать (у меня на хоткеи скрипты такие же простенькие назначены, часто пользуюсь - ConvertToPoly, Bridge и т.п.).
Хотел бы услышать ваше мнение что с этим делать и почему это работает у всех, но не у меня.
 

Почемучкин

Активный участник
Рейтинг
7
День добрый, Знатоки.

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

Position = ReadVec3 bs --положение кости float3
Scale = ReadVec3 bs --масштаб кости float3
Rotation = ReadQuat bs --ориентация кости float4

создать матрицу трансформаций matrix3, чтобы использовать ее в BoneSys.CreateBone?
 

igorznag

Мастер
Рейтинг
103
Подскажите, пожалуйста, как мне со следующими данными создать матрицу трансформаций matrix3, чтобы использовать ее в BoneSys.CreateBone?
Попробуйте такой вариант:
Код:
m=(scaleMatrix Scale)*(Rotation as matrix3)*(transMatrix Position)
 

Почемучкин

Активный участник
Рейтинг
7
Попробуйте такой вариант:
Код:
m=(scaleMatrix Scale)*(Rotation as matrix3)*(transMatrix Position)
Спасибо огромное. Если я правильно понимаю, то ваш вариант вроде работает:
Код:
Position: [-8.47893,12.6583,-0.179578]
Scale: [1,1,1] 
Rotation: (matrix3 [0.266611,0.963804,1.44122e-007] [-0.963802,0.266611,0.00188421] [0.00181597,-0.00050249,0.999998] [0,0,0])

m: (matrix3 [0.266611,0.963804,1.44122e-007] [-0.963802,0.266611,0.00188421] [0.00181597,-0.00050249,0.999998] [-8.47893,12.6583,-0.179578])
Только у меня почему-то все равно получается белиберда:


Попробовал так:
Код:
Position = ReadVec3 bs
Scale = ReadVec3 bs
Rotation = ReadQuat bs
m = (scaleMatrix Scale)*(Rotation as matrix3)*(transMatrix Position)
local NewBone = BoneSys.CreateBone \
                m.row4 \
                (m.row4 + 0.01 * (normalize m.row1)) \
                (normalize m.row3)
NewBone.Transform = m
Не подскажите, что и где я делаю не так?
 
Сверху