3DCenter.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Reply to this topicStart new topic
> 3-Point Rotate, Мало ли кому надо :)
Harh
сообщение 13/03/2019, 14:03
Сообщение #1


Мастер
Иконка группы

Группа: Пользователи
Сообщений: 1 379
Регистрация: 13/03/2006
Из: Челябинск, Россия
Пользователь №: 25 023



Всем привет... Мимокрокодил smile.gif

Набрел тут... Кто юзает скрипт 3Point Rotate от Серго, тот знает, что скрипт сей хороший, но малость бесявый - мешюшка лишняя появляется, в ней еще и минус иногда ставить надо вручную.

Встретился мне вариант, называется Reference Rotation. Делает то же самое, но не имеет глюка с проверкой направления поворота в этой лишней менюшке и имеет приятный бонус в виде пунктирной линии (ну там видно).

Рекомендую использовать скрипт, который не "Z_Axis_Fixed", потому как всё было бы хорошо, но "fixed" он по Z оси глобальной, а не вьюпортовой, т.е. поворачивать будет по Z только относительно "ландшафта". С обычным же, которые не "fixed" та же раздражающая фигня, что и с вариантом от Серго, что надо переключать 3D Snap на 2.5D, но тут уж что уж.

Инструкция:
1) Скачать (рекомендую reference_rotation_v1.0.ms), запустить через Run Script
2) Через Customize User Interface -> Toolbars в Категории Retouchaid найти оный, кинуть на панельку кнопкой
3) Чтобы сделать иконку стандартную Серговскую вместо текстовой, можно сделать следующее:
3а) Правой кнопкой по оной получившейся кнопке -> Edit Macro Script
3б) Заменить первую строку с "macroScript RotateRef buttonText: "Reference Rotation" category: "Retouchaid"" на "macroScript RotateRef buttonText: "Reference Rotation" category: "Retouchaid" Icon:#("sergoIcons",9)", сохранить скрипт
3в) Поместить в папку UI-In\Icons (UI\Icons на более старых версиях) приложенные bmp файлы, если их там нет
3г) Перезапустить Макс

У меня описанное в третьем пункте злобное колдунство вроде сработало. Надеюсь, буде оное заметит Серго, он не обидится на использование его иконок.

Пока замеченный мною минус только в том, что обязательно нужно проверять 3D на 2.5D Snap, иначе он честно развернет в объеме. Сергошный в этом плане сразу какой-то "randomize" делал, там видно, что не то, а тут можно и не заметить, если объекты находятся в близкой плоскости. Жаль, что автор не сделал гарантированную проверку по Z именно вьюпорта, а не глобальную, а мне, если честно, вникать сейчас лень, т.к. я в скриптах плохо.
Прикрепленные файлы
Прикрепленный файл  sergoIcons_16a.bmp ( 10,6 килобайт ) Кол-во скачиваний: 285
Прикрепленный файл  sergoIcons_16i.bmp ( 14,12 килобайт ) Кол-во скачиваний: 263
 
Go to the top of the page
 
+Quote Post
Babuinische
сообщение 13/03/2019, 15:18
Сообщение #2


психомазохист
Иконка группы

Группа: Пользователи
Сообщений: 4 418
Регистрация: 16/10/2012
Из: Восточная Африка - Маисовое поле
Пользователь №: 86 591



жалко тут лайкать нельзя =)
Go to the top of the page
 
+Quote Post
Harh
сообщение 18/09/2019, 13:53
Сообщение #3


Мастер
Иконка группы

Группа: Пользователи
Сообщений: 1 379
Регистрация: 13/03/2006
Из: Челябинск, Россия
Пользователь №: 25 023



Мимокрокодил-2: Возвращение мимокрокодила smile.gif

Опять же, мало ли кому. Из интереса поковырялся в этом скрипте, сделал фичу, чтобы при использовании стандартных "плоских" видов он всегда поворачивал в плоскости сетки, а не в "3D", чтобы постоянно не переключать с 3D на 2.5D. При этом в перспективе он будет поворачивать именно в объеме, если не включено 2.5D

