Caixa delimitadora — MRTK2
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.
Como adicionar e configurar uma caixa delimitadora com o Inspetor do Unity
- Adicionar o Colisor de Caixas a um objeto
- Atribuir
BoundingBox
script a um objeto - Configurar opções, como métodos de "Ativação" (veja a secção Propriedades do inspetor abaixo)
- (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.
Como adicionar e configurar uma caixa delimitadora no código
Instanciar o GameObject do cubo
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
Atribuir
BoundingBox
script a um objeto com colisão com AddComponent<>()private BoundingBox bbox; bbox = cube.AddComponent<BoundingBox>();
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;
(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.
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.
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.
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.
- 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.
Para que as margens das caixas delimitadoras se comportem da mesma forma ao movê-la através ManipulationHandler
da "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.