Caixa delimitadora — MRTK2

Bounding box

Observação

A caixa delimitadora é preterida e substituída por seu controle de limites sucessor. Use uma das opções de migração para atualizar objetos de jogo existentes.

O BoundingBox.cs script fornece funcionalidade básica para transformar objetos em realidade misturada. Uma caixa delimitadora mostrará um cubo ao redor do holograma para indicar que ele pode ser interagido. Os identificadores nos cantos e bordas do cubo permitem dimensionar ou girar o objeto. A caixa delimitadora também reage à entrada do usuário. No HoloLens 2, por exemplo, a caixa delimitadora responde à proximidade do dedo, fornecendo comentários visuais para ajudar a perceber a distância do objeto. Todas as interações e visuais podem ser facilmente personalizados.

Para obter mais informações, consulte a caixaLimitadora e a barra de aplicativos no Windows Centro de Desenvolvimento.

Exemplo de cena

Você pode encontrar exemplos de configurações de caixa delimitadora na BoundingBoxExamples cena.

Bounding Box Examples

Como adicionar e configurar uma caixa delimitadora usando o Unity Inspector

  1. Adicionar o Colisor de Caixa a um objeto
  2. Atribuir BoundingBox script a um objeto
  3. Configurar opções, como métodos de 'Ativação' (consulte a seção Propriedades do Inspetor abaixo)
  4. (Opcional) Atribuir pré-fabricados e materiais para uma caixa delimitadora de estilo HoloLens 2 (consulte a seção Estilos de identificador abaixo)

Observação

Use o campo Substituir Objeto de Destino e Limites no inspetor para atribuir objeto específico e colisor no objeto com vários componentes filho.

Bounding Box 1

Como adicionar e configurar uma caixa delimitadora no código

  1. GameObject de cubo de instanciação

    GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
    
  2. Atribuir BoundingBox script a um objeto com colisor usando AddComponent<>()

    private BoundingBox bbox;
    bbox = cube.AddComponent<BoundingBox>();
    
  3. Configurar opções (consulte a seção Propriedades do Inspetor abaixo)

    // Make the scale handles large
    bbox.ScaleHandleSize = 0.1f;
    // Hide rotation handles
    bbox.ShowRotationHandleForX = false;
    bbox.ShowRotationHandleForY = false;
    bbox.ShowRotationHandleForZ = false;
    
  4. (Opcional) Atribua pré-fabricados e materiais para uma caixa delimitadora de estilo HoloLens 2. Isso ainda requer atribuições por meio do inspetor, pois os materiais e pré-fabricados devem ser carregados dinamicamente.

Observação

Não é recomendável usar a pasta 'Recursos' do Unity ou o Shader.Find para carregar sombreadores dinamicamente, pois as permutações de sombreador podem estar ausentes em runtime.

bbox.BoxMaterial = [Assign BoundingBox.mat]
bbox.BoxGrabbedMaterial = [Assign BoundingBoxGrabbed.mat]
bbox.HandleMaterial = [Assign BoundingBoxHandleWhite.mat]
bbox.HandleGrabbedMaterial = [Assign BoundingBoxHandleBlueGrabbed.mat]
bbox.ScaleHandlePrefab = [Assign MRTK_BoundingBox_ScaleHandle.prefab]
bbox.ScaleHandleSlatePrefab = [Assign MRTK_BoundingBox_ScaleHandle_Slate.prefab]
bbox.ScaleHandleSize = 0.016f;
bbox.ScaleHandleColliderPadding = 0.016f;
bbox.RotationHandleSlatePrefab = [Assign MRTK_BoundingBox_RotateHandle.prefab]
bbox.RotationHandleSize = 0.016f;
bbox.RotateHandleColliderPadding = 0.016f;

Exemplo: definir a escala de caixa delimitadora mínima e máxima usando MinMaxScaleConstraint

Para definir a escala mínima e máxima, use o MinMaxScaleConstraint. Você também pode usar MinMaxScaleConstraint para definir a escala mínima e máxima para ManipulationHandler.

GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
bbox = cube.AddComponent<BoundingBox>();
// Important: BoundingBox creates a scale handler on start if one does not exist
// do not use AddComponent, as that will create a  duplicate handler that will not be used
MinMaxScaleConstraint scaleConstraint = bbox.gameObject.GetComponent<MinMaxScaleConstraint>();
scaleConstraint.ScaleMinimum = 1f;
scaleConstraint.ScaleMaximum = 2f;

Exemplo: adicionar caixa delimitadora em torno de um objeto de jogo

Para adicionar uma caixa delimitadora em torno de um objeto, basta adicionar um BoundingBox componente a ele:

private void PutABoxAroundIt(GameObject target)
{
   target.AddComponent<BoundingBox>();
}

Propriedades do inspetor

Objeto de destino

Essa propriedade especifica qual objeto será transformado pela manipulação da caixa delimitadora. Se nenhum objeto for definido, a caixa delimitadora será padrão para o objeto proprietário.

Substituição de limites

Define um colisor de caixa do objeto para computação de limites.

Comportamento de ativação