Обращаю внимание, что первая строчка, где RotateRef buttonText и т.д., там уже поправленный вариант на иконку от Sergo Script Pack, о чем я выше писал, к тому, что если по какой-то причине это "изменение" не нужно, первую строчку не заменяйте
Код
macroScript RotateRef buttonText: "Reference Rotation" category: "Retouchaid" Icon:#("sergoIcons",9)
(
on isEnabled return
(
    selection.count > 0
)
on execute do
(
    fn compareFN a b = (
        if a==b then (
            messagebox "This point have to be different then pivot point!"
            return false
        )
        else return true
    )--end fn

    relPt = #()

    p3A = pickpoint prompt:"Pick pivot point:" snap: #3D
    if (classof p3A)==point3 then
    (
        p3B= pickpoint prompt:"Pick reference point:" snap: #3D rubberBand: p3A
        if (classof p3B)==point3 and (compareFN p3A p3B) then
        (
            p3C = pickpoint prompt:"Pick reference point:" snap: #3D rubberBand: p3A
            if (classof p3C)==point3 and (compareFN p3A p3C) then
            (
                if viewport.getType()==#view_top or viewport.getType()==#view_bottom then
                    (
                        p3A=p3A*[1,1,0]
                        p3B=p3B*[1,1,0]
                        p3C=p3C*[1,1,0]
                    )
                if viewport.getType()==#view_front or viewport.getType()==#view_back then
                    (
                        p3A=p3A*[1,0,1]
                        p3B=p3B*[1,0,1]
                        p3C=p3C*[1,0,1]
                    )
                if viewport.getType()==#view_left or viewport.getType()==#view_right then
                    (
                        p3A=p3A*[0,1,1]
                        p3B=p3B*[0,1,1]
                        p3C=p3C*[0,1,1]
                    )
                relPt=#((p3B - p3A), (p3C - p3A))
                --counting angel relatively to the beginning of coordinate system
                abAngle = acos (dot (normalize relPt[1]) (normalize relPt[2]))
                rotMatrix = arbAxis (cross (normalize relPt[1]) (normalize relPt[2]))
                rotMatrix.row4 = p3A
                for i in selection do
                (
                    if (isValidNode i) and (classof i) != Dummy then ( --dummy is for groups; alternative exclution is - (superclassof i) != helper
                    in coordsys rotMatrix about rotMatrix rotate i abAngle z_axis
                    )
                )--end for
            )--end if p3C
        )--end if p3B
    )--end if p3A
)--end on execute
)--end macroscript
Go to the top of the page
 
+Quote Post
ne-cola
сообщение 18/09/2019, 14:06
Сообщение #4


Знаток
Иконка группы

Группа: Пользователи
Сообщений: 278
Регистрация: 02/05/2010
Из: РФ
Пользователь №: 78 372



нужная фича, пасиба... drinks.gif
Go to the top of the page
 
+Quote Post
Harh
сообщение 20/09/2019, 23:26
Сообщение #5


Мастер
Иконка группы

Группа: Пользователи
Сообщений: 1 379
Регистрация: 13/03/2006
Из: Челябинск, Россия
Пользователь №: 25 023



"А ты всё, холоп, не уймешься!" biggrin.gif

Решил сделать еще немного более рабочую версию. Взял метод взятия точек у Серго (у него взятие точек не создает проблем навигации), приписал это в в остальном работающий скрипт от Retouchaid, добавил показывающую "куда-чего" желтую линию. В этом виде немного подглюкивает Undo в случае, если нажатия точек прерваны каким-то замороченным образом, я не уловил пока. Но если кто-то хочет протестировать, вот тут код... Первая строчка класса макросткрипта, ее можно не копировать, оставив первую строчку старую, т.к. я поменял для порядка название, потому придется кнопку заново добавлять на панель. И рекомендую, понятно, бэкап исходного файла сделать для порядка. Также приложил видео, демонстрирующее работу. Вариант все еще не идеальный в сравнении с каноничным, когда и линии пунктирами, и арка рисуется, и вбить на клавиатуре можно, и объекты в процессе прям поворачиваются, но изучать макскрипт до этой меры, у меня сейчас тупо времени на это нет, так что за неимением гербовой... smile.gif

Короче, в сравнении с предыдущей версией, где просто подправлены 2.5D/3D снапы, тут уже есть не 100%-ая стабильность в работе, потому на свой страх и риск и всё такое smile.gif

