Разное

3Ds max окно: Окно в 3D Max. Уроки для начинающих

Работа с окнами проекций — DigiPortfoolio OÜ печать на масках в Нарве

Обычно для того чтобы узнать свое положение в пространстве, достаточно видеть сцену с двух направлений. В 3ds max вы можете видеть сцену сразу с четырех направлений, назначив разные виды каждому окну проекции.

Окна проекций могут показать предмет с четырех направлений сразу
Чтобы увидеть детали сцены, следует увеличить окно проекции до размера рабочей области. Вы также можете изменить структуру и пропорции окон проекций.
Характерными элементами всех окон проекций являются сетка (для перемещения), заголовок (для идентификации), оси координат (для ориентации), рамка (ограничивает окно) и фон (расположен сзади сцены).


 
Элементы окна проекции

Вы можете изменить эти элементы, включая и отключая их или изменяя присущие им цвета.
Прежде чем каким-либо образом изменить окно проекции, вы должны его выделить, или активизировать. При активизации вы не только сообщаете программе, какое окно проекции следует изменить, но и устанавливаете пространственную ориентацию для создания, изменения и визуализации объектов.

Активизация окна проекции

Щелкните правой кнопкой мыши в неактивном окне проекции, имеющем черную рамку.
Окно проекции станет активным, а его рамка — желтой.

Смена окна проекции

Щелкните правой кнопкой мыши по названию окна проекции. Появится контекстно-зависимое меню этого окна.
В меню Views выберите название окна проекции, которое хотите отобразить на экране.

Клавиатурные комбинации для управления окнами проекций

Клавиатурная комбинация  Название команды/вида
Front View (Вид спереди)
V+K     Back View (Вид сзади)
V+R     Right View (Вид справа)
L     Left View (Вид слева)
Т     Top View (Вид сверху)
В     Bottom View (Вид снизу)
Р     Perspective User View (Перспективный пользовательский вид)
U     Orthogonal User View (Ортогональный пользовательский вид)
C     Camera View (Вид из камеры)
Shift+4  Spot/Directional Light View (Вид из прожектора/ направленного источника)
G   Hide Grids Toggle (Скрыть/показать сетку)
Alt+W  Maximize Viewport Toggle (Растянуть/уменьшить активное окно проекции)
D Disable Viewport (Отключить окно проекции)
Shift+Z   Undo Viewport Operation (Отменить действие с окном проекции)
Shift+Y   Redo Viewport Operation (Повторить действие с окном проекции)
Alt+B     Viewport Background Dialog (Настройка фонового изображения)
Alt+Shift+ +Ctrl+B   Update Background Image (Обновить фоновое изображение)

Изменение размещения структуры окон проекций

В меню View выбираем Viewport Configuration (Конфигурация окна проекции), щелкните по вкладке Layout (Структура). Появится соответствующая панель.

Панель Layout диалогового окна Viewport Configuration содержит 14 вариантов отображения структуры окон проекций

Щелкните по какому-нибудь образцу в верхней части панели. В нижней части панели появится предварительная схема нового расположения окон.
Щелкните по схеме, чтобы присвоить вид каждому окну проекции.

Щелкните по предварительной схеме, чтобы открыть меню, из списка которого вы выберете вид для каждого окна проекции

Щелкните по кнопке ОК. Появится новая структура.

Изменение размеров окна проекции

1. Переместите курсор в центр экрана, к пересечению рамки всех четырех окон проекции, или поместите его между двумя окнами проекции.
2. Нажмите кнопку мыши и растяните окно проекции до нужного размера.

Растягивая рамки между окнами проекций, вы изменяете размер самих окон

Увеличение и уменьшение окна проекции

Щелкните по кнопке Min/Мах Toggle в правом нижнем углу программы. Активное окно проекции увеличится во всю область отображения.
Если окно проекции развернуто, то щелчок по кнопке Min/Мах Toggle вернет исходную структуру экрана.
Кнопке Min/Мах Toggle соответствует сочетание клавиш Alt+W.

Размещение изображения на заднем плане

1. Активизируйте окно проекции, на заднем плане (background) которого хотите поместить изображение.

