Controle de limites

Bounds control

BoundsControl é o novo componente para comportamento de manipulação, encontrado anteriormente no BoundingBox. O controle bounds 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.

Exemplo de cena

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 No Início: o controle Bounds fica visível quando a cena é iniciada.
  • Ativar por proximidade: o controle Bounds fica visível quando uma mão articulada está perto do objeto.
  • Ativar por ponteiro: o controle bounds fica visível quando é direcionado por um ponteiro de raios muários.
  • Ativar por proximidade e ponteiro: o controle Bounds fica visível quando ele é direcionado por um ponteiro de raios muários ou uma mão articulada está perto do objeto.
  • Ativar manualmente: o controle Bounds 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 é nivelado 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 scripts vinculados ou embutidos e são descritas com mais detalhes na seção de 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 scriptáveis individuais ou ativos aninhados de script dentro de pré-fabricados. Outras configurações também podem ser definidas diretamente na instância sem vincular a um ativo scriptlizável 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 deve 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 de caixa

A configuração da caixa é responsável por renderizar uma caixa sólida com limites definidos por meio do preenchimento de caixa e tamanho do colisor. 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-se por meio de interação próxima ou distante.
  • Escala de exibição de eixo de nivelamento: uma escala que é aplicada à exibição da caixa se um dos eixos for nivelado.

Configuração de identificadores de escala

Essa gaveta de propriedades permite modificar o comportamento e a visualização de identificadores de escala do controle bounds.

  • Manipule o material: material aplicado aos identificadores.
  • Manipular material capturado: material aplicado ao identificador agarrado.
  • 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 do identificador: tamanho do identificador de escala.
  • Preenchimento do colisor: preenchimento a ser adicionado ao colisor do identificador.
  • Desenhe 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.
  • Identificadores ignoram colisor: se um colisor for vinculado aqui, as alças ignorarão qualquer colisão com este colisor.
  • Manipular pré-fabricado de ardósia: pré-fabricado a ser usado para o identificador quando o controle é nivelado.
  • Mostrar identificadores de escala: controla a visibilidade do identificador.
  • Comportamento de escala: pode ser definido como dimensionamento uniforme ou não uniforme.

A rotação manipula a configuração

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

  • Manipule o material: material aplicado aos identificadores.
  • Manipular material capturado: material aplicado ao identificador agarrado.
  • 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.
  • Desenhe 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.
  • Identificadores ignoram 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 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 tradução manipula a configuração

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

  • Manipule o material: material aplicado aos identificadores.
  • Manipular material capturado: material aplicado ao identificador agarrado.
  • 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.

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

  • Material de estrutura de fio: o material aplicado à malha de wireframe.
  • Raio de borda do wireframe: a espessura do wireframe.
  • Forma de estrutura de arame: 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 os identificadores 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 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 alça quando as mãos estão fora do intervalo da interação de controle de limites (distância definida acima por 'Lidar com a Proximidade Média'. Usar 0 para ocultar o identificador por padrão)
  • Escala Média: valor de escala do ativo de alça quando as mãos estão dentro do intervalo da interação de controle de limites (distância definida acima por 'Tratar Proximidade'. Usar 1 para mostrar o tamanho normal)
  • Fechar Escala: valor de escala do ativo de alça quando as mãos estiverem dentro do intervalo da interação de captura (distância definida acima por 'Tratar Proximidade'. Usar 1.x para mostrar tamanho maior)
  • Taxa de Crescimento Distante: Classificar um objeto dimensionado por proximidade é dimensionado quando a mão se move de proximidade média para distante.
  • Taxa de Crescimento Médio: Classificar um objeto dimensionado por proximidade é dimensionado quando a mão se move de proximidade média para próxima.
  • Taxa de Crescimento Próxima: Classificar um objeto dimensionado por proximidade é dimensionado quando a mão passa da proximidade com o centro de objetos.

Sistema de Restrições

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

Elásticos (experimental)

Os elásticos podem ser usados ao manipular objetos por meio do controle de limites. 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 HoloLens 1ª geração. Para usar HoloLens dois identificadores de estilo, você precisa atribuir pré-fabricados e materiais de identificador adequados.

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 agarravel um pouco maior que o visual do identificador)
  • Pré-fabricado do identificador de rotação: MRTK_BoundingBox_RotateHandle.prefab
  • Tamanho da alça 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 da alça)

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 a 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 Inspetor do Unity

  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. 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 que podem ser scriptadas (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 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 mínima de controle de limites máximos usando MinMaxScaleConstraint

Para definir a escala mínima e máxima, anexe um MinMaxScaleConstraint ao controle. À medida que o controle de limites 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 ao redor de um objeto, basta adicionar um BoundsControl componente a ele:

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

Migrando da Caixa deLimitadora

Pré-fabricados e instâncias existentes usando a caixa delimitadora podem ser atualizados 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