Caixa delimitadora — MRTK2

Caixa delimitadora

Nota

A caixa delimitadora é preterida e substituída pelo controlo de limites sucessor. Utilize uma das opções de migração para atualizar objetos de jogo existentes.

O BoundingBox.cs script fornece funcionalidades básicas para transformar objetos na realidade mista. Uma caixa delimitadora irá mostrar um cubo à volta do holograma para indicar que pode ser interagido. As alças nos cantos e arestas do cubo permitem dimensionar ou rodar o objeto. A caixa delimitadora também reage à entrada do utilizador. No HoloLens 2, por exemplo, a caixa delimitadora responde à proximidade do dedo, fornecendo feedback visual para ajudar a perceber a distância do objeto. Todas as interações e elementos visuais podem ser facilmente personalizados.

Para obter mais informações, veja Caixa delimitadora e Barra de aplicações no Windows Dev Center.

Cena de exemplo

Pode encontrar exemplos de configurações de caixas delimitadoras no BoundingBoxExamples cenário.

Exemplos de Caixa Delimitadora

Como adicionar e configurar uma caixa delimitadora com o Inspetor do Unity

  1. Adicionar o Colisor de Caixas a um objeto
  2. Atribuir BoundingBox script a um objeto
  3. Configurar opções, como métodos de "Ativação" (veja a secção Propriedades do inspetor abaixo)
  4. (Opcional) Atribuir pré-fabricados e materiais para uma caixa delimitadora de estilo HoloLens 2 (consulte a secção Processar estilos abaixo)

Nota

Utilize o campo Objeto de Destino e Substituição de Limites no inspetor para atribuir objetos e colisões específicos no objeto com vários componentes subordinados.

Caixa Delimitadora 1