2. Выберите команду Views => Viewport Background (Виды => Фон окна проекции) или нажмите Alt+B.
3. В диалоговом окне Viewport Background (Фон окна проекции) щелкните по кнопке Files.
4. В окне Select Image Background (Выбрать изображение фона) переместите курсор к изображению, которое хотите разместить на заднем плане.
5. Выделите его, щелкните по кнопке ОК.
6. В окне Viewport Background установите флажок Display Background (Отображать фон).
7. В группе Aspect Ratio (Пропорции сторон) установите переключатель для Match Viewport (размер изображения совпадет с размером окна проекции), Match Bitmap (изображение сохранит свой размер) или Match Rendering Output (изображение примет размеры, установленные в окне Render).
8. Щелкните по ОК. Изображение появится на заднем плане окна.

Изменение способа отображения окна проекции

Существует два различных визуализатора для отображения окон проекции: Interactive Viewport Renderer (Интерактивный визуализатор окон проекций) и ActiveShade (Интерактивный тонировщик).
Интерактивный визуализатор окон проекций используется при показе изображения непосредственно в окнах проекций. Он может отображать содержимое сцены в разных режимах качества. Режимы высокого качества используются для настройки освещения и материалов, так как содержат больше информации о цвете и освещенности поверхности. Режимы меньшего качества обычно применяются для моделирования и анимации, поскольку показывают структуру сцены и быстрее обновляются во время воспроизведения. Интерактивный визуализатор окон проекций очень быстр по сравнению с остальными визуализаторами, поэтому может менять информацию в окне проекции в реальном времени.

Режимы отображения Interactive Viewport Renderer:

  • Smooth (Сглаженный) — режим, использующий высокое качество.
    Цветовые переходы на поверхности получаются усреднением освещения в зависимости от расстояния до граней. Может отображать текстуру поверхности и затенение объекта, но обычно не показывает отбрасываемую тень;
  • Facets (Граненый) — использует средний уровень качества. Закрашивает грани объекта таким образом, что в пределах одной грани окраска не меняется, как если бы каждая из них была гранью драгоценного камня;
  • Wireframe (Каркасный) — использует низкий уровень качества, очерчивает стороны, трассируя только их углы;
  • Bounding Box (Габаритный контейнер) имеет самое низкое качество. Объект отображается в виде углов контейнера, в который он помещен.

Изменение режима отображения для окна проекции

1. Щелкните правой кнопкой мыши по заголовку окна проекции.
2. Выберите в меню режим отображения.

Переключение между режимами Wireframe и Smooth производится с помощью клавиши F3.
Включение/выключение режима Edged Faces производится с помощью клавиши F4.

ActiveShade использует два прохода для визуализации освещения, наложения теней и показа текстур поверхностей. Проход инициализации (initialization pass) помещает информацию о сцене в буфер. Проход обновления (update pass) берет информацию из буфера и меняет пикселы так, чтобы отразить изменения, произошедшие с материалами и освещением перед визуализацией.

Окна проекций, использующие метод ActiveShade для показа объектов, называются ActiveShade Viewports. Поскольку ActiveShade не может обрабатывать данные в реальном времени, в таких окнах визуализации нельзя перемещаться интерактивно.

Windows (Окна) в 3ds Max

Для построения окон на вкладке Create командной панели в разделе Geometry из выпадающего списка выберите группу объектов Windows.

В 3ds Max есть несколько типов окон. Все они перечислены в табл. 3.1. Как уже отмечалось, удобны эти окна тем, что если их строить правильно, то они сами прорубают оконные проемы в стенах, но только в стенах типа Wall (если стены построены другим способом, например экструзией, то вам придется самим пробивать проемы, используя булевы операции).

Встраивание окон

  • 1. Для того чтобы окно прорубило проем в стене, необходимо включить 3D-привязку к ребрам (Edge/Segment). Строится окно в последовательности: Ширина -> Глубина -> Высота
  • 2. Строить окно лучше на виде Тор, хорошенько увеличив масштаб в видовом окне.
  • 3. Привязавшись к внешней грани стены, нажимаете левую кнопку мыши.
  • 4. Удерживая ее нажатой, растягиваете на ширину окна.
  • 5. Отпускаете кнопку мыши и привязываетесь к внутренней грани стены (глубина окна).
  • 6. Делаете один щелчок левой кнопкой мыши и, не удерживая кнопку, двигаете мышь вверх (ширина окна).
    7. Делаете один щелчок левой кнопкой мыши (для закрепления высоты).
    8. Делаете щелчок правой кнопкой мыши (для выхода из режима построения).
  • 9. Скорее всего, окно будет находиться внизу стены. Поэтому вам нужно взять инструмент перемещения и поднять окно на необходимую высоту (лучше всего это делать на виде Front). При перемещении окна проем тоже будет перемещаться. Если при открытии окна проема не видно — значит окно построено неправильно. Удалите его и постройте заново.
  • 10. Можно скопировать построенное окно. Для этого возьмите инструмент перемещения и, удерживая нажатой клавишу <Shift>, сместите его в нужную сторону. При копировании окна будут пробивать проемы автоматически.
  • 11. Аналогичным образом постройте окна с противоположной и обратной стороны дома.

