Render.ru

Проблема с Local системой координат

EpUlRuOsPA

Пользователь сайта
Рейтинг
2
#1
Помогите разобраться!
Изучаю Max 2016. Столкнулся с такой проблемой: после вращения полигона иногда смещается его локальная система координат (примеры на картинке).
Последовательность моих действий:
1. создаю цилиндр.
2. преобразую его в Editable Poly
3. в режиме редактирования полигонов выделяю один или два или три полигона, выбираю Local систему координат и выдавливаю экструдом. (на картинке обозначено единичкой). На этом этапе все отлично - оси X,Y,Z направлены перпендикулярно соответствующим плоскостям полигона.
4. далее вращаю полигон(ы) при выбранном Local (системы координат) и происходит волшебство: локальная ось начинает вращаться либо против часовой стрелки (на картинке цмфра два), либо по часовой стрелке (цифра три), или остается в правильном положении (цифра четыре).

Нет никакой системы появления этого явления. Смещение оси происходит внезапно, направление смещения ни к чему не привязано (ни к глобальной системе координат, ни к видовой, ни т.д.). Очень мешает, т.к. дальнейшая работа с полигонами превращается в пытку

Возможно ли избавиться от этого?
Как вернуть положение локальной оси в правильное направление?
 

Вложения

igorznag

Мастер
Рейтинг
100
#2
Как вернуть положение локальной оси в правильное направление?
Что-то похожее можно сделать с помощью MaxScript.
Простой пример для частного случая:
Выделяем один полигон базового объекта Editable Poly.
Запускаем скрипт. В новом окне нажимаем кнопку Align.
Код:
try destroydialog test catch()
rollout test "Test" width:80 height:40
(
button btn_align "Align" pos:[5,5] width:65 height:30
on btn_align pressed do
(
   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)
                axis_y=normalize ( cross axis_x faceNormal)
                theMatrix= matrix3 axis_x axis_y faceNormal facePos
                if theMatrix.determinantsign==-1 then
                t=matrix3 axis_x -axis_y faceNormal facePos;
                try delete $Local_igorznag catch ()
                d=dummy();d.name="Local_igorznag";freeze d; hide d
                d.transform=t; toolmode.coordsys d
                completeredraw()
            )--if fs.count==1 then
        )--if classof co==Editable_Poly then
    )--if selection.count ==1 then
)--on btn_apply pressed do
); createdialog test
Чтобы запустить скрипт нужно:
1. Создаем текстовый файл (NotePad) и копируем код (текст) скрипта.
2. Сохраняем текстовый файл с названием "test.ms"
3. В главное меню MaxScript выбираем пункт Run Script. Выбираем файл "test.ms"
 

EpUlRuOsPA

Пользователь сайта
Рейтинг
2
#3
Что-то похожее можно сделать с помощью MaxScript.
Про этот способ я прочитал на этом форуме, но он не помогает, по крайней мере, в 2016 максе.

Данный глюк происходит только при повороте полигона. Причем, если поворачивать полигон по оси Z, то вращается только полигон, а локальная система остается в прежней ориентации. при повороте по оси Y положение локалки корректно, по оси X происходит ее поворот либо по, либо против часовой стрелки, как на изображении в первом сообщении. Более того, все тоже самое происходит при вводе угла поворота на клавиатуре.

Не помогло и обновление до SP1.

Просьба к тем, кто пользуется максом 2016, проверить свою программу на подобное поведение. Не знаю, в каком направлении двигаться - откатываться на предыдущую версию или...
 

Вложения

igorznag

Мастер
Рейтинг
100
#4
Про этот способ я прочитал на этом форуме, но он не помогает
Предоставьте полностью скрин программы 3ds max, чтобы я увидел что вы выбираете полигон у базового объекта Editable Poly, а не у модификатора Edit Poly.

1.jpg ____ 2.jpg
Данный глюк происходит только при повороте полигона.
Это не глюк. Так работают все версии программы 3ds max. Так должно быть.
Как вернуть положение локальной оси в правильное направление?
Система координат Local для выделенного полигона означает только следующее: ось Z перпендикулярна плоскости полигона.
"Правильное направление" означает совсем другое. Поэтому используем MaxScript.
 

Royal Ghost

Мастер
Рейтинг
221
#5
igorznag прав, это не баг это нормальное поведение 3ds max. Полигоны не имеют параметра вращения, по этому локальные оси нужно вычислить. igorznag предлагает просто другой алгоритм вычисления локальных осей. Но даже он не очень удобен когда вы имеете дело с полигонами образующими трапеции.
 

EpUlRuOsPA

Пользователь сайта
Рейтинг
2
#6
Предоставьте полностью скрин программы 3ds max, чтобы я увидел что вы выбираете полигон у базового объекта Editable Poly, а не у модификатора Edit Poly.
Спасибо за ответ. Вот мои скрины. Скрипт не помогает именно в Editable Poly в максе 2016
 

Вложения

Сверху