Recortar planos

Um plano de recorte é um recurso visual que corta pixels em um lado de um plano virtual, revelando o interior das malhas. A imagem abaixo demonstra o efeito. À esquerda, há a malha original, à direita, é possível ver dentro da malha:

Cut plane

CutPlaneComponent

Adicione um plano de recorte à cena criando um CutPlaneComponent. O local e a orientação do plano são determinados pela entidade do proprietário do componente.

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
}

Propriedades de CutPlaneComponent

As propriedades a seguir são expostas em um componente de plano de recorte:

  • Enabled: Você pode desligar temporariamente os planos cortados desabilitando o componente. Os planos de recorte desabilitados não geram sobrecarga de renderização e também não contam para o limite do plano de recorte global.

  • Normal: Especifica qual direção (+X,-X,+Y,-Y,+Z,-Z) é usada como o plano normal. Essa direção é relativa à orientação da entidade do proprietário. Mova e gire a entidade do proprietário para o posicionamento exato.

  • FadeColor e FadeLength:

    Se o valor alfa de FadeColor for diferente de zero, os pixels próximos ao plano de recorte ficarão em direção à parte RGB de FadeColor. A força do canal alfa determina se ele ficará totalmente esmaecido em direção à cor de esmaecimento ou apenas parcialmente. FadeLength define em qual distância esse esmaecimento será realizado.

  • ObjectFilterMask: uma bitmask de filtro que determina qual geometria é afetada pelo plano de corte. Confira o próximo parágrafo para ver informações mais detalhadas.

Planos de corte seletivos

É possível configurar planos de corte individuais para que eles afetem somente uma geometria específica. Veja na figura a seguir uma ilustração dessa configuração na prática:

Selective cut planes

A filtragem funciona por meio da comparação de bitmask lógica entre uma bitmask no lado do plano de corte e outra definida na geometria. Se o resultado de uma operação lógica AND entre as máscaras não for zero, o plano de corte afetará a geometria.

  • A bitmask no componente de plano de corte é configurada por meio da propriedade ObjectFilterMask
  • A bitmask em uma sub-hierarquia da geometria é configurada por meio de HierarchicalStateOverrideComponent

Exemplos:

Máscara de filtro do plano de corte Máscara de filtro da geometria Resultado do AND lógico O plano de recorte afeta a geometria?
(0000 0001) == 1 (0000 0001) == 1 (0000 0001) == 1 Sim
(1111 0000) == 240 (0001 0001) == 17 (0001 0000) == 16 Sim
(0000 0001) == 1 (0000 0010) == 2 (0000 0000) == 0 Não
(0000 0011) == 3 (0000 1000) == 8 (0000 0000) == 0 No

Dica

Definir o ObjectFilterMask do plano de corte como 0 significa que ele não afetará a geometria, porque o resultado do AND lógico nunca pode ser não nulo. O sistema de renderização já não considera esses planos, então esse é um método leve para desabilitar planos de corte individuais. Esses planos de corte também não contam para o limite de oito planos ativos.

Limitações

  • O Azure Remote Rendering é compatível com um máximo de oito planos de corte ativos. É possível criar mais componentes de plano de recorte, mas, se você tentar habilitar mais planos simultaneamente, ele ignorará a ativação. Desabilite os outros planos primeiros se quiser alternar quais componentes que devem afetar a cena.
  • Os planos de corte são um recurso puramente visual, eles não afetam o resultado das consultas espaciais. Se você quiser projetar um raio em uma malha de corte aberto, é possível ajustar o ponto inicial do raio para estar no plano de recorte. Dessa forma, o raio só pode atingir as partes visíveis.

Considerações sobre o desempenho

Cada plano de recorte ativo gera um pequeno custo durante a renderização. Desabilite ou exclua planos de recorte quando eles não forem necessários.

Documentação da API

Próximas etapas