Поделиться через


Плоскости сечения

Сечение — это визуальная функция, которая обрезает пиксели с одной стороны виртуальной плоскости, показывая срез сетки. Эффект показан на рисунке ниже. Слева показана исходная сетка, а справа можно увидеть, что находится внутри.

Cut plane

CutPlaneComponent

Чтобы добавить сечение в сцену, создайте объект CutPlaneComponent. Расположение и ориентация плоскости определяются сущностью владельца компонента.

void CreateCutPlane(RenderingSession session, Entity ownerEntity)
{
    CutPlaneComponent cutPlane = (CutPlaneComponent)session.Connection.CreateComponent(ObjectType.CutPlaneComponent, ownerEntity);
    cutPlane.Normal = Axis.X; // normal points along the positive x-axis of the owner object's orientation
    cutPlane.FadeColor = new Color4Ub(255, 0, 0, 128); // fade to 50% red
    cutPlane.FadeLength = 0.05f; // gradient width: 5cm
}
void CreateCutPlane(ApiHandle<RenderingSession> session, ApiHandle<Entity> ownerEntity)
{
    ApiHandle<CutPlaneComponent> cutPlane = session->Connection()->CreateComponent(ObjectType::CutPlaneComponent, ownerEntity)->as<CutPlaneComponent>();;
    cutPlane->SetNormal(Axis::X); // normal points along the positive x-axis of the owner object's orientation
    Color4Ub fadeColor;
    fadeColor.channels = { 255, 0, 0, 128 }; // fade to 50% red
    cutPlane->SetFadeColor(fadeColor);
    cutPlane->SetFadeLength(0.05f); // gradient width: 5cm
}

Свойства CutPlaneComponent

Компонент сечения имеет перечисленные ниже свойства.

  • Enabled: вы можете временно отключить отрезанные плоскости, отключив компонент. Отключенные сечения не требуют затрат на отрисовку, а также не включаются в общее количество сечений.

  • Normal: указывает, какое направление (+X,-X,+Y,-Y,+Z,-Z) используется в качестве нормальной плоскости. Это направление определяется относительно ориентации сущности владельца. Для точного размещения переместите и поверните сущность владельца.

  • FadeColor и FadeLength:

    Если альфа-значение FadeColor не равно нулю, пиксели, находящиеся близко к сечению, будут выцветать в направлении компонента RGB FadeColor. Интенсивность альфа-канала определяет то, будут ли пиксели выцветать до выбранного цвета полностью или частично. FadeLength определяет расстояние, на котором будет происходить выцветание.

  • ObjectFilterMask: битовая маска фильтра, определяющая геометрию, на которую влияет секущая плоскость. Подробные сведения см. в следующем абзаце.

Избирательные секущие плоскости

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

Selective cut planes

Фильтрация выполняется с помощью логического сравнения между битовой маской на стороне секущей плоскости и второй битовой маской, заданной для геометрии. Если результат логической операции AND между масками не равен нулю, то секущая плоскость будет влиять на геометрию.

  • Битовая маска в компоненте секущей плоскости задается через свойство ObjectFilterMask.
  • Битовая маска во вложенной иерархии геометрических объектов задается с помощью HierarchicalStateOverrideComponent.

Примеры:

Маска фильтра секущей плоскости Маска фильтра геометрии Результат логической операции AND Секущая плоскость влияет на геометрию?
(0000 0001) == 1 (0000 0001) == 1 (0000 0001) == 1 Да
(1111 0000) == 240 (0001 0001) == 17 (0001 0000) == 16 Да
(0000 0001) == 1 (0000 0010) == 2 (0000 0000) == 0 Нет
(0000 0011) == 3 (0000 1000) == 8 (0000 0000) == 0 Нет

Совет

Если задать для параметра секущей плоскости ObjectFilterMask значение 0, это не повлияет на геометрию, так как результат логической операции AND не может иметь значение, отличное от NULL. Система отрисовки не учитывает эти плоскости, так что это простой метод отключения отдельных секущих плоскостей. Эти секущие плоскости также не входят в ограничение на 8 активных плоскостей.

Ограничения

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

Замечания, связанные с быстродействием

На отрисовку каждого активного сечения требуются некоторые затраты ресурсов. Отключайте или удаляйте сечения, если они больше не нужны.

Документация по API

Следующие шаги