Код
macroScript RotateRefPlus buttonText: "Reference Rotation Plus" category: "Retouchaid" Icon:#("sergoIcons",9)
(
global pickedPoint
on isEnabled return
(
    selection.count > 0
)

tool pickOnePoint
    (
        on mousePoint click_no do
        (
            if click_no == 1 then
            (
                pickedPoint = worldPoint
            )
        )
    )

tool pickTwoPoint
    (
        on freeMove do
        (
                ss=getNodeByName "SpecLine515"
                setKnotPoint ss 1 2 worldpoint
                updateshape ss
        )
        on mousePoint click_no do
        (
            if click_no == 1 then
            (
                pickedPoint = worldPoint
            )
        )
    )
    
on execute do
(
    fn compareFN a b = (
        if a==b then (
            messagebox "This point have to be different then pivot point!"
            undo off
            (
                ss=getNodeByName "SpecLine515"
                if ss !=undefined then delete ss
            )
            return false
        )
        else return true
    )--end fn

    fn drawLineBetweenTwoPoints pointA pointB =
    (
    undo off
        (
        local ss = SplineShape pos:pointA
        addNewSpline ss
        addKnot ss 1 #corner #line PointA
        addKnot ss 1 #corner #line PointB
        ss.name="SpecLine515"
        ss.showFrozenInGray = false
        ss.thickness = 2
        Freeze ss
        updateShape ss
        )
    )
    
    relPt = #()
    pick_result = startTool pickOnePoint numPoints:1
    p3A = pickedPoint
    if (classof p3A)==point3 then
    (
        pick_result = startTool pickOnePoint numPoints:1
        p3B=pickedPoint
        if (classof p3B)==point3 and (compareFN p3A p3B) then
        (
            undo off
                (
                newSpline = drawLineBetweenTwoPoints p3A p3B
                ss=getNodeByName "SpecLine515"
                ss.wirecolor = Yellow
                updateshape ss
                pick_result = startTool pickTwoPoint numPoints:1
                p3C=pickedPoint
                )
            if (classof p3C)==point3 and (compareFN p3A p3C) then
            (
                if viewport.getType()==#view_top or viewport.getType()==#view_bottom then
                    (
                        p3A=p3A*[1,1,0]
                        p3B=p3B*[1,1,0]
                        p3C=p3C*[1,1,0]
                    )
                if viewport.getType()==#view_front or viewport.getType()==#view_back then
                    (
                        p3A=p3A*[1,0,1]
                        p3B=p3B*[1,0,1]
                        p3C=p3C*[1,0,1]
                    )
                if viewport.getType()==#view_left or viewport.getType()==#view_right then
                    (
                        p3A=p3A*[0,1,1]
                        p3B=p3B*[0,1,1]
                        p3C=p3C*[0,1,1]
                    )
                relPt=#((p3B - p3A), (p3C - p3A))
                --counting angel relatively to the beginning of coordinate system
                abAngle = acos (dot (normalize relPt[1]) (normalize relPt[2]))
                rotMatrix = arbAxis (cross (normalize relPt[1]) (normalize relPt[2]))
                rotMatrix.row4 = p3A
                    undo off (delete ss)
                    
                
                    for i in selection do
                        (
                        if (isValidNode i) and (classof i) != Dummy then ( --dummy is for groups; alternative exclution is - (superclassof i) != helper
                        in coordsys rotMatrix about rotMatrix rotate i abAngle z_axis
                        )
                    )--end for
            )--end if p3C
        )--end if p3B
    )--end if p3A

    
    undo off
        (
        ss=getNodeByName "SpecLine515"
        if ss !=undefined then delete ss
        )
    
    )--end on execute
)--end macroscript

Прикрепленные изображения
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Babuinische
сообщение 21/09/2019, 12:51
Сообщение #6


психомазохист
Иконка группы

Группа: Пользователи
Сообщений: 4 418
Регистрация: 16/10/2012
Из: Восточная Африка - Маисовое поле
Пользователь №: 86 591



кажется, канонично в Синеме
Go to the top of the page
 
+Quote Post
industrialudaf
сообщение 22/09/2019, 16:38
Сообщение #7


▄▀▄▀▄▀▄▀▄
Иконка группы

Группа: Пользователи
Сообщений: 1 551
Регистрация: 31/10/2009
Пользователь №: 73 967



теперь придумай, чтоб не только ориентировалось, но и масштабировалось по третей точке.
И делало копию)))
Go to the top of the page
 
