Элемент управления Bounds — MRTK2
BoundsControl — это новый компонент для поведения манипуляций, ранее найденный в BoundingBox. Элемент управления Bounds делает ряд улучшений и упрощений в настройке и добавляет новые функции. Этот компонент является заменой ограничивающего прямоугольника, который будет нерекомендуем.
Скрипт BoundsControl.cs
предоставляет базовые функции для преобразования объектов в смешанной реальности. Элемент управления "Границы" отображает прямоугольник вокруг голограммы, чтобы указать, что его можно взаимодействовать. Дескрипторы на углах и краях коробки позволяют масштабировать, поворачивать или переводить объект. Элемент управления "Границы" также реагирует на ввод данных пользователем. Например, в HoloLens 2 элемент управления границ реагирует на близость пальца, предоставляя визуальную обратную связь для восприятия расстояния от объекта. Все взаимодействия и визуальные элементы можно легко настроить.
Пример сцены
Примеры конфигураций элементов управления границами можно найти в сцене BoundsControlExamples
.

Свойства инспектора
Целевой объект
Это свойство указывает, какой объект будет преобразован манипуляцией с ограничивающими объектами управления. Если объект не задан, по умолчанию используется объект owner.
Поведение активации
Существует несколько вариантов активации интерфейса элемента управления границ.
- Активация при запуске: элемент управления "Границы" становится видимым после запуска сцены.
- Активация по близости: элемент управления "Границы" становится видимым, когда сформулированная рука близка к объекту.
- Активация по указателю: элемент управления "Границы" становится видимым, когда он предназначен для указателя на ручной луч.
- Активация по близкому расположению и указателю: элемент управления "Границы" становится видимым, когда он предназначен указателем на ручной луч или сформулированной рукой близок к объекту.
- Активация вручную: элемент управления "Границы" не становится видимым автоматически. Его можно активировать вручную с помощью скрипта, доступ к свойству boundsControl.Active.
Переопределение границ
Задает прямоугольный коллайдер из объекта для вычислений границ.
Заполнение коробки
Добавляет заполнение к границам коллайдера, используемым для вычисления экстентов элемента управления. Это влияет не только на взаимодействие, но и на визуальные элементы.
Плоская ось
Указывает, является ли элемент управления плоский на одной из осей, что делает его двумерным и запрещает манипуляции вдоль этой оси. Эту функцию можно использовать для тонких объектов, таких как slates. Если плоская ось имеет значение Flatten Auto , скрипт автоматически выбирает ось с наименьшей степенью в виде плоской оси.
Сглаживание
Раздел сглаживания позволяет настроить поведение сглаживания для масштабирования и поворота элемента управления.
Визуальные элементы
Внешний вид элемента управления границ можно настроить, изменив одну из соответствующих конфигураций визуальных элементов. Визуальные конфигурации являются связанными или встроенными объектами скриптов и подробно описаны в разделе объекта конфигурации.
Объекты конфигурации
Элемент управления поставляется с набором объектов конфигурации, которые можно хранить в виде скриптируемых объектов и совместно использовать между различными экземплярами или префабами. Конфигурации могут быть общими и связанными как отдельные файлы ресурсов, доступные для сценариев, или вложенные ресурсы, доступные для сценариев, внутри префабов. Дополнительные конфигурации также можно определить непосредственно на экземпляре без связывания с внешним или вложенным скриптируемым ресурсом.
Инспектор элементов управления границ указывает, является ли конфигурация общей или встраивается как часть текущего экземпляра, показывая сообщение в инспекторе свойств. Кроме того, общие экземпляры не будут изменяться непосредственно в самом окне свойств управления границами, но вместо этого ресурс, к которому он связывается, должен быть напрямую изменен, чтобы избежать случайных изменений в общих конфигурациях.
В настоящее время элемент управления bounds предлагает параметры объектов конфигурации для следующих функций:
Конфигурация Box
Конфигурация коробки отвечает за отрисовку сплошной рамки с границами, определенными с помощью размера коллайдера и заполнения прямоугольником. Можно настроить следующие свойства:
- Материал коробки: определяет материал, применяемый к отрисованной рамке, если взаимодействие не выполняется. Поле будет отображаться только в том случае, если этот материал задан.
- Прямоугольник схватил материал: материал для коробки, когда пользователь взаимодействует с элементом управления путем захвата через близкое или далекое взаимодействие.
- Горизонтальное отображение оси: шкала, применяемая к прямоугольнику, если одна из осей плоская.
Настройка дескрипторов масштабирования
Этот ящик свойств позволяет изменять поведение и визуализацию маркеров масштабирования элемента управления границами.
- Обработка материала: материал, применяемый к дескрипторам.
- Дескриптор схватил материал: материал, применяемый к схватленной ручке.
- Дескриптор prefab: необязательный префаб для дескриптора масштабирования. Если параметр MRTK не задан, он будет использовать куб по умолчанию.
- Размер дескриптора: размер маркера масштабирования.
- Заполнение коллайдера: заполнение для добавления в коллайдер дескриптора.
- Рисование связки при манипулировании: когда активная линия отрисовывает линию с точки начала взаимодействия до текущей позиции руки или указателя.
- Дескриптор игнорирует коллайдер: если коллайдер связывается здесь, дескриптор игнорирует любое столкновение с этим коллайдером.
- Дескриптор slate prefab: prefab, используемый для дескриптора при сплощении элемента управления.
- Отображение дескрипторов масштабирования: управляет видимостью дескриптора.
- Поведение масштабирования: можно задать равномерное или неоднородное масштабирование.
Конфигурация дескрипторов поворота
Эта конфигурация определяет поведение дескриптора поворота.
- Обработка материала: материал, применяемый к дескрипторам.
- Дескриптор схватил материал: материал, применяемый к схватленной ручке.
- Дескриптор prefab: необязательный префаб для дескриптора. Если параметр MRTK не задан, использует сферу по умолчанию.
- Размер дескриптора: размер дескриптора.
- Заполнение коллайдера: заполнение для добавления в коллайдер дескриптора.
- Рисование связки при манипулировании: когда активная линия отрисовывает линию с точки начала взаимодействия до текущей позиции руки или указателя.
- Дескриптор игнорирует коллайдер: если коллайдер связывается здесь, дескриптор игнорирует любое столкновение с этим коллайдером.
- Дескриптор предварительного коллайдера: тип коллайдера для использования с созданным дескриптором.
- Отображение дескриптора для X: управляет видимостью дескриптора для оси X.
- Показать дескриптор для Y: управляет видимостью дескриптора для оси Y.
- Отображение дескриптора для Z: управляет видимостью дескриптора для оси Z.
Конфигурация дескрипторов перевода
Позволяет включать и настраивать дескриптор перевода для элемента управления границами. Обратите внимание, что дескриптор перевода отключен по умолчанию.
- Обработка материала: материал, применяемый к дескрипторам.
- Дескриптор схватил материал: материал, применяемый к схватленной ручке.
- Дескриптор prefab: необязательный префаб для дескриптора. Если параметр MRTK не задан, использует сферу по умолчанию.
- Размер дескриптора: размер дескриптора.
- Заполнение коллайдера: заполнение для добавления в коллайдер дескриптора.
- Рисование связки при манипулировании: когда активная линия отрисовывает линию с точки начала взаимодействия до текущей позиции руки или указателя.
- Дескриптор игнорирует коллайдер: если коллайдер связывается здесь, дескриптор игнорирует любое столкновение с этим коллайдером.
- Дескриптор предварительного коллайдера: тип коллайдера для использования с созданным дескриптором.
- Отображение дескриптора для X: управляет видимостью дескриптора для оси X.
- Показать дескриптор для Y: управляет видимостью дескриптора для оси Y.
- Отображение дескриптора для Z: управляет видимостью дескриптора для оси Z.
Конфигурация ссылок (проволочная рамка)
Конфигурация ссылок включает функцию проволочной рамки элемента управления границами. Можно настроить следующие свойства:
- Материал проволочной рамки: материал, применяемый к сетке проволочной сетки.
- Радиус края проволочной рамки: толщина проволочной рамки.
- Проволочная фигура: форма проволочной рамки может быть либо кубическим, либо цилиндрическим.
- Отображение проволочной рамки: управляет видимостью проволочной рамки.
Конфигурация эффекта близкого взаимодействия
Отображение и скрытие дескрипторов с анимацией на основе расстояния к рукам. Она имеет двухфакторную анимацию масштабирования. По умолчанию задано HoloLens 2 поведение стиля.

