Controlo de limites — MRTK2

Controlo de limites

BoundsControl é o novo componente para o comportamento de manipulação, anteriormente encontrado na BoundingBox. O controlo bounds faz várias melhorias e simplificações na configuração e adiciona novas funcionalidades. Este componente substitui a caixa delimitadora, que será preterida.

O BoundsControl.cs script fornece funcionalidades básicas para transformar objetos na realidade mista. Um controlo de limites mostrará uma caixa à volta do holograma para indicar que pode ser interagido. As alças nos cantos e arestas da caixa permitem dimensionar, rodar ou traduzir o objeto. O controlo bounds também reage à entrada do utilizador. No HoloLens 2, por exemplo, o controlo de limites 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.

Cena de exemplo

Pode encontrar exemplos de configurações de controlo de limites na BoundsControlExamples cena.

Exemplo de controlo de limites

Propriedades do inspetor

Objeto de destino

Esta propriedade especifica que objeto será transformado pela manipulação de controlo de limites. Se nenhum objeto estiver definido, será predefinido para o objeto proprietário.

Comportamento de ativação

Existem várias opções para ativar a interface de controlo de limites.

  • Ativar Em Início: o controlo Limites fica visível assim que a cena é iniciada.
  • Ativar Por Proximidade: o controlo Limites fica visível quando uma mão articulada está perto do objeto.
  • Ativar Por Ponteiro: o controlo Limites fica visível quando é visado por um ponteiro de raios à mão.
  • Ativar por Proximidade e Ponteiro: o controlo Limites fica visível quando é visado por um ponteiro de raios à mão ou uma mão articulada está perto do objeto.
  • Ativar Manualmente: o controlo Limites não fica visível automaticamente. Pode ativá-lo manualmente através de um script ao aceder à 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 utilizados para calcular as extensões do controlo. Isto irá influenciar não só a interação, mas também afetar os elementos visuais.

Aplanar eixo

Indica se o controlo é achatado num dos eixos, tornando-o bidimensional e desativando a manipulação ao longo desse eixo. Esta funcionalidade pode ser utilizada para objetos finos, como ardósias. Se o eixo achatado estiver definido como Aplanar Automaticamente , o script escolherá automaticamente o eixo com a menor extensão como eixo achatado.

Suavização

A secção de suavização permite configurar o comportamento de suavização para dimensionar e rodar o controlo.

Visuais

O aspeto do controlo de limites pode ser configurado ao modificar uma das configurações de elementos visuais correspondentes. As configurações visuais estão ligadas ou são objetos scriptáveis inlinados e são descritas mais detalhadamente na secção objeto de configuração.

Objetos de Configuração

O controlo inclui um conjunto de objetos de configuração que podem ser armazenados como objetos scriptable e partilhados entre diferentes instâncias ou prefabs. As configurações podem ser partilhadas e ligadas como ficheiros de recursos scriptáveis individuais ou recursos aninhados em script dentro de pré-fabricados. As configurações adicionais também podem ser definidas diretamente na instância sem ligar a um recurso scriptable externo ou aninhado.

O inspetor de controlo de limites indicará se uma configuração é partilhada ou indicada como parte da instância atual ao mostrar uma mensagem no inspetor de propriedades. Além disso, as instâncias partilhadas não serão editáveis diretamente na própria janela de propriedade de controlo de limites, mas o recurso a que está a ligar tem de ser diretamente modfied para evitar alterações acidentais nas configurações partilhadas.

Atualmente, o controlo de limites oferece opções de objetos de configuração para as seguintes funcionalidades:

Configuração da caixa

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

  • Material de caixa: define o material aplicado à caixa composta quando não ocorre nenhuma interação. Uma caixa só será composta se este material estiver definido.
  • Box agarrou o material: material para a caixa quando o utilizador interage com o controlo agarrando através de interação próxima ou distante.
  • Dimensionamento do ecrã do eixo aplanado: uma escala que é aplicada à apresentação da caixa se um dos eixos estiver achatado.

Configuração de alças de dimensionamento

Esta gaveta de propriedades permite modificar o comportamento e a visualização das alças de dimensionamento do controlo de limites.

  • Processar material: material aplicado às alças.
  • Identificador de material agarrado: material aplicado à alça agarrada.
  • Processar pré-fabricada: pré-fabricada opcional para a alça de dimensionamento. Se não estiver definido, o MRTK utilizará um cubo como predefinição.
  • Tamanho da alça: tamanho da alça de dimensionamento.
  • Preenchimento do colisor: preenchimento para adicionar ao colisor de alças.
  • Desenhe tether ao manipular: quando ativo desenhará uma linha de tether 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 ligado aqui, as alças ignorarão qualquer colisão com este colisor.
  • Processar o prefáb de ardósia: pré-fabricado para utilizar para a alça quando o controlo é achatado.
  • Mostrar alças de dimensionamento: controla a visibilidade da alça.
  • Comportamento de dimensionamento: pode ser definido como dimensionamento uniforme ou não uniforme.

