Controle de limites – MRTK2

Controle de limites

BoundsControl é o novo componente para o comportamento de manipulação, encontrado anteriormente em BoundingBox. O controle de limites faz várias melhorias e simplificações na instalação e adiciona novos recursos. Esse componente é uma substituição para a caixa delimitadora, que será preterida.

O BoundsControl.cs script fornece funcionalidade básica para transformar objetos em realidade misturada. Um controle de limites mostrará uma caixa ao redor do holograma para indicar que ele pode ser interagido. Identificadores nos cantos e bordas da caixa permitem dimensionar, girar ou traduzir o objeto. O controle de limites também reage à entrada do usuário. Em HoloLens 2, por exemplo, o controle de limites 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.

Cena de exemplo

Você pode encontrar exemplos de configurações de controle de limites na BoundsControlExamples cena.

Exemplo de controle de limites

Propriedades do inspetor

Objeto de destino

Essa propriedade especifica qual objeto será transformado pela manipulação de controle de limites. Se nenhum objeto for definido, ele usará como padrão o objeto proprietário.

Comportamento de ativação

Há várias opções para ativar a interface de controle de limites.

  • Ativar Ao Iniciar: o controle limites fica visível quando a cena é iniciada.
  • Ativar por proximidade: o controle de limites fica visível quando uma mão articulada está próxima do objeto.
  • Ativar por ponteiro: o controle de limites fica visível quando é direcionado por um ponteiro de raio de mão.
  • Ativar por proximidade e ponteiro: o controle de limites fica visível quando é direcionado por um ponteiro de raio de mão ou uma mão articulada está perto do objeto.
  • Ativar Manualmente: o controle de limites não se torna visível automaticamente. Você pode ativá-lo manualmente por meio de um script acessando a propriedade boundsControl.Active.

Substituição de limites

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

Preenchimento de caixa

Adiciona um preenchimento aos limites do colisor usados para calcular as extensões do controle. Isso influenciará não apenas a interação, mas também afetará os visuais.

Eixo de nivelamento

Indica se o controle é achatado em um dos eixos, tornando-o bidimensional e não permitindo a manipulação ao longo desse eixo. Esse recurso pode ser usado para objetos finos, como slates. Se o eixo de mesclagem for definido como Nivelar Automaticamente , o script escolherá automaticamente o eixo com a menor extensão como eixo de mesclagem.

Suavização

A seção de suavização permite configurar o comportamento de suavização para escala e rotação do controle.

Visuais

A aparência do controle de limites pode ser configurada modificando uma das configurações visuais correspondentes. As configurações visuais são objetos com script vinculados ou embutidos e são descritas mais detalhadamente na seção do objeto de configuração.

Objetos de configuração

O controle vem com um conjunto de objetos de configuração que podem ser armazenados como objetos com script e compartilhados entre instâncias ou pré-fabricados diferentes. As configurações podem ser compartilhadas e vinculadas como arquivos de ativos de script individuais ou ativos aninhados que podem ser gerados por script dentro de pré-fabricados. Outras configurações também podem ser definidas diretamente na instância sem vincular a um ativo script externo ou aninhado.

O inspetor de controle de limites indicará se uma configuração é compartilhada ou embutida como parte da instância atual, mostrando uma mensagem no inspetor de propriedades. Além disso, as instâncias compartilhadas não serão editáveis diretamente na própria janela de propriedade de controle de limites, mas, em vez disso, o ativo ao qual ele está vinculando precisa ser diretamente modfiado para evitar alterações acidentais nas configurações compartilhadas.

Atualmente, o controle de limites oferece opções de objetos de configuração para os seguintes recursos:

Configuração do box

A configuração da caixa é responsável por renderizar uma caixa sólida com limites definidos por meio do tamanho do colisor e do preenchimento da caixa. As seguintes propriedades podem ser configuradas:

  • Material da caixa: define o material aplicado à caixa renderizada quando nenhuma interação ocorre. Uma caixa só será renderizada se esse material estiver definido.
  • Material capturado por caixa: material para a caixa quando o usuário interage com o controle, agarrando-se por meio de interação próxima ou distante.
  • Nivelar a escala de exibição do eixo: uma escala que é aplicada à exibição da caixa se um dos eixos for achatado.

Configuração de identificadores de escala

Essa gaveta de propriedades permite modificar o comportamento e a visualização de alças de escala do controle de limites.

  • Material de identificador: material aplicado às alças.
  • Identificador de material agarrado: material aplicado à alça agarrada.
  • Manipular pré-fabricado: pré-fabricado opcional para o identificador de escala. Se non for definido, o MRTK usará um cubo como padrão.
  • Tamanho da alça: tamanho do identificador de escala.
  • Preenchimento do colisor: preenchimento a ser adicionado ao colisor de identificador.
  • Desenhar tether ao manipular: quando ativo desenhará uma linha de corda do ponto de início da interação para a posição atual da mão ou do ponteiro.
  • As alças ignoram o colisor: se um colisor for vinculado aqui, as alças ignorarão qualquer colisão com este colisor.
  • Manipular o pré-fabricado slate: pré-fabricado a ser usado para o identificador quando o controle é achatado.
  • Mostrar identificadores de escala: controla a visibilidade do identificador.
  • Comportamento de escala: pode ser definido como dimensionamento uniforme ou não uniforme.