- Эффект близкого взаимодействия активен: включение активации дескриптора на основе близкого взаимодействия
- Средняя близость объекта: расстояние для 1-го шага масштабирования
- Близкое расположение объекта: расстояние для масштабирования на 2-м шаге
- Far Scale: значение шкалы по умолчанию для ресурса дескриптора, если руки выходят за пределы диапазона взаимодействия элемента управления (расстояние, определенное выше с помощью "Handle Medium Proximity". Используйте 0, чтобы скрыть дескриптор по умолчанию)
- Средний масштаб: значение масштабируемого ресурса дескриптора, когда руки находятся в пределах диапазона взаимодействия элемента управления границ (расстояние, определенное выше с помощью "Handle Close Proximity". Используйте 1 для отображения обычного размера)
- Close Scale: Scale value of the handle asset when the hands are within of the range of the grab interaction (distance defined above by Handle Close Proximity). Используйте 1.x для отображения большего размера)
- Far Grow Rate: Rate a proximity scaled object scales when the hand moves from medium to far proximity.
- Средняя скорость роста: скорость масштабирования масштабируемого объекта близкого взаимодействия при перемещении руки из среднего в близкое расположение.
- Близкое увеличение скорости: скорость масштабирования масштабируемых объектов близкого взаимодействия при перемещении руки от близкого расположения к центру объектов.
Система ограничений
Элемент управления Bounds поддерживает использование диспетчера ограничений для ограничения или изменения преобразования, поворота или масштабирования при использовании дескрипторов элементов управления границ.
Инспектор свойств отобразит все доступные диспетчеры ограничений, подключенные к одному игровому объекту в раскрывающемся списке с возможностью прокрутки и выделения выбранного диспетчера ограничений.