Настройка параметров окон

У всех типов окон примерно одинаковые настройки, рассмотрим их на примере окна типа Casement.

  • Height (Высота), Width (Ширина), Depth (Глубина) — в этих счетчиках устанавливаются размеры оконного блока.
  • В группе Frame (Рама) размеры балок оконной рамы задаются в счетчиках Horiz. Width (Ширина горизонтальных балок), Vert. Width (Ширина вертикальных балок) и Thickness (Толщина).
  • В группе Glazing (Стекло) параметр Thickness (Толщина) — счетчик для установки толщины стекла.

В группе Casements (Створки):

  • поле Panel Width (Ширина панелей) — задает ширину стеклянных панелей в каждой створке;
  • переключатели One (Одна), Two (Две) — устанавливают число створок в окне.

В группе Open Window устанавливается степень открытия створок окна (этой настройки нет у окна типа Fixed):

  • Flip Swing — флажок, позволяющий развернуть открытые створки в другую сторону.

[MaxPlus] родительское окно PySide для окна Max — 3ds Max

flo.ei

28 марта 2017 г. , 22:02 #1

Привет, ребята, мы разрабатываем окно MaxPlus/Pyside внутри 3dsMax. Но окно Pyside, которое мы создаем, всегда является отдельным окном, не привязанным к max, поэтому оно остается видимым, даже если мы, например, минимизируем max.

Теперь мы попробовали разные подходы к решению этой проблемы. лучшим рабочим решением был следующий фрагмент кода. Он работает почти идеально, но если вы переместите окно, оно сильно глючит, как вы можете видеть на скриншоте. вы знаете какое-нибудь решение этой проблемы?

заранее спасибо
Флориан

класс OpenWindow(QtGui.QMainWindow):
    def __init__(я, родитель=Нет):
        super(OpenWindow, self).__init__(родительский)
        WId=self.winId()
        если тип (WId).__name__ == 'PyCObject':
            из ctypes импортировать pythonapi, c_void_p, py_object
            pythonapi.PyCObject_AsVoidPtr.restype = c_void_p
            pythonapi.PyCObject_AsVoidPtr.
argtypes = [py_object] WId = pythonapi.PyCObject_AsVoidPtr(WId) MaxPlus.Win32.Set3dsMaxAsParentWindow(WId)


GPS

#2

Правильно ли работает окно, когда оно не подключено к максу? Симптомы выглядят так, будто верхний виджет вашего пользовательского интерфейса может быть экземпляром QWidget. У вас такая же проблема с QDialog или QMainWindow?

flo.ei

#3

Да, без него работает отлично. Это QMainWindow нет? «класс OpenWindow(QtGui.QMainWindow):»

Munkybutt

#4

Это может помочь:
Area by Autodesk

Пользовательский интерфейс PyQt в расширении 3ds Max 2014 | Блог 3ds Max | ОБЛАСТЬ от Autodesk

Поскольку Python появился с расширением 3ds Max 2014, одним из самых популярных запросов является создание пользовательского интерфейса с использованием PyQt или PySide, который хорошо работает с 3ds Max. это…

инстинкт-vfx

#5

[QUOTE=Munkybutt;26206]Это может помочь:
http://area.autodesk.com/blogs/chris/pyqt-ui-in-3ds-max-2014-extension[/QUOTE]

К сожалению, это не так не работает с PySide. И даже с Qt вы очень зависите от выбора правильных версий и сборок и переключения двоичных файлов. Это хлопотно. На данный момент мы как бы неловко обошли это.

гпс

#6

flo.ei;26205:

Да, без него работает отлично. Это QMainWindow нет? «класс OpenWindow(QtGui.QMainWindow):»