Como adicionar e configurar uma caixa delimitadora no código

  1. Instanciar o GameObject do cubo

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

    private BoundingBox bbox;
    bbox = cube.AddComponent<BoundingBox>();
    
  3. Configurar opções (veja a secçã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. Isto ainda requer atribuições através do inspetor, uma vez que os materiais e os pré-fabricados devem ser carregados dinamicamente.

Nota

A utilização da pasta "Recursos" do Unity ou shader.Find para carregar sombreados dinamicamente não é recomendada, uma vez que as permutações de sombreado podem estar em falta no 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 o dimensionamento mínimo de caixas delimitadoras máximo com MinMaxScaleConstraint

Para definir a escala mínima e máxima, utilize o MinMaxScaleConstraint. Também pode utilizar 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 à volta de um objeto de jogo

Para adicionar uma caixa delimitadora à volta de um objeto, basta adicionar um BoundingBox componente ao mesmo:

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

Propriedades do inspetor

Objeto de destino

Esta propriedade especifica que objeto será transformado pela manipulação de caixa delimitadora. Se nenhum objeto estiver definido, a caixa delimitadora é predefinida 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

Existem várias opções para ativar a interface de caixa delimitadora.

  • Ativar Em Início: a caixa Delimitação fica visível assim que a cena é iniciada.
  • Ativar Por Proximidade: a caixa Delimitação fica visível quando uma mão articulada está perto do objeto.
  • Ativar Por Ponteiro: a caixa delimitadora fica visível quando é alvo de um ponteiro de raios à mão.
  • Ativar Manualmente: a caixa Delimitação não fica visível automaticamente. Pode ativá-lo manualmente através de um script ao aceder à propriedade boundingBox.Active.

Mínimo de dimensionamento

A escala mínima permitida. Esta propriedade foi preterida e é preferível adicionar um MinMaxScaleConstraint script. Se este script for adicionado, o dimensionamento mínimo será retirado do mesmo em vez de da caixa delimitadora.

Dimensionar máximo

A escala máxima permitida. Esta propriedade foi preterida e é preferível adicionar um MinMaxScaleConstraint script. Se este script for adicionado, o dimensionamento máximo será retirado do mesmo em vez de da caixa delimitadora.

Ecrã de caixa

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

Se o Eixo Achatado estiver definido como Aplanar Automático, o script não permitirá a manipulação ao longo do eixo com a menor extensão. Isto resulta numa caixa delimitadora 2D, que normalmente é utilizada para objetos finos.

Identificadores

Pode atribuir o material e a pré-fabricada para substituir o estilo da alça. Se não forem atribuídas alças, serão apresentadas no estilo predefinido.

Evento

A caixa delimitadora fornece os seguintes eventos. Este exemplo utiliza estes eventos para reproduzir feedback de áudio.

  • Rodar Iniciado: acionado quando a rotação é iniciada.
  • Rodar Terminado: acionado quando a rotação termina.
  • Dimensionamento Iniciado: aciona quando o dimensionamento é iniciado.
  • Escala Terminada: aciona quando o dimensionamento termina.
Evento

Processar estilos

Por predefinição, quando atribuir o BoundingBox.cs script, este irá mostrar a alça do estilo de primeira geração do HoloLens. Para utilizar HoloLens 2 alças de estilo, tem de atribuir pré-fabricados e materiais de identificador adequados.

Estilos de Identificador de Caixa Delimitadora

Seguem-se os pré-fabricados, os materiais e os valores de dimensionamento das alças de caixa delimitadoras de estilo HoloLens 2. Pode encontrar este exemplo na BoundingBoxExamples cena.

HandStyles 2

Identificadores (Configuração para HoloLens 2 estilo)

  • Handle Material: BoundingBoxHandleWhite.mat
  • Handle Grabbed Material: BoundingBoxHandleBlueGrabbed.mat
  • Pré-fabricada da Alça de Dimensionamento: MRTK_BoundingBox_ScaleHandle.prefab
  • Pré-fabricador de Ardósia da Alça de Dimensionamento: MRTK_BoundingBox_ScaleHandle_Slate.prefab
  • Tamanho da Alça de Dimensionamento: 0,016 (1,6cm)
  • Preenchimento do Colisor de Alças de Dimensionamento: 0.016 (torna o colisor agarrável ligeiramente maior do que o elemento visual de alça)
  • Rotação Alça Prefab: MRTK_BoundingBox_RotateHandle.prefab
  • Tamanho da Alça de Rotação: 0,016
  • Preenchimento do Colisor de Alças de Rotação: 0,016 (torna o colisor agarrável ligeiramente maior do que o elemento visual de alça)

Proximidade (Configuração para o estilo HoloLens 2)

Mostrar e ocultar as alças com animação com base na distância até às mãos. Tem animação de dimensionamento de dois passos.

Proximidade
  • Efeito de Proximidade Ativo: Ativar a ativação da alça baseada na proximidade
  • Processar Proximidade Média: Distância para o dimensionamento do primeiro passo
  • Lidar com Close Closey: Distance for the 2nd step scaling (Fechar Proximidade: Distância para o dimensionamento do segundo passo)
  • Escala Distante: valor de dimensionamento predefinido do recurso da alça quando as mãos estão fora do intervalo da interação da caixa delimitadora (distância definida acima por "Processar Proximidade Média". Utilizar 0 para ocultar a alça por predefinição)
  • Escala Média: valor de dimensionamento do recurso da alça quando as mãos estão dentro do intervalo da interação da caixa delimitadora (distância definida acima por "Processar Proximidade". Utilizar 1 para mostrar o tamanho normal)
  • Fechar Escala: valor de dimensionamento do recurso da alça quando as mãos estão dentro do intervalo da interação de captura (distância definida acima por "Lidar com Proximidade". Utilizar 1.x para mostrar um tamanho maior)

Tornar um objeto móvel com processador de manipulação

Uma caixa delimitadora pode ser combinada com ManipulationHandler.cs para tornar o objeto móvel através de interação distante. O processador de manipulação suporta interações de uma e duas mãos. O controlo manual pode ser utilizado para interagir com um objeto de perto.

Processador de Manipulação

Para que as margens das caixas delimitadoras se comportem da mesma forma ao movê-la através ManipulationHandlerda "interação extrema", recomenda-se que ligue os eventos para Manipulação Iniciada / EmManipulaçãoBoundingBox.HighlightWires / BoundingBox.UnhighlightWires Iniciada, respetivamente, conforme mostrado na captura de ecrã acima.

Migrar para o controlo de limites

Os pré-fabricados e as instâncias existentes que utilizam a caixa delimitadora podem ser atualizados para o novo controlo de limites através da janela de migração que faz parte do pacote de ferramentas do MRTK.

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

Migração de Controlo de Limites