События
Элемент управления Bounds предоставляет следующие события. В этом примере используются эти события для воспроизведения звуковых отзывов.
- Поворот запущен: сработал при запуске поворота.
- Поворот остановлен: срабатывает при остановке поворота.
- Начало масштабирования: срабатывает при запуске масштабирования.
- Остановлено масштабирование: срабатывает при остановке масштабирования.
- Начало перевода: срабатывает при запуске перевода.
- Перевод остановлен: срабатывает при остановке перевода.

Эластичные (экспериментальные)
Эластичные компоненты можно использовать при управлении объектами с помощью элемента управления "Границы". Обратите внимание, что система эластичных баз данных по-прежнему находится в экспериментальном состоянии. Чтобы включить эластичные компоненты либо связать существующий компонент диспетчера эластичных баз данных, либо создать и связать новый диспетчер эластичных баз данных с помощью кнопки Add Elastics Manager
.

Стили дескриптора
По умолчанию при назначении скрипта BoundsControl.cs
отображается дескриптор стиля HoloLens 1-го поколения. Чтобы использовать маркеры стиля HoloLens 2, необходимо назначить правильные префабы и материалы дескриптора.
Ниже приведены префабы, материалы и значения масштабирования для дескрипторов элементов управления HoloLens 2 стилей. Этот пример можно найти в сцене BoundsControlExamples
.

Дескрипторы (настройка для стиля HoloLens 2)
- Обработка материала: BoundingBoxHandleWhite.mat
- Handle Grabbed Material: BoundingBoxHandleBlueGrabbed.mat
- Префаб дескриптора масштабирования: MRTK_BoundingBox_ScaleHandle.prefab
- Префаб маркера масштабирования: MRTK_BoundingBox_ScaleHandle_Slate.prefab
- Размер дескриптора масштабирования: 0,016 (1,6 см)
- Заполнение коллажа маркера масштабирования: 0,016 (делает захватный коллайдер немного больше, чем визуальный элемент дескриптора).
- Префаб дескриптора поворота: MRTK_BoundingBox_RotateHandle.prefab
- Размер дескриптора поворота: 0,016
- Заполнение обработчика поворота: 0,016 (делает схватываемый коллайдер немного больше, чем визуальный элемент дескриптора).
Изменения преобразования с помощью манипулятора объектов
Элемент управления "Границы" можно использовать в сочетании с ObjectManipulator.cs
тем, чтобы разрешить определенные типы манипуляций (например, перемещение объекта) без использования дескрипторов. Обработчик манипуляций поддерживает как одно, так и двухсторонние взаимодействия. Отслеживание рук можно использовать для взаимодействия с объектом близко.

