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

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

igorznag

Мастер
Рейтинг
103
ПочемучкинНе подскажите, что и где я делаю не так?
Объясните подробнее. Лучше в Skype: igorznag2012
Каким способом вы получили координаты Position, Rotation, Scale?
В какой системе координат (World или Parent) вы получили координаты Position, Rotation, Scale?
У вас есть информация о родителях/детей костей?
Предоставьте файл с координатами Position, Rotation, Scale, чтобы тестировать скрипт.

Почемучкин

Активный участник
Рейтинг
7
igorznagКаким способом вы получили координаты Position, Rotation, Scale?
Координаты положения и масштаба кости я получил с помощью данной функции:
fn ReadVec3 bs =
(
    local v = point3 0 0 0
    v.x = ReadFloat bs
    v.y = ReadFloat bs
    v.z = ReadFloat bs
    v
)
Координаты вращения кости я получил с помощью данной функции:
fn ReadQuat bs =
(
    local q = quat 0 0 0 0
    q.x = ReadFloat bs
    q.y = ReadFloat bs
    q.z = ReadFloat bs
    q.w = ReadFloat bs
    q
)
igorznagВ какой системе координат (World или Parent) вы получили координаты Position, Rotation, Scale?
Думаю, именно здесь и кроется проблема. Я новичок в максскрипте и многое еще не знаю\не понимаю. Просто пытаюсь смотреть скрипты других авторов и гуглить, но это не всегда дает нужный мне результат.
igorznagУ вас есть информация о родителях/детей костей?
Иерархия костей, и названия костей, имеется. Вот краткий обзор возможностей моего скрипта:

igorznagПредоставьте файл с координатами Position, Rotation, Scale, чтобы тестировать скрипт.
Вам нужен файл самой модели и скелета, если я правильно вас понял?
igorznagОбъясните подробнее. Лучше в Skype: igorznag2012
У меня нет ни видео камеры, ни микрофона, поэтому видео- или голосовой сеанс не получится провести. Если вы согласны на переписку и готовы потратить свое личное время на такого незнайку как я, то скажите в какое время для вас это будет удобно.

igorznag

Мастер
Рейтинг
103
ПочемучкинВам нужен файл самой модели и скелета, если я правильно вас понял?
Да. Чтобы я тоже мог тестировать скрипт. Также предоставьте ваш скрипт, чтобы изменить его, а не создавать заново.
ПочемучкинУ меня нет ни видео камеры, ни микрофона, поэтому видео- или голосовой сеанс не получится провести. Если вы согласны на переписку и готовы потратить свое личное время на такого незнайку как я, то скажите в какое время для вас это будет удобно.
Видео камера не нужна. Купите наушники с микрофоном.
Я согласен потратить свое личное время, если вы согласны заплатить мне некую сумму денег.
Мне удобно общаться по скайпу с 12 часов дня до 10 часов вечера. Когда вам удобно общаться по скайпу?

Почемучкин

Активный участник
Рейтинг
7
igorznagДа. Чтобы я тоже мог тестировать скрипт. Также предоставьте ваш скрипт, чтобы изменить его, а не создавать заново.
Это уже получится, что скрипт будете делать вы, а не я. Мне же важно самому научиться всем аспектам написания скриптов-импортеров.
igorznagКупите наушники с микрофоном.
Я согласен потратить свое личное время, если вы согласны заплатить мне некую сумму денег.
Простите, но я не готов тратить деньги на не нужные мне наушники с микрофоном и на то, чтобы скрипт писали вместо меня. Как я сказал выше, мне важно самому во всем разобраться.

Что ж, продолжу изучать чужие скрипты и гуглить. Со временем я найду/пойму как мне решить текущую проблему с построением скелета. Простите за беспокойство и отнятое у вас время. И спасибо вам за помощь.)

igorznag

Мастер
Рейтинг
103
PenterКак в теле плагина (simpleObject) определить мировые координаты создаваемого узла ?
Попробуйте использовать переменную nodeTM

Penter