Configuração de identificadores de rotação

Essa configuração define o comportamento do identificador de rotação.

  • Material de identificador: material aplicado às alças.
  • Identificador de material agarrado: material aplicado à alça agarrada.
  • Manipular pré-fabricado: pré-fabricado opcional para o identificador. Se non for definido, o MRTK usará uma esfera como padrão.
  • Tamanho da alça: tamanho do identificador.
  • Preenchimento do colisor: preenchimento a ser adicionado ao colisor de identificador.
  • Desenhar tether ao manipular: quando ativo desenhará uma linha de corda do ponto de início da interação para a posição atual da mão ou do ponteiro.
  • As alças ignoram o colisor: se um colisor for vinculado aqui, as alças ignorarão qualquer colisão com este colisor.
  • Manipular tipo de colisor pré-fabricado: tipo de colisor a ser usado com o identificador criado.
  • Mostrar identificador para X: controla a visibilidade do identificador do eixo X.
  • Mostrar identificador para Y: controla a visibilidade do identificador do eixo Y.
  • Mostrar identificador para Z: controla a visibilidade do identificador do eixo Z.

Configuração de identificadores de tradução

Permite habilitar e configurar identificadores de tradução para o controle de limites. Observe que os identificadores de tradução estão desabilitados por padrão.

  • Material de identificador: material aplicado às alças.
  • Identificador de material agarrado: material aplicado à alça agarrada.
  • Manipular pré-fabricado: pré-fabricado opcional para o identificador. Se non for definido, o MRTK usará uma esfera como padrão.
  • Tamanho da alça: tamanho do identificador.
  • Preenchimento do colisor: preenchimento a ser adicionado ao colisor de identificador.
  • Desenhar tether ao manipular: quando ativo desenhará uma linha de corda do ponto de início da interação até a posição atual da mão ou do ponteiro.
  • Identificadores ignoram o colisor: se um colisor for vinculado aqui, as alças ignorarão qualquer colisão com esse colisor.
  • Manipular tipo de colisor de pré-fabricado: tipo de colisor a ser usado com o identificador criado.
  • Mostrar identificador para X: controla a visibilidade do identificador do eixo X.
  • Mostrar identificador para Y: controla a visibilidade do identificador do eixo Y.
  • Mostrar identificador para Z: controla a visibilidade do identificador do eixo Z.

A configuração de links habilita o recurso wireframe do controle bounds. As seguintes propriedades podem ser configuradas:

  • Material de wireframe: o material aplicado à malha de wireframe.
  • Raio de borda do wireframe: a espessura do fio.
  • Forma do fio: a forma do fio pode ser cúbica ou cilíndrica.
  • Mostrar wireframe: controla a visibilidade do wireframe.

Configuração do efeito de proximidade

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. Os padrões são definidos como HoloLens 2 comportamento de estilo.