Ого! Я совсем слепой! Извини за это. Надеюсь, вы скоро найдете ответ, мне было бы любопытно услышать об этом!

КибоОст

#7

У меня точно такое же поведение. Не родительские работы, но громоздкие, у родительских есть много проблем с перерисовкой. Даже перерисовка виджета при перемещении не решает эту проблему. И ничего нового со стороны Autodesk с max2014. Я полностью прекратил разработку maxplus, так как такие базовые проблемы еще не решены. А ссылка с просьбой скомпилировать блюр-версию бларпитона — это просто признание… 28 марта 2017, 9:52pm #8

Мы работаем над этим, настраивая поведение. Проблема с обычным окном ParentToMax заключается в том, что оно заставляет окно PySide оставаться в пределах границ главного окна. Что является БОЛЬШОЙ проблемой в системах с несколькими мониторами.
Итак, мы настроили наш MacroButton, чтобы проверять, открыт ли уже наш инструмент, и если это так, деминимизировать его и сообщать пользователям, чтобы они сворачивали его, и устанавливали для него значение «Всегда сверху». По крайней мере, я думаю, что это текущее состояние.

Ура,
Торстен

Ковач

#9

 из PySide импортировать QtGui
из ctypes импортировать pythonapi, c_void_p, py_object
Пример класса (QtGui.QWidget):
    
    защита __init__(сам):
        супер(Пример, я).__init__()
        self.initUI()
    def moveEvent (я, событие):
        самообновление()
        
    деф initUI(я):
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Значок')
        самовыражение()
        
деф основной():
    экс = пример ()
    _GCProtector.widgets.append(бывший)
    main_layout = QtGui.QVBoxLayout()
    label = QtGui.QLabel("Я макет")
    main_layout.addWidget(метка)
    цилиндр_btn = QtGui.QPushButton("Я ничего не делаю")
    main_layout.addWidget (cylinder_btn)
    ex.setLayout(main_layout)
    hwnd = ex.efficientWinId()
    pythonapi.PyCObject_AsVoidPtr.restype = c_void_p
    pythonapi.PyCObject_AsVoidPtr.argtypes = [py_object]
    ptr = pythonapi.PyCObject_AsVoidPtr(hwnd)
    MaxPlus.Win32.Set3dsMaxAsParentWindow(ptr)
если __name__ == '__main__':
    основной()
 

Вот своего рода хак, чтобы, по крайней мере, основная часть пользовательского интерфейса вашего приложения не страдала от артефактов рисования при перетаскивании через область просмотра. Я думаю, что это просто ошибка рендеринга в том, как max обрабатывает рендеринг области просмотра, поскольку перетаскивание окна поверх боковых панелей не вызывает артефактов.

Вы увидите, что я только что добавил:

 def moveEvent(self, event):
        самообновление()
 

в класс в качестве прослушивателя событий. Рамка окна все еще проблематична (я не могу найти никакого эквивалента updateGeometry() для frameGeometry).

Как сказал Insight-vfx, вы по-прежнему будете иметь дело с ограничением удержания окна в пределах границ кадра Max. Будем надеяться, что будущие версии откроют возможность связывать события приложения Max с MaxPlus (если это вообще имеет смысл).

сониктк

#10

Привет всем! Я относительно новичок в API Max Python в целом, но у меня есть средний опыт работы с Python в целом (Maya/XSI). Решение здесь действительно очень помогло мне, но у меня есть связанный с этим вопрос: я заметил, что дистрибутив PySide в max, похоже, не имеет библиотеки QtUiTools, которая мне нужна для импорта файлов пользовательского интерфейса из Designer: я пытался чтобы это решение работало с QuiLoader, чтобы я мог быстро создавать прототипы UI в Designer и загружать их в max; есть ли способ, которым я все еще могу сделать это легко? Преобразование файлов пользовательского интерфейса в файлы py по-прежнему требует, чтобы виджеты были родительскими для QMainWindow, и я также не смог заставить это работать; вы, ребята, просто вручную кодируете все свои пользовательские интерфейсы для такого рода вещей?

Я просмотрел расширения Blur для 2014 года, которые объединяют библиотеки PyQt и все остальное, что делает это гораздо менее головной болью (чем должно быть! : P), но я немного беспокоюсь о поддержке, которую эти инструменты будут получить в будущем, и я на 2015 в любом случае.