Пользователь сайта
Рейтинг
4
Изменено: 1 #146
nodeTM ведь используется только в mouse tool. А как смещать уже созданный экземпляр ?
parameters main1 rollout:params (
    Linked type:#boolean default:false ui:chk_Linked
    target type:#node subAnim:true ui:pb_target
    support type:#node subAnim:true ui:pb_support
    depth type:#float default:0 ui:spn_dep
    len type:#float default:0 ui:spn_len
)
rollout params "Parameters" (
    checkbox chk_Linked "Linked"
    pickbutton pb_target "< No >" autoDisplay:true
    pickbutton pb_support "< No >" autoDisplay:true
    button btn_clearObj "All Clear"
    ...
    on btn_clearObj pressed do undo on (
        target = undefined; pb_target.text = "< No >"
        support = undefined; pb_support.text = "< No >"
    )
    fn Cone_fn theLen = createinstance cone radius1:depth radius2:.0 height:theLen sides:8 heightsegs:1
    fn TransMesh theMesh theTM matID:1 = (
        for v = 1 to theMesh.numverts do setVert theMesh v ((getVert theMesh v)*theTM)
        for f = 1 to theMesh.numfaces do setFacematID theMesh f matID
        theMesh
    )
    on buildMesh do (
        MyLen = if Linked then (if target != undefined and support != undefined then (distance target.pos support.pos) else len) else len
        MyCone = Cone_fn MyLen
        TM = matrix3 1
        if Linked do (
            if target != undefined and support != undefined
            do (   TM = matrixFromNormal (normalize (target.pos - support.pos))
                    translate TM support.pos
            )
        )
        mesh = TransMesh MyCone.mesh TM matID:1
    )

Вложения

Penter

Пользователь сайта
Рейтинг
4
Изменено: 3 #147
Добавил Delta. но при перемещении конечно от привязок отъезжает.
local Delta = [0,0,0]
parameters main1 rollout:params (
    Linked type:#boolean default:false ui:chk_Linked
    target type:#node subAnim:true ui:pb_target
    support type:#node subAnim:true ui:pb_support
    ...
on buildMesh do (
    ...
    TM = matrix3 1
    if Linked do (
        if TargetSupport_fn() do (
            TM = matrixFromNormal (normalize (target.transform[4] - support.transform[4]))
            translate TM (support.transform[4]-Delta)
        )
    )
    ...
tool create (
    on mousePoint click do case click of
        (
            1: (Delta = nodeTM.translation = gridPoint)
            3: #stop
        )
    ...
)
Как перемещение отследить ?
Конструкция << on rollout open do ( when transform obj changes... >> не работает

Вложения

igorznag

Мастер
Рейтинг
103
PenternodeTM ведь используется только в mouse tool. А как смещать уже созданный экземпляр ?
Объясните подробнее. Лучше в Skype: igorznag2012
Для чего вам нужен этот объект?
Вместо SimpleObject можно использовать объект Cone с модификатором Attribute Holder.
Используем контроллеры Position Consrtraint и LookAt Consrtraint.
Для вас подходит такой вариант?

Вложения

Рейтинг
44
Изменено: 1 #149
Здравствуйте! Попробую спросить здесь - есть ли какой либо надежный способ создавать группы выделения из полигонов? Желательно чтобы информация хранилась в самом полигоне, чтобы можно было без проблем аттачить и деттачить элементы. Что то вроде MatID, но более надежное) Я думал насчет использования vertex color, но не знаю как конвертить вертексы в полигон так, чтобы выделялись тольк полигоны полностью состоящие из выделенных вертексов, а не те у которых этот вертекс только один из трех\четырех составляющих.

И в догонку еще один вопрос - можно ли автоматом выделять полигоны после чамфера? В смысле не один раз после применения, а в процессе работы над моделью, в любой момент.
uH5zTio.png

Например выделить все полигоны, плоскости которых парраллельны\перпендикулярны координатным осям, а затем инвертировать. Хотя скругления и цилиндры в таком случае будут выделяться неккоректно. Но вот если хотя бы выделять все основные плоскости, это уже было бы здорово.
Спасибо.

igorznag

Мастер
Рейтинг
103
GeeksonЯ думал насчет использования vertex color, но не знаю как конвертить вертексы в полигон так, чтобы выделялись тольк полигоны полностью состоящие из выделенных вертексов, а не те у которых этот вертекс только один из трех\четырех составляющих.
С помощью скрипта можно выделить полигоны по цвету полигона.
Ответил вам в личные сообщения. Вы можете объяснить подробнее в Skype: igorznag2012

Дмитрий П (d1myan)

Активный участник
Рейтинг
7
Изменено: 1 #151
Добрый день всем! Наткнулся на очень интересный скрипт, который делает переключение видов вьюпорта по аналогии Zbrush: переключает на ближайший вид ортогональной проекции из вида перспективы. Но очень мешает, что после переключения меняется расстояние Zoom до объекта: по умолчанию в скрипте вконце забита команда "Zoom Extens Selected" и выделенный объект зуммируется на весь экран, если убрать эту команду, то объект наоборот сильно отдаляется. Подскажите возможно ли это исправить как-то чтобы при переключение на вид проекции объект оставался приблизительно на таком же удалении?
(
global sType;

vpType = viewport.getType()

if (vpType==#view_left or vpType==#view_right or vpType==#view_front or vpType==#view_back or vpType==#view_bottom or vpType==#view_top)
then(
try(
viewport.setType sType
actionMan.executeAction 0 "40228" — Views: Restore Active View
)catch()
)
else (
temp = viewport.getTM() as EulerAngles

sType = viewport.getType()
actionMan.executeAction 0 "40227" — Views: Save Active View

case of
(
(45<=temp.y and temp.y<=135): viewport.setType #view_left
(-45>=temp.y and temp.y>=-135): viewport.setType #view_right
((-45>=temp.x and temp.x>=-135) and (-45<=temp.y and temp.y<=45)): viewport.setType #view_front
((45<=temp.x and temp.x<=135) and (-45<=temp.y and temp.y<=45)): viewport.setType #view_back
((135<=temp.x and temp.x<=180) or (-135>=temp.x and temp.x>=-180)): viewport.setType #view_bottom
default: viewport.setType #view_top
)
max zoomext sel
)
completeredraw()
)

Paguo-86PK

Пользователь сайта
Рейтинг
2
Добрый день!

Сконструировал письменный пол с тумбой и выдвижными ящиками. Использовал только примитивы - сплошные боксы без модификаторов форм.

Как можно выдвигать эти ящики?
Создал линии путей и добавил кастом-спиннер - работает.
Но, если всё это добро объединить в единную группу, каким образом можно управлять её частями без принудительного вскрытия группы?
Можно ли группе назначить несколько спиннеров, чтобы вся группа функционировала как единный письменный стол - объект со спиннерами открытия отдельных ящичков?

Ни Group, ни Assembly-Luminaire не позволяют добавить контроллеры. А если добавляются, то невесть куда, так как в Свойствах ничего не появляется, хотя в древе - видно.

Как вообще правильно организовывать комплексные параметризованные объекты из готовых примитивов?

Спасибо!

вован1 В

Активный участник
Рейтинг
14
при каждом запуске Макса начал вылазить отладчик... Где эта галка - отключающая автозапуск? Не могу найти...

kuirp

Активный участник
Рейтинг
16
Ребята, подскажите команду LayerManager, чтобы поместить "слой1" внутрь "слоя2" скриптом.
(функция доступная в новых версиях макса)

Владислав Бодюл

Активный участник
Рейтинг
15
kuirpРебята, подскажите команду LayerManager, чтобы поместить "слой1" внутрь "слоя2" скриптом.
(функция доступная в новых версиях макса)
(
    local l1 = LayerManager.getLayerFromName "Layer001"
    local l2 = LayerManager.getLayerFromName "Layer002"
    l1.setParent l2
)

kuirp

Активный участник
Рейтинг
16
Простой(с виду) вопрос:

как из имени:
object010
удалить паттерн "object0", чтобы осталось только:
10
?

Royal Ghost

Мастер
Рейтинг
229
kuirpПростой(с виду) вопрос:

как из имени:
object010
удалить паттерн "object0", чтобы осталось только:
10
?
str = "object010"
substring str (str.count-1) 2

DASLON

Активный участник
Рейтинг
13
subobjectlevel =2
b.getSelection #Vertex
$.EditablePoly.SetSelection #Edge #{277}

b.SetSelection #Vertex #{1..15, 17..20, 24..25, 30..33, 36..37, 41, 61..69, 77..82, 84..86, 95..100, 102..103, 113..118, 120, 131..136, 149..154, 167..168}
t=polyop.getnumverts b
for i=1 to t by 2 do(
$.EditablePoly.SetSelection #Vertex #{i}
)
a=#{}
polyop.getnumverts b или
b.numverts выдает общее количество вершин
b.numfaces выдает общее количество полигонов

b.SetSelection #Vertex a
polyop.getedgeselection b возвращает выделенные ребра

polyop.setvertselection b 59 выделяет вершины

polyop.getvertflags b 60 возвращает флаг указанных вершин
polyop.getvertsbyflag p 0 mask:1 выдает все невыделенные вершины
1 выделена
0 не выделена
polyop.setedgeflags $Plane001 #{5} 28 установить флаг ребра
polyop.setfaceflags p #{1..8971} 1 устанавливает флаги для указанных полигонов
polyop.setvertflags b #{60..80} 1 выделяет вершины устанавливает флаги для указанных вершин
b.selectedverts =#{70..73} выделяет вершины
polyop.setfaceselection b #(68) выделяет указанные полигоны


p=plane()
converttopoly(p) конвертировать в editable_poly
convertto p editable_poly
polyop.getvertsusingface p 12 выдает номера вершин прилежащих к полигону
polyop.getvertsusingedge p 13 выдает номера вершин прилежащих к ребру
polyop.getfacesusingvert p 13 возвращает номера прилегающих к вершине полигонов
polyop.getedgesusingvert p 13 возвращает номера исходящих из вершины ребер
polyop.getfaceverts b 33 возвращает номера вершин полигона
polyop.getedgeverts b 64 возвращает номера вершин ребра
polyop.getfacedeg b 33 возвращает количество вершин полигона
polyop.getedgefaces b 64 возвращает номера прилегающих полигонов к ребру
polyop.getfacematid b 37 возвращает ид материала назначенного полигону
polyop.setfacematid b 37 назначает ид материала полигону
polyop.getvert b 55 возвращает позицию вершины [8.60718,590.268,369.402]
polyop.setvert b 55 [10,10,10] устанавливает позицию вершины
move $.selectedVerts [0.934624,0,0] перемещает вершину
olyop.movevert p 13 [10,10,10] ( node: usesoftsel:bool ) перемещает вершину
polyop.movevert b 55 [0,-10,40] передвигает вершину
polyop.getopenedges b возвращает открытые ребра
polyop.getfaceedges b 37 возвращает номера ребер принадлежащие полигону
polyop.getfacesusingedge p #{20} возвращает прилегающие полигоны к ребру
polyop.getvertsusedonlybyfaces p #{4..5} возвращает вершины, которые принадлежат всем указанным полигонам из списка , но никаким другим полигонам вне списка
polyop.getvertsbyflag p 4 возвращает номера вершин с соответствующими флагами
polyop.getfacecenter p 11 центр face позиция
polyop.getsafefacecenter p 11 мягкий центр face позиция
polyop.getedgesusingface p 11 выдает ребра принадлежащие полигону
polyop.deleteverts b 719 удаляет указанные вершины
polyop.getfacenormal p 7 возвращает нормаль полигона
polyop.getfacearea p 7 возвращает площадь полигона
polyop.getopenedges p возвращает все открытые ребра
polyop.getvertflags p 2 возвращает флаг вершины
polyop.movevertstoplane p #{8,9,13,14} [1,1,1] 1.7 вершины перемещает в плоскость
polyop.makefacesplanar p #{7} делает плоский полигон
polyop.getnumedges p возвращает количество ребер в editable_poly
polyop.getfacesbyflag p 1 возвращает номара полигонов по флагу
polyop.getborderfromedge p 2268 выдает номера ребер составляющих бордер вместе с указанным ребром(ами)
polyop.deletefaces b 476 ( delisoverts:true ) удаляет полигон
polyop.deleteverts b 476 удаляет вершину
polyop.deleteedges b 476 ( delisoverts:true ) удаляет ребро
polyop.weldverts b 1463 142 [-5,20,40] сваривает, соединяет указанные вершины и создает новую на позиции от центра координат и назначает самый маленький номер новой вершине
polyop.createvert b [0,5,0] создает вершину в заданной позиции от центра координат
polyop.createedge b 1467 1452 создает ребро между вершинами , если они имеют общий полигон
polyop.createpolygon b <vertex array> создает полигон из указанных вершин










b.remove() удаляет только выделенные вершины или грани без дыр
b.createedge 718 1485 select:true создание ребра и выделение
b.createface #(1,6,5) создание нового полигона по указанным точкам
polyop.divideface p 9 [-27,-64,0] создает точку на полигоне в указанном месте,соединяя её с четырьмя точками полигона. если точка находится за пределами полигона, то создается ребро только между двумя ребрами

polytoolsselect.loop создает петлю по вылеленному ребру
polytoolsselect.numericvertex 2 1 false выделяет вершины на основе количества ребер от них первый аргумент количество ребер выходящих из вершины, второй аргумент если 1, то выделяются вершины только с количеством ребер указанном в первом аргументе. если 2 то выделяются вершины только с меньшем количеством ребер чем указано в первом аргументе. если второй аргумент 3, то выделяются вершины , которые имеют большее количество ребер чем указано в первом аргументе. и третий аргумент если true, то выделяются вершины только на выделенном участке

max modify mode перейти на панель модификации
setcommandpaneltaskmode #modify перейти на панель модификации
subobjectlevel =2 перейти на уровень подобьектов ребер


$.constrainType = 1 ограничение перемещения точек и ребер по ребру


b.hide #face #vertex # edge #face # object спрятать, скрыть субобъекты
b.unhideall #currentlevel


b.createvertex [0,0,0] pointinlocalcoords:false select:true создание вершины по указанным координатам
b.deleteIsoVerts () удалить изолированные вершины
b.createedge 163 192 select:true создание ребра по указанным точкам
b=converttopoly(plane()) конвертировать объект в editable_poly
v=b.createface #(267,268, 269,270 ) select:true создание полигонов по вершинам
b.capholes #face flags:1
b.capholes #vertex flags:1 закрывает дыру, отверстие , если хоть одна вершина выделена на границе дыры
b.delete #face flags:1 deleteisoverts:false удаляет указанный субобъект, если после него остаются несвязанные вершины, то последний аргумент определяет удалять их или нет.

s=$sphere001
b.attach s s присоединение сферы к объекту "b" с перемещением ее в центр объекта
b.attach b s без перемещения


b.detachtoelement #face flags:1 keeporiginal:false отделяет по флагу подобъекты от модели. последний аргумент отвечает за то будет ли элемент копироваться
b.detachtoelement #vertex flags:1 keeporiginal:true если выделена вершина отделяется весь полигон принадлежащий вершине либо оставляя оригинал=keeporiginal:true , либо нет=keeporiginal:false.

$Plane001.breakverts 1 раскалывает полигоны по вершине
p.splitedges edgeflags:1 разрезает, разбивает полигон по ребру
p.divideedge 17 0.2 select:true делит ребро пополам и возвращает индекс новой вершины. 0.2 это 20% растояния от длины ребра со стороны самого большого индекса из двух вертексов ребра
p.insertvertexinedge 3 0.2 вставляет вершину на ребро ребро пополам и возвращает индекс новой вершины. 0.2 это 20% растояния от длины ребра со стороны самого большого индекса из двух вертексов ребра

p.insertvertexinface 13 #(0.5,0.0,0.5,0.0) вставить вершину на полигон по центру . если объект плоскость с одним полигоном то #(0.0,0.0,0.0,0.8) первое значение отсчет от вершины №2 в сторону полигона №3. второе значение от №4 к №1. третье значение от №3 к №2 и четвертое значение от №1 к №4.
p.divideface 13 #(0.5, 0.0,0.5,0.0) select:true разделить полигон, точка посередине.#(0.5, 0.1,0.5,0.1) в направлении одного ребра

p.collapse #face flags:1 коллапс подобъекта
p.slice [1,1,0.0] [0,0,0] flaggedfacesonly:false faceflags:1 режет модель в центре сверху по диагонали [1,1,0.8] [0,0,0] опускает верх
b.extrudefaces 5.0 faceflags:1 выдавливание полигона


b.extrudealongspline 3 faceflag:1
b.bevelfaces 3 4 faceflags:1 скос полигона
b.chamfervertices 5 open:false фаска выделенной вершины
////
b.bridgesegments=5
b.bridge sellevel:#face мост между полигонами
////

b.readytobridgeflagged sellevel:#face flag:1 возвращает true если заданный уровень и флаги готовы к соединению, иначе возвращает false

////
fn msf obj =(classof obj==sphere)
sel=pickobject message:"pick any saphere" filter:msf выбор объекта в сцене
format "you selected: %\n"
sel.name
////

Почемучкин

Активный участник
Рейтинг
7
Изменено: 1 #159
День добрый, Знатоки.

Подскажите, пожалуйста, почему результаты деления по модулю в python и в maxscript разные?
Например:
В python -25.5 % 2.25 дает 1.5.
В maxscript mod -25.5 2.25 дает -0.75.
Что я делаю не так и как сделать так, чтобы в maxscript получить такой же результат как в python?

UPD: Решил проблему с помощью данной функции:
fn modulus v d =
(
r = mod v d
if v < 0 then
(
r += d
)
return r
)
Теперь в maxscript получаю такой же результат как в python.

Илларион К

Пользователь сайта
Рейтинг
2
Роман Марк (Дефсток)Как сохранить другой вид скриптов mse , точнее они нужны на панельки но не в modifer list , попробовал из туда закинуть, при открытие макса, все скрипты выскакивают сами
Нашли как??