Há várias opções para ativar a interface da caixa delimitadora.

  • Ativar No Início: a caixa delimitadora fica visível quando a cena é iniciada.
  • Ativar por proximidade: a caixa delimitadora fica visível quando uma mão articulada está perto do objeto.
  • Ativar por ponteiro: a caixa delimitadora fica visível quando é direcionada por um ponteiro de raios muários.
  • Ativar manualmente: a caixa delimitadora não fica visível automaticamente. Você pode ativá-lo manualmente por meio de um script acessando a propriedade boundingBox.Active.

Escala mínima

A escala mínima permitida. Essa propriedade foi preterida e é preferível adicionar um MinMaxScaleConstraint script. Se esse script for adicionado, a escala mínima será retirada dele em vez da caixa delimitadora.

Escala máxima

A escala máxima permitida. Essa propriedade foi preterida e é preferível adicionar um MinMaxScaleConstraint script. Se esse script for adicionado, a escala máxima será obtida dele em vez da caixa delimitadora.

Exibição da caixa

Várias opções de visualização de caixa delimitadora.

Se Flatten Axis for definido como Flatten Auto, o script não permitirá a manipulação ao longo do eixo com a menor extensão. Isso resulta em uma caixa delimitadora 2D, que geralmente é usada para objetos finos.

Alças

Você pode atribuir o material e o pré-fabricado para substituir o estilo do identificador. Se nenhum identificador for atribuído, eles serão exibidos no estilo padrão.

Eventos

A caixa delimitadora fornece os eventos a seguir. Este exemplo usa esses eventos para reproduzir comentários em áudio.

  • Girar Iniciado: acionado quando a rotação é iniciada.
  • Girar Encerrado: acionado quando a rotação termina.
  • Scale Started: é acionado quando o dimensionamento é iniciado.
  • Escala encerrada: é acionado quando o dimensionamento termina.
Events

Manipular estilos

Por padrão, quando você apenas atribuir o BoundingBox.cs script, ele mostrará o identificador do estilo de HoloLens 1ª geração. Para usar HoloLens dois identificadores de estilo, você precisa atribuir pré-fabricados e materiais adequados ao identificador.

Bounding Box Handle Styles

Abaixo estão os pré-fabricados, os materiais e os valores de dimensionamento para as alças da caixa delimitadora de estilo HoloLens 2. Você pode encontrar este exemplo na BoundingBoxExamples cena.

HandStyles 2

Identificadores (Configuração para HoloLens estilo 2)

  • Manipular Material: BoundingBoxHandleWhite.mat
  • Manipular material agarrado: BoundingBoxHandleBlueGrabbed.mat
  • Pré-fabricado do Identificador de Escala: MRTK_BoundingBox_ScaleHandle.prefab
  • Pré-fabricado de Ardósia do Identificador de Escala: MRTK_BoundingBox_ScaleHandle_Slate.prefab
  • Tamanho da alça de escala: 0,016 (1,6cm)
  • Preenchimento do Colisor do Identificador de Escala: 0,016 (torna o colisor agarrável um pouco maior que o visual do identificador)
  • Pré-fabricado do Identificador de Rotação: MRTK_BoundingBox_RotateHandle.prefab
  • Tamanho do identificador de rotação: 0,016
  • Preenchimento do Colisor do Identificador de Rotação: 0,016 (torna o colisor agarravel um pouco maior que o visual do identificador)

Proximidade (Configuração para HoloLens estilo 2)

Mostrar e ocultar as alças com animação com base na distância até as mãos. Ele tem animação de dimensionamento em duas etapas.

Proximity
  • Efeito de proximidade ativo: habilitar ativação de identificador baseado em proximidade
  • Lidar com a proximidade média: distância para o dimensionamento da 1ª etapa
  • Lidar com proximidade próxima: distância para o dimensionamento da 2ª etapa
  • Escala distante: valor de escala padrão do ativo de identificador quando as mãos estão fora do intervalo da interação da caixa delimitadora (distância definida acima por 'Manipular Proximidade Média'. Use 0 para ocultar o identificador por padrão)
  • Escala Média: valor de escala do ativo de identificador quando as mãos estiverem dentro do intervalo da interação da caixa delimitadora (distância definida acima por 'Manipular Proximidade Próxima'. Usar 1 para mostrar o tamanho normal)
  • Fechar Escala: valor de escala do ativo de identificador quando as mãos estiverem dentro do intervalo da interação de captura (distância definida acima por 'Manipular Proximidade Próxima'. Use 1.x para mostrar tamanho maior)

Tornando um objeto móvel com manipulador de manipulação

Uma caixa delimitadora pode ser combinada ManipulationHandler.cs para tornar o objeto móvel usando interação distante. O manipulador de manipulação dá suporte a interações de uma e duas mãos. O acompanhamento manual pode ser usado para interagir com um objeto de perto.

Manipulation Handler

Para que as bordas da caixa delimitadora se comportem da mesma maneira ao movê-la usando ManipulationHandlera interação distante de ', é recomendável conectar seus eventos para On Manipulation Started / On Manipulation EndedBoundingBox.HighlightWires / BoundingBox.UnhighlightWires, respectivamente, conforme mostrado na captura de tela acima.

Migrando para o controle de limites

Pré-fabricados e instâncias existentes usando a caixa delimitadora podem ser atualizados para o novo controle de limites por meio da janela de migração que faz parte do pacote de ferramentas mrtk.

Para atualizar instâncias individuais da caixa delimitadora, também há uma opção de migração dentro do inspetor de propriedades do componente.

Bounds Control Migrate