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

Ориентация по полигону

Тема в разделе "Моделирование", создана пользователем Staglaitor, 14 апр 2015.

Модераторы: He77ga, Артер
  1. Staglaitor

    Staglaitor Знаток

    С нами с:
    31.01.2007
    Сообщения:
    77
    Симпатии:
    0
    Баллы:
    36
    Здравствуйте

    Как pivot выровнять по полигону. По нормали полигона. Я знал сложный метод, но он тогда надоел, - может есть простой. Спасибо.
     

    Вложения:

  2. FrenzyWalker

    FrenzyWalker Пользователь сайта

    С нами с:
    08.03.2015
    Сообщения:
    8
    Симпатии:
    13
    Баллы:
    3
    На ум приходят такие варианты:
    1) если нужно только выровнять по полигону, то можно пивот просто перетянуть с привязкой по фэйсам, точкам, центрам фэйсов и т.д.
    2) если нужно выровнять по нормали, то создать на поверхности полигона например цилиндр (с поставленой галочкой "AutoGrid"), а затем выровнять нужный тебе пивот по пивоту построенного цилиндра в режиме координат Local.
    как-то так.
     
  3. Staglaitor

    Staglaitor Знаток

    С нами с:
    31.01.2007
    Сообщения:
    77
    Симпатии:
    0
    Баллы:
    36
    Спасибо, что такое я делал. Но проблемма остаёться. Например у нас куб в пространстве и повёрнуть на произвольный угол. Да мы момжем, как вы написали сориентировать по нормали, но оси пивота лежащие на поверхности расположены как угодно. как их сориентировать по квадрату этого куба. У пивота ведь 3 направляющие
     
  4. INCUS

    INCUS Знаток

    С нами с:
    03.08.2010
    Сообщения:
    857
    Симпатии:
    30
    Баллы:
    29
    А если поставить две кости по двум рёбрам куба, а потом сориентировать нужные оси Pivot по
    костям?
     
  5. FrenzyWalker

    FrenzyWalker Пользователь сайта

    С нами с:
    08.03.2015
    Сообщения:
    8
    Симпатии:
    13
    Баллы:
    3
    развивая данный метод:)
    создаем цилиндры на других гранях куба и ориентируем наш пивот относительно их только по нужной оси.

    с кубом вроде как работает:)
     
  6. Royal Ghost

    Royal Ghost Мастер

    С нами с:
    17.03.2001
    Сообщения:
    305
    Симпатии:
    41
    Баллы:
    214
    Из нормали можно получить одну из трех осей, нужно определится откуда брать две остальные. Скорее всего простым решением будет скрипт который по трем точкам будет выставлять pivot.
    Что то типа такого но для pivot ...

     
  7. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Выделяем один полигон. Запускаем скрипт.
    В новом окне нажимаем кнопку Align.
    Код:
    try destroydialog test catch()
    rollout test "Test" width:80 height:40
    (
    label lb_edge_id "" pos:[50,5] width:45 visible:false
    button btn_align "Align" pos:[5,5] width:65 height:30
    fn AlignPivotTo Obj Trgt =
    (
    if classOf Trgt != matrix3 then Trgt = Trgt.transform
    local ChldTms = in coordSys Trgt ( for Chld in Obj.children collect Chld.transform )
    local TmScale = scaleMatrix Obj.objectOffsetScale
    local TmRot = Obj.objectOffsetRot as matrix3
    local TmPos = transMatrix Obj.objectOffsetPos
    local TmOffset = TmScale * TmRot * TmPos
    TmOffset *= obj.transform * inverse Trgt
    Obj.transform = Trgt
    Obj.objectOffsetPos = TmOffset.translation
    Obj.objectOffsetRot = TmOffset.rotation
    Obj.objectOffsetScale = TmOffset.scale
    for i = 1 to Obj.children.count do Obj.children[i].transform = ChldTms[i] * inverse Trgt * Obj.transform
    )--fn AlignPivotTo Obj Trgt =
    
    on btn_align pressed do
    (
    undo on
    (
        if selection.count ==1 then
        (
            obj=selection[1]; co=obj.baseobject
            if classof co==Editable_Poly then
            (
                fs=(polyop.getfaceselection obj) as array;
                if fs.count==1 then
                (
                    f=fs[1]; facePos=polyop.getFaceCenter co f node:obj
                    faceNormal = polyop.getfacenormal co f node:obj
                    fv=polyop.getFaceVerts co f;
                    v1=polyop.getVert co fv[1] node:obj;v2=polyop.getVert co fv[2] node:obj;
                    axis_x=normalize (v1-v2)
                    es_ba=(polyop.getedgeselection obj); es=es_ba as array;
                    if es.count==1 then
                    (
                        ef_ba=polyop.getedgesusingface co f;
                        if (es_ba*ef_ba).numberset==1 then
                        (
                            ev=polyop.getedgeverts co es[1]
                            v1=polyop.getVert co ev[1] node:obj;v2=polyop.getVert co ev[2] node:obj;
                            axis_x=normalize (v1-v2)
                        )--if (es_ba*ef_ba).numberset==1 then
                    )--if es.count==1 then
                    axis_y=normalize ( cross axis_x faceNormal)
                    theMatrix= matrix3 axis_x axis_y faceNormal facePos
                    if theMatrix.determinantsign==-1 then
                    theMatrix= matrix3 axis_x -axis_y faceNormal facePos; AlignPivotTo obj theMatrix
                )--if fs.count==1 then
            )--if classof co==Editable_Poly then
        )--if selection.count ==1 then
    )--undo on
    )--on btn_apply pressed do
    ); createdialog test
    Чтобы запустить скрипт нужно:
    1. Создаем текстовый файл (NotePad) и копируем код (текст) скрипта.
    2. Сохраняем текстовый файл с названием "test.ms"
    3. В главное меню MaxScript выбираем пункт Run Script. Выбираем файл "test.ms"
     
  8. Staglaitor

    Staglaitor Знаток

    С нами с:
    31.01.2007
    Сообщения:
    77
    Симпатии:
    0
    Баллы:
    36
    Шикарно. Вы сами написали скрипт или места знать надо? :)
     
  9. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Я сам написал скрипт для вашего случая.
     
Модераторы: He77ga, Артер

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