Controle de limites Proximidade
  • Efeito de proximidade Ativo: habilitar a ativação do identificador baseado em proximidade
  • Proximidade Média do Objeto: Distância para o dimensionamento da 1ª etapa
  • Proximidade do objeto: 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 de controle de limites (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 de interação de controle de limites (distância definida acima por 'Manipular Proximidade Próxima'. Use 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'. Usar 1.x para mostrar tamanho maior)
  • Taxa de aumento distante: classifique uma escala de objeto dimensionada por proximidade quando a mão se move de proximidade média para distante.
  • Taxa de Crescimento Média: classifique uma escala de objeto dimensionada por proximidade quando a mão se move de proximidade média para próxima.
  • Fechar Taxa de Aumento: classifique uma escala de objeto dimensionada por proximidade quando a mão se move da proximidade próxima ao centro do objeto.

Sistema de Restrição

O controle bounds dá suporte ao uso do gerenciador de restrições para limitar ou modificar o comportamento de tradução, rotação ou dimensionamento ao usar identificadores de controle de limites.

O inspetor de propriedades mostrará todos os gerentes de restrição disponíveis anexados ao mesmo objeto de jogo em uma lista suspensa com uma opção para rolar e realçar o gerenciador de restrições selecionado.

Restrições de controle de limites

Eventos

O controle Bounds 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 Parado: acionado quando a rotação é interrompida.
  • Dimensionamento iniciado: é acionado quando o dimensionamento é iniciado.
  • Escala interrompida: é acionada quando o dimensionamento é interrompido.
  • Traduzir Iniciado: é acionado quando a tradução é iniciada.
  • Traduzir Parado: é acionado quando a tradução é interrompida.
Eventos de controle de limites

Elásticos (experimental)

Os elásticos podem ser usados ao manipular objetos por meio do controle bounds. Observe que o sistema elástico ainda está em estado experimental. Para habilitar elásticos, vincule um componente existente do gerenciador de elásticos ou crie e vincule um novo gerenciador de elásticos por meio do Add Elastics Manager botão.

Controle de limites Elásticos

Estilos de identificador

Por padrão, quando você apenas atribuir o BoundsControl.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.

Estilos de identificador de controle de limites 2

Abaixo estão os pré-fabricados, os materiais e os valores de dimensionamento para os identificadores de controle de limites de estilo HoloLens 2. Você pode encontrar este exemplo na BoundsControlExamples cena.

Controle de limites HandleStyles

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)

Alterações de transformação com manipulador de objeto

Um controle de limites pode ser usado em combinação com ObjectManipulator.cs para permitir determinados tipos de manipulação (por exemplo, mover o objeto) sem usar identificadores. 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.

Controle de limites Manipulador de Objetos

Para que as bordas de controle de limites se comportem da mesma maneira ao movê-lo usando ObjectManipulatora interação distante, é recomendável conectar seus eventos para On Manipulation Started / On Manipulation Ended para BoundsControl.HighlightWires / BoundsControl.UnhighlightWires , respectivamente, conforme mostrado na captura de tela acima.

Como adicionar e configurar um controle de limites usando o Unity Inspector

  1. Adicionar o Colisor de Caixa a um objeto
  2. Atribuir BoundsControl 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 um controle de limites 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.

Controle de limites

Como adicionar e configurar um controle de limites no código

  1. Instanciar cubo GameObject

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

    private BoundsControl boundsControl;
    boundsControl = cube.AddComponent<BoundsControl>();
    
  3. Configurar opções diretamente no controle ou por meio de uma das configurações com script (consulte a seção Propriedades e Configurações do Inspetor abaixo)

    // Change activation method
    boundsControl.BoundsControlActivation = BoundsControlActivationType.ActivateByProximityAndPointer;
    // Make the scale handles large
    boundsControl.ScaleHandlesConfig.HandleSize = 0.1f;
    // Hide rotation handles for x axis
    boundsControl.RotationHandlesConfig.ShowRotationHandleForX = false;
    
  4. (Opcional) Atribua pré-fabricados e materiais para um controle de limites 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.

BoxDisplayConfiguration boxConfiguration = boundsControl.BoxDisplayConfig;
boxConfiguration.BoxMaterial = [Assign BoundingBox.mat]
boxConfiguration.BoxGrabbedMaterial = [Assign BoundingBoxGrabbed.mat]
ScaleHandlesConfiguration scaleHandleConfiguration = boundsControl.ScaleHandlesConfig;
scaleHandleConfiguration.HandleMaterial = [Assign BoundingBoxHandleWhite.mat]
scaleHandleConfiguration.HandleGrabbedMaterial = [Assign BoundingBoxHandleBlueGrabbed.mat]
scaleHandleConfiguration.HandlePrefab = [Assign MRTK_BoundingBox_ScaleHandle.prefab]
scaleHandleConfiguration.HandleSlatePrefab = [Assign MRTK_BoundingBox_ScaleHandle_Slate.prefab]
scaleHandleConfiguration.HandleSize = 0.016f;
scaleHandleConfiguration.ColliderPadding = 0.016f;
RotationHandlesConfiguration rotationHandleConfiguration = boundsControl.RotationHandlesConfig;
rotationHandleConfiguration.HandleMaterial = [Assign BoundingBoxHandleWhite.mat]
rotationHandleConfiguration.HandleGrabbedMaterial = [Assign BoundingBoxHandleBlueGrabbed.mat]
rotationHandleConfiguration.HandlePrefab = [Assign MRTK_BoundingBox_RotateHandle.prefab]
rotationHandleConfiguration.HandleSize = 0.016f;
rotationHandleConfiguration.ColliderPadding = 0.016f;

Exemplo: definir a escala de controle mínima e máxima de limites usando MinMaxScaleConstraint

Para definir a escala mínima e máxima, anexe um MinMaxScaleConstraint ao controle. Como o controle bounds anexa e ativa automaticamente o gerenciador de restrições, o MinMaxScaleConstraint será aplicado automaticamente às alterações de transformação quando ele for anexado e configurado.

Você também pode usar MinMaxScaleConstraint para definir a escala mínima e máxima para ObjectManipulator.

GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
bcontrol = cube.AddComponent<BoundsControl>();
// Important: BoundsControl creates a constraint manager on start if one does not exist.
// There's no need to manually attach a constraint manager.
MinMaxScaleConstraint scaleConstraint = bcontrol.gameObject.AddComponent<MinMaxScaleConstraint>();
scaleConstraint.ScaleMinimum = 1f;
scaleConstraint.ScaleMaximum = 2f;

Exemplo: adicionar controle de limites em torno de um objeto de jogo

Para adicionar um controle de limites em torno de um objeto, basta adicionar um BoundsControl componente a ele:

private void PutABoundsControlAroundIt(GameObject target)
{
   target.AddComponent<BoundsControl>();
}

Migrando da Caixa deLimitadora

As pré-fabricados e instâncias existentes que usam 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, há também uma opção de migração dentro do inspetor de propriedades do componente.

Controle de limites Migrar

Confira também