Кроме того, поскольку я не очень хорошо разбираюсь в ctypes, я пошел дальше и попытался выяснить, что на самом деле происходит в опубликованном примере кода; если кто-то хочет провести меня и проверить, правильно ли я понимаю что-то, что происходит, у меня есть исправленная версия фрагмента кода здесь:
http://pastebin. com/Sed2g89N

Будем признательны за любую помощь/рекомендацию!

сониктк

#11

Привет всем, я изо всех сил пытаюсь получить простой пользовательский интерфейс от Designer для загрузки в 3ds max, используя этот метод родительского контроля, однако, поскольку дистрибутив PySide в max 2015 является неполным (нет доступа к QUiLoader), я я просто конвертирую файлы в py и загружаю их таким образом; однако я столкнулся с небольшой проблемой: я могу заставить файлы пользовательского интерфейса загружаться максимально, но я не могу сосредоточиться на них, и я не могу щелкнуть ни одну из кнопок/меню (даже хотя когда я навожу на них мышку, они подсвечиваются)

Мне было интересно, не будет ли кто-нибудь достаточно любезен, чтобы помочь просмотреть мой пример кода и, если возможно, указать, что я здесь делаю неправильно, я был бы очень признателен:

http://pastebin. com/QmViTL4w

Спасибо!

РЕДАКТИРОВАТЬ: О, на самом деле теперь я понимаю, что это немного сложнее; пользовательский интерфейс на самом деле загружается нормально, но работает ТОЛЬКО на основном мониторе; если у меня max открыт на дополнительном мониторе, начинают происходить все ошибки… плюс любой ввод с клавиатуры, который я даю, захватывается самой 3ds max вместо QWidget.

Есть ли у кого-нибудь хороший способ сделать это, которым они хотели бы поделиться? Приведенный выше фрагмент кода на самом деле страдает от тех же проблем, которые я описываю здесь (работает только на основном мониторе, ввод с клавиатуры не работает и т. д.)

flo.ei

#12

Хорошие новости Ребята, в Max 2016 SP1 они исправили это, вот письмо от службы поддержки разработчиков Autodesk:

def AttachQWidgetToMax(qwidget, isModelessDlg=True):
»’ Присоединяет данный безродительский QWidget по его идентификатору Qt winId к
главному окну win32 3ds max.
Внутренне это делается путем создания промежуточного QWinWidget,
который будет дочерним элементом окна 3d max, и родителем
QWidget для QWinWidget.
Для данного QWidget ускорители клавиатуры 3ds max
будут отключены, когда виджет получит фокус.
Если для параметра isModelessDlg задано значение true, 3ds max будет корректно отключать/включать QWidget при появлении другого модального диалогового окна 3ds max 9Выскакивает 0013. ‘’’

flo.ei

№13

Хорошие новости Ребята, в Max 2016 SP1 они исправили это, вот письмо от службы поддержки разработчиков Autodesk:

def AttachQWidgetToMax( qwidget, isModelessDlg=True ):
»’ Присоединяет данный безродительский QWidget по его Qt winId к
Главное окно win32 3ds max.
Внутренне это делается путем создания промежуточного QWinWidget,
который будет дочерним элементом окна 3d max, и родителем
QWidget в QWinWidget.
Для данного QWidget ускорители клавиатуры 3ds max
будут отключены, когда виджет получит фокус.
Если для параметра isModelessDlg задано значение true, 3ds max будет корректно отключать/включать QWidget при появлении другого модального диалогового окна
3ds max. ‘’’

альфальфаспроссен

№14

Для тех, кто ищет решение до Max 2017

Смысл того, чтобы виджет вел себя как другое дочернее окно Max (относительно Z-упорядочения), заключается в том, чтобы установить владельца виджета, а не родителя.

Волшебная вещь, которую нужно сделать, это

 SetWindowLongPtr(self. hwnd, GWL_HWNDPARENT, self.parent_hwnd)
 

, где parent_hwnd — HWND главного окна 3dsMax.

Для полной справки проверьте maxparenting.py (и файл примера) https://github.com/alfalfasprossen/qtinwin

Claudio_A

№15

Эй, альфальфаспроссен, это потрясающе.

Быстрый вопрос, это было протестировано в Windows 7, 8 и 10? Просто любопытно, потому что в последний раз я возился с подобными вещами, некоторые из них, казалось, работали в 7, но, похоже, изменились в Windows 10. 28 марта 2017 г., 21:55 №16