+Quote Post
Harh
сообщение 22/09/2019, 19:31
Сообщение #8


Мастер
Иконка группы

Группа: Пользователи
Сообщений: 1 379
Регистрация: 13/03/2006
Из: Челябинск, Россия
Пользователь №: 25 023



Цитата(industrialudaf @ 22/09/2019, 18:38) *
теперь придумай, чтоб не только ориентировалось, но и масштабировалось по третей точке.
И делало копию)))


Не-не-не... Когда же я работать буду, я на это-то убил часов 8, блин )) Это надо хорошо максскрипт знать, а то за каждую ерунду гуглить, почему оно не работает. Вот просто из "потрындеть" - решил сделать линию, чтобы рисовалась, когда ты точки кликаешь. Нашел, как создавать линию между точками. Прекрасно. Надо найти, как вершину двигать, там все по-другому, нежели если двигать объект. Нашел. Только еще пришлось посмотреть на тему, чтобы он объект не только перерисовывал у себя там, но и на экране обновлял. Как сделать, чтобы оно бегало, когда я мышку двигаю, а не только когда кликаю. Нашел. Не работает. Убил час, выяснил, что у меня не эта функция вообще вызывается и вообще "Гена, мы не в тот подъезд зашли". Линия рисуется, цвет норм, красота... Только она, скотина, начала привязываться сама к себе, мол вершина линии как раз на курсоре, к ней привяжемся, потому при привязке к вертексам она постоянно привязывается сама к себе. Не, ну мы же умные, мы ее сделаем фризенной (какая простая команда, тупо Freeze и имя объекта). Она перестала привязываться, но стала серой. Ищем, как убрать галочку "Show frozen as gray". Находим, работает. Только в Undo появляется теперь не только "Undo RotateRefPlus", но и еще один пункт дальше "Undo MaxScript"... Нашел фишку, как делать все эти создания объектов и двигания вершин без записи в буфер Undo функцией Undo Off (). Пошерстил скрипт, все равно "Undo Maxscript", но теперь при нажатии Undo любой макс, что 2010, что 2018, вылетает с ошибкой. Интуитивно догадываясь, в чем дело, понатыкал Undo Off в кучу мест, помогло и стало нормально работать. Вах! Но блин, сколько времени убито и вообще, тяжела и неказиста жизнь простого... программиста. Потому как надо максскрипт уже знать немного, а не переводить все на уровне "My name is, I live in" smile.gif Потому я знаю, как надо, вот прям хорошо знаю, но писать это - никакого времени не напасешься. Сейчас я сделал тот вариант, который уже удобный и рабочий. Хороший и годный вариант, где линия еще и жирной рисуется, и арка, и вбить угол можно, и объекты поворачиваются... Увы мне. Это не долго, это для меня ОЧЕНЬ долго smile.gif

Кстати, набор кад функций типа вот этой вообще можно, блин, продавать, но и продавец из меня, и программировать их я буду весь следующий год, за это время еще народ в блендеры слиняет, т.к. там все развивается, а тут тупо загнивает, почивая на лаврах 2000 года.
Go to the top of the page
 
+Quote Post
Babuinische
сообщение 23/09/2019, 07:56
Сообщение #9


психомазохист
Иконка группы

Группа: Пользователи
Сообщений: 4 418
Регистрация: 16/10/2012
Из: Восточная Африка - Маисовое поле
Пользователь №: 86 591



Цитата
Но блин, сколько времени убито и вообще

ни фига ты не убил. Только насладился и ментально оздоровился
Go to the top of the page
 
+Quote Post
temp-64GTX
сообщение 25/09/2019, 11:07
Сообщение #10


Хренодёр
Иконка группы

Группа: Пользователи
Сообщений: 1 001
Регистрация: 02/06/2007
Из: Новосибирск
Пользователь №: 53 785



Цитата(Harh @ 21/09/2019, 03:26) *
Короче, в сравнении с предыдущей версией, где просто подправлены 2.5D/3D снапы, тут уже есть не 100%-ая стабильность в работе, потому на свой страх и риск и всё такое

Прикольная штуковина, пригодится, спасибо.
Go to the top of the page
 
+Quote Post
Harh
сообщение 25/09/2019, 12:21
Сообщение #11


Мастер
Иконка группы

Группа: Пользователи
Сообщений: 1 379
Регистрация: 13/03/2006
Из: Челябинск, Россия
Пользователь №: 25 023



