Render.ru

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

Staglaitor

Мастер
Рейтинг
113
#1
Здравствуйте

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

Вложения

FrenzyWalker

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

Staglaitor

Мастер
Рейтинг
113
#3
Спасибо, что такое я делал. Но проблемма остаёться. Например у нас куб в пространстве и повёрнуть на произвольный угол. Да мы момжем, как вы написали сориентировать по нормали, но оси пивота лежащие на поверхности расположены как угодно. как их сориентировать по квадрату этого куба. У пивота ведь 3 направляющие
 

INCUS

Знаток
Рейтинг
29
#4
А если поставить две кости по двум рёбрам куба, а потом сориентировать нужные оси Pivot по
костям?
 

FrenzyWalker

Активный участник
Рейтинг
8
#5
Спасибо, что такое я делал. Но проблемма остаёться. Например у нас куб в пространстве и повёрнуть на произвольный угол. Да мы момжем, как вы написали сориентировать по нормали, но оси пивота лежащие на поверхности расположены как угодно. как их сориентировать по квадрату этого куба. У пивота ведь 3 направляющие
развивая данный метод:)
создаем цилиндры на других гранях куба и ориентируем наш пивот относительно их только по нужной оси.

с кубом вроде как работает:)
 
Рейтинг
229
#6
Из нормали можно получить одну из трех осей, нужно определится откуда брать две остальные. Скорее всего простым решением будет скрипт который по трем точкам будет выставлять pivot.
Что то типа такого но для pivot ...

 

igorznag

Мастер
Рейтинг
103
#7
Выделяем один полигон. Запускаем скрипт.
В новом окне нажимаем кнопку 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"
 
Сверху