Чтобы границы элементов управления работали так же, как при перемещении с помощью ObjectManipulator
удаленного взаимодействия, рекомендуется подключить события on Manipulation Started / On Manipulation On Manipulation On Manipulation EndedBoundsControl.HighlightWires
/ BoundsControl.UnhighlightWires
to, как показано на снимке экрана выше.
Добавление и настройка элемента управления границ с помощью Unity Inspector
- Добавление коллайдера Box в объект
- Назначение
BoundsControl
скрипта объекту - Настройка параметров, таких как методы активации (см. раздел "Свойства инспектора " ниже)
- (Необязательно) Назначение префабов и материалов для элемента управления границ стиля HoloLens 2 (см. раздел "Стили дескриптора" ниже)
Примечание
Используйте поле "Переопределение целевого объекта и границ" в инспекторе, чтобы назначить конкретный объект и коллайдер в объекте с несколькими дочерними компонентами.
Добавление и настройка элемента управления границами в коде
Создание экземпляра куба GameObject
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
Назначение
BoundsControl
скрипта объекту с коллайдером с помощью AddComponent<>()private BoundsControl boundsControl; boundsControl = cube.AddComponent<BoundsControl>();
Настройка параметров непосредственно в элементе управления или с помощью одной из скриптируемых конфигураций (см. раздел "Свойства инспектора " и " Конфигурации " ниже).
// Change activation method boundsControl.BoundsControlActivation = BoundsControlActivationType.ActivateByProximityAndPointer; // Make the scale handles large boundsControl.ScaleHandlesConfig.HandleSize = 0.1f; // Hide rotation handles for x axis boundsControl.RotationHandlesConfig.ShowRotationHandleForX = false;
(Необязательно) Назначьте префабы и материалы для элемента управления HoloLens 2 стилей. Для этого по-прежнему требуются назначения через инспектор, так как материалы и префабы должны быть динамически загружены.
Примечание
Использование папки Unity Resources или Shader.Find для динамической загрузки шейдеров не рекомендуется, так как в среде выполнения шейдеры могут отсутствовать перестановки.
BoxDisplayConfiguration boxConfiguration = boundsControl.BoxDisplayConfig;
boxConfiguration.BoxMaterial = [Assign BoundingBox.mat]
boxConfiguration.BoxGrabbedMaterial = [Assign BoundingBoxGrabbed.mat]
ScaleHandlesConfiguration scaleHandleConfiguration = boundsControl.ScaleHandlesConfig;
scaleHandleConfiguration.HandleMaterial = [Assign BoundingBoxHandleWhite.mat]
scaleHandleConfiguration.HandleGrabbedMaterial = [Assign BoundingBoxHandleBlueGrabbed.mat]
scaleHandleConfiguration.HandlePrefab = [Assign MRTK_BoundingBox_ScaleHandle.prefab]
scaleHandleConfiguration.HandleSlatePrefab = [Assign MRTK_BoundingBox_ScaleHandle_Slate.prefab]
scaleHandleConfiguration.HandleSize = 0.016f;
scaleHandleConfiguration.ColliderPadding = 0.016f;
RotationHandlesConfiguration rotationHandleConfiguration = boundsControl.RotationHandlesConfig;
rotationHandleConfiguration.HandleMaterial = [Assign BoundingBoxHandleWhite.mat]
rotationHandleConfiguration.HandleGrabbedMaterial = [Assign BoundingBoxHandleBlueGrabbed.mat]
rotationHandleConfiguration.HandlePrefab = [Assign MRTK_BoundingBox_RotateHandle.prefab]
rotationHandleConfiguration.HandleSize = 0.016f;
rotationHandleConfiguration.ColliderPadding = 0.016f;
Пример. Установка минимального, максимального масштаба элемента управления границ с помощью MinMaxScaleConstraint
Чтобы задать минимальный и максимальный масштаб, подключите элемент MinMaxScaleConstraint
управления. Как элемент управления границ автоматически присоединяет и активирует диспетчер ограничений MinMaxScaleConstraint будет автоматически применен к изменениям преобразования после его подключения и настройки.
Вы также можете использовать MinMaxScaleConstraint для установки минимального и максимального масштаба для ObjectManipulator
.
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
bcontrol = cube.AddComponent<BoundsControl>();
// Important: BoundsControl creates a constraint manager on start if one does not exist.
// There's no need to manually attach a constraint manager.
MinMaxScaleConstraint scaleConstraint = bcontrol.gameObject.AddComponent<MinMaxScaleConstraint>();
scaleConstraint.ScaleMinimum = 1f;
scaleConstraint.ScaleMaximum = 2f;
Пример. Добавление элемента управления границ вокруг игрового объекта
Чтобы добавить элемент управления границ вокруг объекта, просто добавьте BoundsControl
в него компонент:
private void PutABoundsControlAroundIt(GameObject target)
{
target.AddComponent<BoundsControl>();
}
Переход с ограничивающего прямоугольника
Существующие префабы и экземпляры, использующие ограничивающий прямоугольник , можно обновить до нового элемента управления границами через окно миграции , которое является частью пакета средств MRTK.
Для обновления отдельных экземпляров ограничивающего прямоугольника также существует параметр миграции в инспекторе свойств компонента.
