добрый день
интересуют несколько вопросов по скриптам
подскажите как должен выглядеть готовый код
1. скрипт интерполирующий выделенные вершины до и после выполнения команды (или действия скрипта)
- выделяем вершины в модификаторе едит поли
-запускаем скрипт, скрипт запоминает текушее положение вершин
- далее в скрипте прописана команда релакс (например)
-далее скрипт запоминает новое положение вершин
- и расчитывает положение вершин (старое положение)+(новое положение)/2
(т.е. вершины становяться на 50% пути после применения к ним релакса)
(также как апдейт к скрипту пришла мысль делать тоже самое только с множественными командами и бегунком смены интерполяции между старым и новым положение: запускаем скрипт нажимаем в нем кнопку "текушее положение" всех вершин, далее двигаем маштабируем релаксим.... , нажинаем кнопку "новое положение" и доступным бегунком интерполируем от 0 до 100% между двумя положениями) получаеться чтото вроде морфера только в текушем модификаторе едит поли.
2. есть ли проверка находиться ли курсор над кнопкий?
идея вызывать менюшку по нажатию хоткея, в менюшке несколько кнопок и при наведени курсора на кнопку срабатывает скрипт определенный.
т.е. нажали хоткей, изменили положение курсора, скрипт сработал (без дополнительного нажатия на ету кнопку или кнопки мыши)
3. возможно ли сделать скрипт (если да то помогите кодом) который:
-запускаем скрипт хоткеем
-сдвигаем мышку по одному из 8 направлений, (расходящиеся звездий от текушего положения курсора)
- черес 500мс скрипт проверяет куда сместился курсор и запускает соответствующую команду (действие)
(т.е. задействован один клик хоткей, и смешение курсора)
либо возможны вариации как реализовать можно?
dl80802
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 (там есть прозрачные формы и можно прицепиться из макскрипта к основному окну максы)
Доброго времени суток! Есть ли в макс скрипте функция вроде ожидания ввода с клавиатуры?
Пример: у меня есть клавиши A, S, D, F, занятые под разные операции. При активации скрипта, на Editable poly кидается модификатор Symmetry, а те самые клавиши (ASDE) теперь отвечают не за прошлые функции, а ,например, за выбор оси симметрии, Flip, weld, и так далее. Symmetry просто как пример.
Конечно, я могу написать что то вроде смартфункций для каждой из этих клавиш, вроде "if Symmetry активен, то сменить ось на Х, иначе - Align", или что то в этом духе. Но, черт побери, это же сколько мороки будет все это редактировать в случае необходимости?
GeeksonДоброго времени суток! Есть ли в макс скрипте функция вроде ожидания ввода с клавиатуры?
Пример: у меня есть клавиши A, S, D, F, занятые под разные операции. При активации скрипта, на Editable poly кидается модификатор Symmetry, а те самые клавиши (ASDE) теперь отвечают не за прошлые функции, а ,например, за выбор оси симметрии, Flip, weld, и так далее. Symmetry просто как пример.
Конечно, я могу написать что то вроде смартфункций для каждой из этих клавиш, вроде "if Symmetry активен, то сменить ось на Х, иначе - Align", или что то в этом духе. Но, черт побери, это же сколько мороки будет все это редактировать в случае необходимости?
Еще один вопрос: есть ли какой нибудь готовый инструмент вроде стандартного Paint Selection Region, работающий в режиме Unwrap UVW?
Я активно использую вот эту простую тулзу, но она работает только при Editable Poly. Если я правильно понял, это в первую очередь из за того, что используются методы polyops, а я со своим никудышным пока знанием MS не смог приспособить его под свои нужды.
Заранее спасибо.
Прошу прощения, кажется я выразился неясно: Paint Selection нужен для работы во вьюпорте, а не в UV эдиторе. Стандартный максовский - ужасен, выделяет все подряд, несмотря на включенный Ignore Backfacing, а единственный самописный которой я нашел, и который не лагает - не работает при включенном модификаторе Unwrap UVW.
Какую версию программы 3d max вы используете?
Можно выделить полигоны в Editable Poly, а потом активировать модификатор Unwrap UVW.
Такой вариант подходит для вас?
igorznagКакую версию программы 3d max вы используете?
Можно выделить полигоны в Editable Poly, а потом активировать модификатор Unwrap UVW.
Такой вариант подходит для вас?
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 в кои то веки)
GeeksonК сожалению, он работает только при Editable Poly (изза методов polyop как мне думается), и я пока не нашел в документации макса ничего подходящего из методов Unwrap_UVW для замены.
Я изменил скрипт. С его помощью можно выделять полигоны только в модификаторе UnwrapUVW.
Запускаем скрипт. Меню Customize > Customize UI > Keyboard > Category:"_igorznag"
Назначаем клавишу для действия igorznag_unwrap_Paint_Select.
Выделяем один объект. Активируем подобъет Polygon в модификаторе UnwrapUVW и нажимаем клавишу.
Базовый объект должен быть EditablePoly.
Количество полигонов в EditablePoly и UnwrapUVW должно быть одинаково.
Удерживаем клавишу Alt, чтобы снять выделение с полигонов.
Можно ли как то получить координаты в sme (хм как это назвать) центральной точки отображения? Допустим я передвинул слейт и теперь центр, который 0.0 он вообще не видел, и мне нужно получить координаты центра того что сейчас отображается в стейт. Надеюсь хоть как то удалось обьяснить
SkapМожно ли как то получить координаты в sme (хм как это назвать) центральной точки отображения? Допустим я передвинул слейт и теперь центр, который 0.0 он вообще не видел, и мне нужно получить координаты центра того что сейчас отображается в стейт. Надеюсь хоть как то удалось обьяснить
Это смотрел.
На картинке будет может немного понятнее
Только это место создания ноды всегда будет меняться, но она всегда должна создаваться в центре отображаемого view только вот как координаты вычислить я пока не могу понять
Может достаточно создавать где угодно, а потом зумиться? "Zooms the Node View to show all nodes or all selected nodes according to the type optional keyword argument."
ASK'RМожет достаточно создавать где угодно, а потом зумиться? "Zooms the Node View to show all nodes or all selected nodes according to the type optional keyword argument."
Ну это не совсем выход. Ибо дерево в слейте может быть очень большое и потом оттаскивай эту ноду куда надо
Дорогие люди, прошу объяснить, что вы делаете, чтобы Maxscript работал. Обязательно ли заказывать алтарь для жертвоприношений, например?
if $.constrainType == 0 then
$.constrainType = 1
else
$.constrainType = 0
Всегда ставит constrainType в 0. Всегда.
Когда я просто обдумывал скрипт в консоли он выдал это
Фото
Т.е., как я понимаю, он вместо 1 принта сделал 4 и только после этого сказал о том, что в синтаксисе ошибка.
Про то, что в один прекрасный момент крипты вообще перестают работать (у меня на хоткеи скрипты такие же простенькие назначены, часто пользуюсь - ConvertToPoly, Bridge и т.п.).
Хотел бы услышать ваше мнение что с этим делать и почему это работает у всех, но не у меня.
Доступ к резюме доступен только по пакетному доступу HR менеджерам зарегистрированных компаний. Узнать о вариантах корпоративных пакетов можно по ссылке.
dl80802
интересуют несколько вопросов по скриптам
подскажите как должен выглядеть готовый код
1. скрипт интерполирующий выделенные вершины до и после выполнения команды (или действия скрипта)
- выделяем вершины в модификаторе едит поли
-запускаем скрипт, скрипт запоминает текушее положение вершин
- далее в скрипте прописана команда релакс (например)
-далее скрипт запоминает новое положение вершин
- и расчитывает положение вершин (старое положение)+(новое положение)/2
(т.е. вершины становяться на 50% пути после применения к ним релакса)
(также как апдейт к скрипту пришла мысль делать тоже самое только с множественными командами и бегунком смены интерполяции между старым и новым положение: запускаем скрипт нажимаем в нем кнопку "текушее положение" всех вершин, далее двигаем маштабируем релаксим.... , нажинаем кнопку "новое положение" и доступным бегунком интерполируем от 0 до 100% между двумя положениями) получаеться чтото вроде морфера только в текушем модификаторе едит поли.
2. есть ли проверка находиться ли курсор над кнопкий?
идея вызывать менюшку по нажатию хоткея, в менюшке несколько кнопок и при наведени курсора на кнопку срабатывает скрипт определенный.
т.е. нажали хоткей, изменили положение курсора, скрипт сработал (без дополнительного нажатия на ету кнопку или кнопки мыши)
3. возможно ли сделать скрипт (если да то помогите кодом) который:
-запускаем скрипт хоткеем
-сдвигаем мышку по одному из 8 направлений, (расходящиеся звездий от текушего положения курсора)
- черес 500мс скрипт проверяет куда сместился курсор и запускает соответствующую команду (действие)
(т.е. задействован один клик хоткей, и смешение курсора)
либо возможны вариации как реализовать можно?
ASK'R
по 2:
on <Rollout> mousemove <Point2> do ()
--Called when the mouse is being moved within the dialogs client area.
по 3: есть таймер в макскрипте, логичнее 200мс период сделать если уж на движение мыши, отрисовка возможна средствами dotnet (там есть прозрачные формы и можно прицепиться из макскрипта к основному окну максы)
Неваше Дело (Geekson)
Пример: у меня есть клавиши A, S, D, F, занятые под разные операции. При активации скрипта, на Editable poly кидается модификатор Symmetry, а те самые клавиши (ASDE) теперь отвечают не за прошлые функции, а ,например, за выбор оси симметрии, Flip, weld, и так далее. Symmetry просто как пример.
Конечно, я могу написать что то вроде смартфункций для каждой из этих клавиш, вроде "if Symmetry активен, то сменить ось на Х, иначе - Align", или что то в этом духе. Но, черт побери, это же сколько мороки будет все это редактировать в случае необходимости?
Royal Ghost
Неваше Дело (Geekson)
Я активно использую вот эту простую тулзу, но она работает только при Editable Poly. Если я правильно понял, это в первую очередь из за того, что используются методы polyops, а я со своим никудышным пока знанием MS не смог приспособить его под свои нужды.
Заранее спасибо.
igorznag
Неваше Дело (Geekson)
igorznag
Можно выделить полигоны в Editable Poly, а потом активировать модификатор Unwrap UVW.
Такой вариант подходит для вас?
Неваше Дело (Geekson)
Вот образец отличного и простого инструмента от 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
Запускаем скрипт. Меню Customize > Customize UI > Keyboard > Category:"_igorznag"
Назначаем клавишу для действия igorznag_unwrap_Paint_Select.
Выделяем один объект. Активируем подобъет Polygon в модификаторе UnwrapUVW и нажимаем клавишу.
Базовый объект должен быть EditablePoly.
Количество полигонов в EditablePoly и UnwrapUVW должно быть одинаково.
Удерживаем клавишу Alt, чтобы снять выделение с полигонов.
Вложения
Неваше Дело (Geekson)
Skap
ASK'R
Skap
На картинке будет может немного понятнее
Только это место создания ноды всегда будет меняться, но она всегда должна создаваться в центре отображаемого view только вот как координаты вычислить я пока не могу понять
Вложения
ASK'R
Skap
Игорь Видлацкий (Stalker_Lom)
if $.constrainType == 0 then $.constrainType = 1 else $.constrainType = 0Всегда ставит constrainType в 0. Всегда.Когда я просто обдумывал скрипт в консоли он выдал это
Фото
Т.е., как я понимаю, он вместо 1 принта сделал 4 и только после этого сказал о том, что в синтаксисе ошибка.
Про то, что в один прекрасный момент крипты вообще перестают работать (у меня на хоткеи скрипты такие же простенькие назначены, часто пользуюсь - ConvertToPoly, Bridge и т.п.).
Хотел бы услышать ваше мнение что с этим делать и почему это работает у всех, но не у меня.
Почемучкин
Возможно, мой вопрос вам покажется глупым, но я уже себе весь мозг сломал.
Подскажите, пожалуйста, как мне со следующими данным:
Position = ReadVec3 bs --положение кости float3
Scale = ReadVec3 bs --масштаб кости float3
Rotation = ReadQuat bs --ориентация кости float4
создать матрицу трансформаций matrix3, чтобы использовать ее в BoneSys.CreateBone?
igorznag
Почемучкин
Только у меня почему-то все равно получается белиберда:
Попробовал так:
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Не подскажите, что и где я делаю не так?