Configuração das alças de rotação

Esta configuração define o comportamento da alça de rotação.

  • Processar material: material aplicado às alças.
  • Identificador de material agarrado: material aplicado à alça agarrada.
  • Processar pré-fabricada: pré-fabricada opcional para a alça. Se não estiver definido, o MRTK utilizará uma esfera como predefinição.
  • Tamanho da alça: tamanho da alça.
  • Preenchimento do colisor: preenchimento para adicionar ao colisor de alças.
  • Desenhe tether ao manipular: quando ativo desenhará uma linha de tether 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 ligado aqui, as alças ignorarão qualquer colisão com este colisor.
  • Handle prefab collider type: collider type to be used with the created handle.
  • Mostrar alça para X: controla a visibilidade da alça do eixo X.
  • Mostrar alça para Y: controla a visibilidade da alça do eixo Y.
  • Mostrar alça para Z: controla a visibilidade da alça do eixo Z.

A tradução processa a configuração

Permite ativar e configurar identificadores de tradução para o controlo de limites. Tenha em atenção que as alças de tradução estão desativadas por predefinição.

  • Processar material: material aplicado às alças.
  • Identificador de material agarrado: material aplicado à alça agarrada.
  • Processar pré-fabricada: pré-fabricada opcional para a alça. Se não estiver definido, o MRTK utilizará uma esfera como predefinição.
  • Tamanho da alça: tamanho da alça.
  • Preenchimento do colisor: preenchimento para adicionar ao colisor de alças.
  • Desenhar tether ao manipular: quando estiver ativo, desenhe uma linha de tether do ponto de início da interação para a posição atual da mão ou do ponteiro.
  • Os identificadores ignoram o colisor: se um colisor for ligado aqui, as alças ignorarão qualquer colisão com este colisor.
  • Processar tipo de colisor pré-fabricado: tipo de colisor a ser utilizado com a alça criada.
  • Mostrar alça para X: controla a visibilidade da alça do eixo X.
  • Mostrar alça para Y: controla a visibilidade da alça do eixo Y.
  • Mostrar identificador para Z: controla a visibilidade da alça do eixo Z.

A configuração de ligações ativa a funcionalidade wireframe do controlo de limites. As seguintes propriedades podem ser configuradas:

  • Material de wireframe: o material aplicado à malha de wireframe.
  • Raio do limite do wireframe: a espessura do wireframe.
  • Forma de wireframe: a forma do wireframe pode ser de forma 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é às mãos. Tem animação de dimensionamento de dois passos. As predefinições estão definidas para HoloLens 2 comportamento de estilo.

Limites controlam a Proximidade
  • Efeito de Proximidade Ativo: Ativar a ativação do identificador baseado na proximidade
  • Proximidade Média do Objeto: Distância para o dimensionamento do primeiro passo
  • Proximidade do Objeto: Distância para o dimensionamento do segundo passo
  • Escala Distante: valor de dimensionamento predefinido do recurso de identificador quando as mãos estão fora do intervalo da interação de controlo de limites (distância definida acima por "Processar Proximidade Média". Utilizar 0 para ocultar a alça por predefinição)
  • Escala Média: dimensione o valor do recurso da alça quando as mãos estão dentro do intervalo da interação de controlo de limites (distância definida acima por "Lidar com Proximidade". Utilizar 1 para mostrar o tamanho normal)
  • Fechar Escala: dimensione o valor do recurso da alça quando as mãos estão dentro do intervalo da interação de agarrar (distância definida acima por "Lidar com Proximidade". Utilizar 1.x para mostrar um tamanho maior)
  • Taxa de Crescimento Distante: classifique uma escala de objetos dimensionados por proximidade quando a mão se move do meio para a proximidade.
  • Taxa de Crescimento Médio: classifique uma escala de objetos dimensionados por proximidade quando a mão se move de proximidade média para próxima.
  • Fechar Taxa de Crescimento: classifique uma escala de objetos dimensionados por proximidade quando a mão se move de perto para o centro de objetos.

Sistema de Restrição

O controlo de limites suporta a utilização do gestor de restrições para limitar ou modificar o comportamento de tradução, rotação ou dimensionamento ao utilizar alças de controlo de limites.

O inspetor de propriedades mostrará todos os gestores de restrições disponíveis anexados ao mesmo objeto de jogo numa lista pendente com uma opção para deslocar e realçar o gestor de restrições selecionado.