Цитата(temp-64GTX @ 25/09/2019, 13:07) *
Прикольная штуковина, пригодится, спасибо.


Пожалуйста... Т.к. тут был занят по другим делам, до макса почти не добирался, но вродь никаких явных косяков с последней версией не обнаружил. Потестил в 2010 и в 2018. Разве что в Перспективе в режиме 2,5D выяснилось, что за точки неправильно цепляется, когда они не на сетке лежат. На практике, думаю, даже вникать не буду, т.к. хоть это и некорректно, но я вряд ли в таком режиме оным хоть раз воспользуюсь, разве что случайно... И что-то мне подсказывает, что остальным тоже нужно будет или в проекциях получать поворот в плоскости одинаково в режиме 2,5D/3D, или в перспективе поворот в объеме в 3D.
Go to the top of the page
 
+Quote Post
ne-cola
сообщение 27/09/2019, 09:26
Сообщение #12


Знаток
Иконка группы

Группа: Пользователи
Сообщений: 278
Регистрация: 02/05/2010
Из: РФ
Пользователь №: 78 372



А как на счет выравнивания объекта по четырем точкам ? 53[1].gif
Go to the top of the page
 
+Quote Post
Harh
сообщение 27/09/2019, 18:17
Сообщение #13


Мастер
Иконка группы

Группа: Пользователи
Сообщений: 1 379
Регистрация: 13/03/2006
Из: Челябинск, Россия
Пользователь №: 25 023



Это как это по четырем? Направление и разворот по своей оси что ли?
Go to the top of the page
 
+Quote Post
ne-cola
сообщение 29/09/2019, 19:30
Сообщение #14


Знаток
Иконка группы

Группа: Пользователи
Сообщений: 278
Регистрация: 02/05/2010
Из: РФ
Пользователь №: 78 372



Может, конечно, я чего то не понимаю в данном плагине, и он позволяет это делать... Попробую объяснить. Для полного контроля объекта в пространстве не хватает ещё одной или даже двух контрольных точек. Например, в Normal Align, происходит выравнивание объекта в плоскость другого по принципу сопланарности. Но для полного контроля не хватает возможности задать нужный вектор, который укажет угол поворота объекта вокруг общей оси нормалей. В нашем случае, четвертая точка могла бы дополнительно показать объекту как его вращать/лепить к плоскости, опираясь на выбранную ранее ось. 1-я точка задает центр угла выравниваемого объекта, 2-я задает базовую линию, 3-я указывает требуемое направление для первых двух. 4-я могла бы задать плоскость, которая по ранее образовавшейся оси бы развернула объект. 5-я указала бы на искомую плоскость. Как то так. 53[1].gif
Go to the top of the page
 
+Quote Post
Harh
сообщение 29/09/2019, 20:39
Сообщение #15


Мастер
Иконка группы

Группа: Пользователи
Сообщений: 1 379
Регистрация: 13/03/2006
Из: Челябинск, Россия
Пользователь №: 25 023



Контекст я понял: чтобы выравнивание делать именно в объеме, а не в плоскости. Т.е. чтобы не только объект смотрел на точку на другом объекте, а еще и был повернут в направлении четвертой точки.

Суть: этого тут нет, это вообще отдельный должен быть инструмент. Причем это даже не "4-Point Rotate", потому как, насколько я понимаю, там нужно будет целых 5 точек, а не 4.

Да, такой сделать можно, и да, можно сделать из этого как еще один отдельный инструмент. Но нет, я его сейчас делать не буду... Банально нет времени разбирать максскрипт и требуемую на это математику. Переделку того скрипта я делал под себя, потому как реально нужно было именно классически кадовский трехтотчечный поворот, но сейчас еще четырех-шести часов на разработку нового скрипта у меня тупо нет. Да, для этого на самом деле нужно минут 15, но только если знаешь как. Я сейчас не знаю.

Поработал с этим скриптом, пока работает стабильно кроме косяка с 2,5D во вьюпорте, а чем я выше упоминал. Даже проблем с undo пока не было.

Сообщение отредактировал Harh - 29/09/2019, 20:41
Go to the top of the page
 
+Quote Post
Bots
сообщение Системное сообщение






2 страниц V   1 2 >
Reply to this topicStart new topic

1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 17/04/2024 - 00:38