Я тестировал только на Windows7. Однако на сайте msdn ничего не говорится об изменениях в API для Windows 10. Я думаю, кто-то просто должен попробовать это

слаймбургер

# 17

Еще есть любопытная команда… не знаю, поможет ли она!
MaxPlus.AttachQWidgetToMax()

Ибингшан

# 18

Эй, ребята, почему бы не попробовать: из PySide импортировать шибокен
в 3dmax, который мы не можем использовать: импортировать шибокен
кстати, выше 3dmax 2018, мы можем использовать: из PySide2 импортировать shiboken2
удачи

ibingshan

# 19

Кажется, что 3dmax < 2017 не работает

Создание плавающих окон инструментов в 3ds Max — robodojo

Техническое искусство — одна из немногих областей индустрии компьютерных игр, где предложение не соответствует спросу. В то же время количество доступной литературы о том, как развивать навыки, ничтожно мало по сравнению с другими дисциплинами, такими как рисование персонажей или дизайн уровней. Так много художников не решаются пойти по этой улице просто потому, что основы не очень хорошо изложены. Не многие университетские курсы учитывают эту специализацию, и нет специальной книги, посвященной этой роли. Надеемся, что некоторые из этих руководств помогут желающим ученикам сдвинуться с мертвой точки.

Мы собираемся написать сценарий, который создает базовый инструмент. Под инструментом мы подразумеваем плавающее окно, которое помогает другому пользователю выполнить задачу в 3ds Max. Наш инструмент будет инструментом, помогающим контролировать положение точки поворота объекта. Во-первых, мы должны создать интерфейс.

Создание пользовательского интерфейса

В 3ds Max откройте окно MAXScript с помощью следующей команды:

Панель меню > MAXScript > Новый сценарий

В этом окне введите следующий код:


Развертывание PivotControls "Pivot управления"
(
Кнопка Btncenter "Центр Pivot" Ширина: 150
Кнопка Btnbase "Base Pivot" LIGTH: 150
BTNORIGIN "PIRUS PIVOT" WIWD: 150
) 9013 9013 9013 9013 9013. = undefined then
closeRolloutFloater theNewFloater
theNewFloater = newRolloutFloater "Pivot Tool" 180 120
addRollout pivotControls theNewFloater

Это базовый код, который создает плавающий инструмент.

В редакторе MAXScript щелкните: Menubar > Tools > Evaluate All

Вы должны увидеть что-то вроде следующего:

Первое, что мы делаем, это определяем развертывание с предложением развертывания:

rollout [rolloutName] [ rolloutText]
(
--content идет сюда
)

Затем в предложении rollout мы создаем три объекта-кнопки. У каждого объекта кнопки есть имя, текстовое значение, которое идет на кнопку, и мы назначаем каждой кнопке значение ширины.

Затем код в нижней части скрипта создает «RolloutFloater». Это плавающее окно, которое дает нам объект, в который можно поместить наш свиток.

Добавление функциональности

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


rollout pivotControls "Pivot Controls"
(
button btnCenter "Center Pivot" width:150
button btnBase "Base Pivot" width:150
кнопка btnOrigin "Origin Pivot" ширина:150
на btnCenter нажата do
окно сообщений "Center Pivot"
на btnBase нажата do
окно сообщений "Base Pivot"
на btnOrigin нажато do
окно сообщений "Origin Pivot"
) theNewFloater if 9001ater ! undefined then
closeRolloutFloater theNewFloater
theNewFloater = newRolloutFloater "Pivot Tool" 180 120
addRollout pivotControls theNewFloater

Когда вы запустите сценарий на этот раз, вы заметите, что нажатие кнопок вызывает появление диалоговых окон.
Мы используем «обработчики событий», чтобы определить, когда пользователь взаимодействовал с нашим инструментом:


на btnCenter нажал do
окно сообщения «Центрировать Pivot»

Первая строка обнаруживает событие «нажато», затем мы добавляем команда для выполнения, когда событие срабатывает. В этом случае мы создаем диалоговое окно с сообщением «Поворот по центру».
Следующим этапом является замена этих основных операторов нашим реальным кодом; код, который будет обрабатывать повороты объекта.

Команды

