Controle de limites – MRTK2

Bounds control

BoundsControl é o novo componente para comportamento de manipulação, encontrado anteriormente no BoundingBox. O controle de limites faz uma série de 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. Os 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. No 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.

Bounds control Example

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 será o padrão para 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á perto do objeto.
  • Ativar por ponteiro: o controle de limites fica visível quando é direcionado por um ponteiro de raios muários.
  • Ativar por proximidade e ponteiro: o controle de limites fica visível quando é direcionado por um ponteiro de raios muário ou uma mão articulada está perto do objeto.
  • Ativar manualmente: o controle de limites não fica 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 ardósias. Se o eixo de nivelamento for definido como Flatten Auto , o script escolherá automaticamente o eixo com a menor extensão como eixo de nivelamento.

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 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 scriptáveis e compartilhados entre instâncias ou pré-fabricados diferentes. As configurações podem ser compartilhadas e vinculadas como arquivos de ativos com script individuais ou ativos aninhados que podem ser scripts 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 modfeito 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 da caixa

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 de caixa. As seguintes propriedades podem ser configuradas:

  • Material de 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 por meio de interação próxima ou distante.
  • Escala de exibição do eixo de nivelamento: uma escala que é aplicada à exibição de 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.

  • Manipule o material: material aplicado aos identificadores.
  • Manipule o material capturado: material aplicado à alça agarrada.
  • Manipular pré-fabricado: pré-fabricado opcional para o identificador de escala. Se não 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 do identificador.
  • Desenhar a corda 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 esse colisor.
  • Manipular pré-fabricado de ardósia: 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.

  • Manipule o material: material aplicado aos identificadores.
  • Manipule o material capturado: material aplicado à alça agarrada.
  • Manipular pré-fabricado: pré-fabricado opcional para o identificador. Se não 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 do identificador.
  • Desenhar a corda 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 esse colisor.
  • Manipular o tipo de colisor de pré-fabricado: tipo de colisão a ser usado com o identificador criado.
  • Mostrar identificador para X: controla a visibilidade da alça 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.

  • Manipule o material: material aplicado aos identificadores.
  • Manipule o material capturado: material aplicado à alça agarrada.
  • Manipular pré-fabricado: pré-fabricado opcional para o identificador. Se não 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 do identificador.
  • Desenhar a corda 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 esse colisor.
  • Manipular tipo de colisor pré-fabricado: tipo de colisão 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 de wireframe: a espessura do wireframe.
  • Forma de wireframe: a forma do wireframe 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 comportamento de estilo 2.

Bounds control Proximity
  • Efeito de proximidade ativo: habilitar ativação de 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 da interação de controle de limites (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)
  • Taxa de Crescimento Distante: Classificar um objeto dimensionado por proximidade é dimensionado quando a mão se move de uma proximidade média para distante.
  • Taxa de Crescimento Médio: Classificar um objeto dimensionado por proximidade é dimensionado quando a mão se move da proximidade média para próxima.
  • Taxa de Crescimento Próxima: Classificar um objeto dimensionado por proximidade é dimensionado quando a mão se move de perto para o centro de objetos.

Sistema de Restrição

O controle Bounds dá suporte ao uso do gerenciador de restrições para limitar ou modificar o comportamento de conversã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.

Bounds control Constraints

Eventos

O controle Bounds 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 Parado: acionado quando a rotação for interrompida.
  • Scale Started: é acionado quando o dimensionamento é iniciado.
  • Escala interrompida: é acionada quando o dimensionamento para.
  • Traduzir Iniciado: é acionado quando a tradução é iniciada.
  • Traduzir Parado: é acionado quando a tradução é interrompida.
Bounds control Events

Elásticos (experimental)

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 do gerenciador de elásticos existente ou crie e vincule um novo gerenciador de elásticos por meio do Add Elastics Manager botão.

Bounds control Elastics

Manipular estilos

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

Bounds Control Handle Styles 2

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

Bounds control HandleStyles

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)

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

Um controle de limites pode ser usado em combinação para ObjectManipulator.cs 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.

Bounds control Object Manipulator

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 Manipulação Iniciada / na Manipulação EncerradaBoundsControl.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 Substituir Objeto de Destino e Limites no inspetor para atribuir objeto específico e colisor no objeto com vários componentes filho.

Bounds Control

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

  1. GameObject de cubo de instanciação

    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 scriptáveis (consulte as propriedades do Inspetor e a seção Configurações 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 'Recursos' do Unity ou o Shader.Find para carregar sombreadores dinamicamente, pois as permutações de sombreador podem estar ausentes em 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 depois de 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 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

Confira também