Restrições de controlo de limites

Evento

O controlo Limites fornece os seguintes eventos. Este exemplo utiliza estes eventos para reproduzir comentários de áudio.

  • Rodar Iniciado: acionado quando a rotação é iniciada.
  • Rodar Parado: acionado quando a rotação para.
  • Dimensionamento Iniciado: é acionado quando o dimensionamento é iniciado.
  • Escala Parada: aciona quando o dimensionamento para.
  • Traduzir Iniciado: é acionado quando a tradução é iniciada.
  • Traduzir Parado: é acionado quando a tradução para.
Eventos de controlo de limites

Elásticos (Experimental)

Os elásticos podem ser utilizados ao manipular objetos através do controlo de limites. Tenha em atenção que o sistema elástico ainda está no estado experimental. Para ativar os elásticos, ligue um componente do gestor de elásticos existente ou crie e ligue um novo gestor de elásticos através do Add Elastics Manager botão.

Controlos de limites Elásticos

Estilos de alças

Por predefinição, quando atribuir o BoundsControl.cs script, este mostrará a alça do estilo de 1.ª geração do HoloLens. Para utilizar HoloLens 2 alças de estilo, tem de atribuir os materiais e os pré-fabricados adequados.

Estilos de Alça de Controlo de Limites 2

Seguem-se os pré-fabricados, os materiais e os valores de dimensionamento das alças de controlo dos limites de estilo HoloLens 2. Pode encontrar este exemplo na BoundsControlExamples cena.

Controlo de limites HandleStyles

Identificadores (Configuração para o estilo HoloLens 2)

  • Material da Alça: BoundingBoxHandleWhite.mat
  • Handle Grabbed Material: BoundingBoxHandleBlueGrabbed.mat
  • Pré-fabricador da Alça de Dimensionamento: MRTK_BoundingBox_ScaleHandle.prefab
  • Prefab de Ardósia da Alça de Escala: MRTK_BoundingBox_ScaleHandle_Slate.prefab
  • Tamanho da Alça de Dimensionamento: 0,016 (1,6 cm)
  • Preenchimento do Colisor de Alças de Escala: 0,016 (torna o colisor agarrável ligeiramente maior do que o elemento visual de alça)
  • Prefab da Alça de Rotação: 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)

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

Um controlo de limites pode ser utilizado em combinação com ObjectManipulator.cs para permitir determinados tipos de manipulação (por exemplo, mover o objeto) sem utilizar alças. O processador de manipulação suporta interações com uma e duas mãos. O controlo manual pode ser utilizado para interagir com um objeto de perto.

Os limites controlam o Manipulador de Objetos

Para que as arestas de controlo dos limites se comportem da mesma forma ao movê-la através ObjectManipulatorda interação distante, é aconselhável ligar os eventos para Manipulação Iniciada Durante a Manipulação Iniciada / BoundsControl.HighlightWires / BoundsControl.UnhighlightWires, respetivamente, conforme mostrado na captura de ecrã acima.

Como adicionar e configurar um controlo de limites com o Inspetor do Unity

  1. Adicionar o Colisor de Caixas a um objeto
  2. Atribuir BoundsControl script a um objeto
  3. Configurar opções, como métodos de "Ativação" (veja a secção Propriedades do inspetor abaixo)
  4. (Opcional) Atribuir pré-fabricados e materiais para um controlo de limites de estilo HoloLens 2 (consulte a secção Estilos de alças 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.

Controlo de Limites

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

  1. Instanciar o cubo GameObject

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

    private BoundsControl boundsControl;
    boundsControl = cube.AddComponent<BoundsControl>();
    
  3. Configure opções diretamente no controlo ou através de uma das configurações passíveis de script (veja a secçã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 controlo de limites de estilo HoloLens 2. Isto ainda requer atribuições através do inspetor, uma vez que os materiais e 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.

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 o dimensionamento de controlo de limites mínimo e máximo com MinMaxScaleConstraint

Para definir a escala mínima e máxima, anexe um MinMaxScaleConstraint ao seu controlo. À medida que o controlo de limites anexa e ativa automaticamente o gestor de restrições, o MinMaxScaleConstraint será automaticamente aplicado às alterações de transformação assim que estiver anexado e configurado.

Também pode utilizar 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 controlo de limites à volta de um objeto de jogo

Para adicionar um controlo de limites à volta de um objeto, basta adicionar um BoundsControl componente ao mesmo:

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

Migrar da Caixa Delimitadora

Os pré-fabricados e as instâncias existentes com 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 instâncias individuais da caixa delimitadora, também existe uma opção de migração dentro do inspetor de propriedades do componente.

Controlo de limites Migrar

Ver também