Следующее, что мы собираемся сделать, это добавить команду. Команды — это процессы, которые мы можем запускать с помощью MAXScript. Команда, которую мы собираемся использовать, называется «CenterPivot». Эта команда центрирует ось целевого объекта. Чтобы добавить его в наш инструмент, мы просто заменяем строку 8 нашего скрипта командой: «CenterPivot $».
Макс использует знак доллара для обозначения текущего выбора. Итак, у вас должно быть следующее:


rollout pivotControls "Pivot Controls"
(
кнопка btnCenter "Center Pivot" ширина:150
кнопка btnBase "Base Pivot" ширина:150
кнопка btnOrigin "Origin Pivot" ширина:150

на btnCenter нажата do
CenterPivot $
на btnBase3 нажата do 9 «00Base3 нажата do 9 Pivot ”
на Btnorigin Нажмите DO
Messagebox« Origin Pivot »
)

, если TheneWfloater! = Undefined, затем
Closerolloutfloater TheneWfloater
TheneWfloater = NewRolloutfloater« Контролирование Pivot Out willing », что наносите на наготоке Pivot wills will wills wills wills will wills will wills will will wills withloater house will wills will will hillylo .

Функции

Две другие кнопки требуют от нас создания собственных команд. Пользовательские команды известны как «функции». Функции имеют следующую форму:


fn ИмяФункции [необязательные_параметры] =
(
--код функции идет здесь
)

Имя важно, так как каждый раз, когда мы вызываем функцию, мы будем использовать ее имя. Необязательные параметры могут быть введены для задания настроек функции или для указания функции, с какими объектами воздействовать.
В нашей первой функции нам нужно отправить точку поворота объекта к его основанию, которое является его минимальной точкой на оси Z. Вот наша функция:


fn BasePivot =
(
для выбранного элемента do
item.pivot = [item.center.x, item.center.y, item.min.z]
)

В первой строке кода нашей функции мы используем цикл for. Этот фрагмент кода проходит через все элементы, которые у нас есть в нашем выборе, чтобы каждый элемент можно было обработать.
Следующая строка сообщает коду, что делать с каждым из элементов цикла for. Стержень предмета отправляется в точку в космосе. Местоположение в пространстве, также известное как значение point3, принимает форму [x, y, z]. В нашем случае мы хотим, чтобы значения x и y для опорной точки находились в центре объекта, а значение z — в минимальном положении по оси z, поэтому мы отправляем опорную точку по адресу: 9.0264 [item.center.x, item.center.y, item.min.z]

Чтобы выполнить этот код, мы должны вставить функцию в наш код развертывания, а затем добавить «вызов функции» к кнопке:


Развертывание PivotControls «Управление pivot»
(
Кнопка Btncenter «Центр Pivot». для выбранного элемента выполните
item.pivot = [item.center.x, item.center.y, item.min.z]
)
на Btncenter Pressed Do
CenterPivot $
на Btnbase Pressed Do
BasePivot ()
на Btnorigin, нажатой на
«Соответствующий ящик»
)
. 180 120
addRollout pivotControls theNewFloater

Обратите внимание, что при вызове функции мы используем следующие обозначения:


BasePivot()

Когда мы вызываем функцию без отправки параметра, мы должны добавить открывающую и закрывающую скобки после имени функции, чтобы сообщить Максу, что это вызов функции. В этом нет необходимости, когда мы делаем вызов функции с параметром.

Сопоставленные функции

Для последней кнопки мы будем использовать специальную форму функции, называемую сопоставленной функцией. Сопоставленные функции позволяют нам выполнять набор операций над набором похожих объектов, но без использования «цикла for». Для сложных операций Max обрабатывает сопоставленные функции более эффективно, чем для циклов. Это простой случай, но он демонстрирует принцип.
Функция выглядит следующим образом:


mapped fn OriginPivot obj =
(
obj.pivot = [0,0,0]
)

На этот раз мы используем параметр (obj), чтобы функция знает, над чем она работает. obj можно передать либо один элемент, либо набор элементов. Когда мы вызываем функцию на этот раз, нам нужно отправить функции, с какими объектами работать. Итак, вот как выглядит наш окончательный код:


rollout pivotControls "Pivot Controls"
(
кнопка btnCenter "Center Pivot" ширина:150
кнопка btnBase "Base Pivot" ширина:150
кнопка btnOrigin "Origin Pivot" ширина:150

fn BasePivot =
(
для элемента в выборе item3.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *