Render.ru

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

igorznag

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

Почемучкин

Активный участник
Рейтинг
7
Каким способом вы получили координаты 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
)
В какой системе координат (World или Parent) вы получили координаты Position, Rotation, Scale?
Думаю, именно здесь и кроется проблема. Я новичок в максскрипте и многое еще не знаю\не понимаю. Просто пытаюсь смотреть скрипты других авторов и гуглить, но это не всегда дает нужный мне результат.
У вас есть информация о родителях/детей костей?
Иерархия костей, и названия костей, имеется. Вот краткий обзор возможностей моего скрипта:
Предоставьте файл с координатами Position, Rotation, Scale, чтобы тестировать скрипт.
Вам нужен файл самой модели и скелета, если я правильно вас понял?
Объясните подробнее. Лучше в Skype: igorznag2012
У меня нет ни видео камеры, ни микрофона, поэтому видео- или голосовой сеанс не получится провести. Если вы согласны на переписку и готовы потратить свое личное время на такого незнайку как я, то скажите в какое время для вас это будет удобно.
 

igorznag

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

Почемучкин

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

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

Penter

Пользователь сайта
Рейтинг
4
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
Добавил 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
nodeTM ведь используется только в mouse tool. А как смещать уже созданный экземпляр ?
Объясните подробнее. Лучше в Skype: igorznag2012
Для чего вам нужен этот объект?
Вместо SimpleObject можно использовать объект Cone с модификатором Attribute Holder.
Используем контроллеры Position Consrtraint и LookAt Consrtraint.
Для вас подходит такой вариант?

 

Вложения

Geekson

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

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

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

igorznag

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

 

d1myan

Пользователь сайта
Рейтинг
2
Добрый день всем! Наткнулся на очень интересный скрипт, который делает переключение видов вьюпорта по аналогии 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
Ребята, подскажите команду LayerManager, чтобы поместить "слой1" внутрь "слоя2" скриптом.
(функция доступная в новых версиях макса)
Код:
(
    local l1 = LayerManager.getLayerFromName "Layer001"
    local l2 = LayerManager.getLayerFromName "Layer002"
    l1.setParent l2
)
 
Симпатии: kuirp

kuirp

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

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

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
День добрый, Знатоки.

Подскажите, пожалуйста, почему результаты деления по модулю в 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.
 
Последнее редактирование:
Симпатии: kuirp
Сверху