Caixa delimitadora — MRTK2
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. 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 Caixa delimitadora e Barra de aplicativos no Centro de Desenvolvimento do Windows.
Cena de exemplo
Você pode encontrar exemplos de configurações de caixa delimitadora na BoundingBoxExamples
cena.
Como adicionar e configurar uma caixa delimitadora usando o Unity Inspector
- Adicionar o Colisor de Caixa a um objeto
- Atribuir
BoundingBox
script a um objeto - Configurar opções, como métodos de 'Ativação' (consulte a seção Propriedades do inspetor abaixo)
- (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 Objeto de Destino e Substituição de Limites no inspetor para atribuir objeto e colisor específicos no objeto com vários componentes filho.
Como adicionar e configurar uma caixa delimitadora no código
Instanciar cubo GameObject
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
Atribuir
BoundingBox
script a um objeto com colisor usando AddComponent<>()private BoundingBox bbox; bbox = cube.AddComponent<BoundingBox>();
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;
(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 'Resources' do Unity ou o Shader.Find para carregar sombreadores dinamicamente, pois as permutações de sombreador podem estar ausentes 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 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 ao redor de um objeto de jogo
Para adicionar uma caixa delimitadora ao redor 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 usará como padrão o objeto owner.
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 Ao Iniciar: a caixalimitadora fica visível quando a cena é iniciada.
- Ativar por proximidade: a caixa delimitadora fica visível quando uma mão articulada está próxima 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.
Mínimo de escala
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á obtida dele em vez de na caixa delimitadora.
Máximo de escala
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 de na caixa delimitadora.
Exibição de 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 de áudio.
- Girar Iniciado: acionado quando a rotação é iniciada.
- Girar Encerrado: acionado quando a rotação termina.
- Dimensionamento iniciado: é acionado quando o dimensionamento é iniciado.
- Escala encerrada: é acionada quando o dimensionamento termina.
Estilos de identificador
Por padrão, quando você apenas atribuir o BoundingBox.cs
script, ele mostrará o identificador do estilo de 1ª geração do HoloLens. Para usar HoloLens 2 identificadores de estilo, você precisa atribuir pré-fabricados e materiais de identificador adequados.
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.
Identificadores (Configuração para HoloLens 2 estilo)
- Material de identificador: 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 do identificador 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 agarrável um pouco maior que o visual do identificador)
Proximidade (Configuração para HoloLens 2 estilo)
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.
- Efeito de proximidade Ativo: habilitar a ativação do 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 do identificador quando as mãos estiverem dentro do intervalo da interação da caixa delimitadora (distância definida acima por 'Tratar proximidade próxima'. Usar 1 para mostrar o tamanho normal)
- Fechar Escala: valor de escala do ativo do identificador quando as mãos estiverem dentro do intervalo da interação de captura (distância definida acima por 'Tratar proximidade próxima'. Usar 1.x para mostrar um tamanho maior)
Tornando um objeto móvel com manipulador de manipulação
Uma caixa delimitadora pode ser combinada com 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.
Para que as bordas da caixa delimitadora se comportem da mesma maneira ao movê-la usando ManipulationHandler
a interação distante de , é recomendável conectar seus eventos para On Manipulation Started / On Manipulation Ended , BoundingBox.HighlightWires
/ BoundingBox.UnhighlightWires
respectivamente, conforme mostrado na captura de tela acima.
Migrando para o controle de limites
As pré-fabricados e instâncias existentes usando a caixa delimitadora podem ser atualizadas para o novo controle de limites por meio da janela de migração que faz parte do pacote de ferramentas do 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.