Expansão da caixa de ferramentas da robótica: Mudanças na física no Unity 2022.1


Simule robôs sofisticados e conscientes do ambiente com as novas ferramentas de sensor de força de dinâmica inversa. Explore a dinâmica com o Physics Debugger totalmente renovado. Aproveite os aprimoramentos de desempenho em interpolação, consultas em lote e muito mais.
O depurador de física é uma ferramenta essencial para compreender o funcionamento interno do mecanismo de física, bem como para entender o comportamento específico observado em um projeto. Um bom depurador é uma ferramenta essencial para a criação de uma física convincente, moderna e rica. Com isso em mente, reformulamos completamente a interface do usuário (UI) e adicionamos alguns recursos interessantes.
Para colocar mais informações no mesmo espaço, agrupamos as propriedades em guias e depois as expandimos com as propriedades recém-adicionadas.

Antes, os componentes Rigidbody e ArticulationBody tinham uma seção "Info" recolhível no Inspector que podia ser expandida para exibir informações adicionais, como a velocidade linear atual. No entanto, uma vez expandido, o desempenho geral do Editor diminuiu significativamente. Além disso, antes era complicado comparar parâmetros de corpos diferentes, pois era necessário abrir dois painéis do Inspector. Para resolver esses problemas, movemos todas as propriedades para a guia "Info" da janela do Physics Debugger, onde as propriedades são exibidas para cada um dos objetos selecionados, para que você possa compará-los facilmente lado a lado.

Os pontos de contato agora podem ser visualizados, juntamente com a normal de contato e a distância de separação.

As consultas de física, como Physics.Raycast ou Physics.CastSphere, normalmente fazem parte de algum comportamento de física personalizado, como controladores de personagens personalizados ou controladores de veículos. Eles são invisíveis e difíceis de depurar. Para ajudar nisso, esta versão oferece a visualização opcional das consultas de física.

Até agora, o Unity tinha ferramentas que suportavam apenas o que é chamado de dinâmica avançada: dado um conjunto de objetos e as forças aplicadas a eles, calcule suas trajetórias. Embora isso seja incrivelmente útil, queríamos expandir nossa caixa de ferramentas de robótica. Portanto, o Unity 2022.1 adiciona suporte para dinâmica inversa: dado um objeto e uma trajetória desejada, calcule as forças que causam essa trajetória quando simulada.
Esse esforço abrangerá várias versões, à medida que o desenvolvemos iterativamente. No Unity 2022.1, estamos expondo um conjunto de funções para calcular os componentes da força total atual aplicada aos ArticulationBodies que devem ser neutralizados antes de aplicar a força externa para conduzi-los ao longo da trajetória desejada. Outros conceitos interessantes serão expostos em versões posteriores, como a força conjunta necessária para neutralizar o impulso aplicado pelo solucionador. Convidamos você a experimentar e nos dizer o que achou no fórum.
Em particular, as novas funções são:
- obtém a força atual aplicada ao corpo pelo acionamento. É uma indicação do esforço que uma unidade está fazendo para atingir o objetivo desejado. Depende da rigidez e do amortecimento do acionamento, bem como da posição atual do alvo delta e da velocidade do alvo delta;
- obter as forças articulares necessárias para neutralizar a gravidade, as forças de Coriolis e centrífugas que atuam no corpo; e
- obtenha a força conjunta necessária para atingir a aceleração desejada.

O Rigidbody usa interpolação e extrapolação para dar uma impressão de movimento suave enquanto simula em uma frequência comparativamente baixa. Internamente, isso é implementado calculando as poses de transformação a cada atualização. No caso da interpolação, as duas últimas poses simuladas são usadas para calcular uma nova pose de transformação para esse quadro. No caso de extrapolação, a última pose e velocidade simuladas são usadas em seu lugar. No entanto, como ele foi projetado para ser leve, não comunicamos essas poses de volta ao mecanismo de física. As poses são apresentadas apenas para os sistemas fora da física (por exemplo, gráficos e animação). Por causa disso, por exemplo, um raycast não detectará um corpo na pose interpolada.
Para evitar que a física percebesse as alterações de transformação, o mecanismo era fazer com que um Physics.SyncTransforms() chamasse cada atualização logo antes da gravação da pose, seguido por uma chamada de método interno para limpar todas as atualizações de transformação para a física. Isso causou dois tipos de problemas:
Se uma cena tiver pelo menos um corpo interpolado, todas as alterações de transformação em todos os componentes de física serão sincronizadas com o mecanismo de física a cada atualização (embora elas sejam necessárias principalmente uma vez por FixedUpdate); e
Se for feita uma alteração em uma transformação que tenha um componente Rigidbody com interpolação, a interpolação desse objeto será interrompida porque a alteração da transformação feita pelo usuário foi propagada para o mecanismo de física e alterou efetivamente a última pose simulada (a pose não é armazenada separadamente, é apenas a pose que o mecanismo de física usa no momento).
Para resolver esses problemas, atualizamos o código de interpolação para que ele não precise sincronizar todas as transformações de cada quadro. Essa alteração também melhora o desempenho; o novo código de interpolação é executado mais rapidamente do que antes (dependendo da complexidade da cena).
Uma seção do fórum é dedicada à discussão de várias visualizações experimentais da tecnologia de física, e algumas das alterações implementadas nesta versão foram originadas lá:
- Muitos projetos, especialmente os maiores, costumam usar muitas camadas de GameObject, de modo que a matriz que descreve as combinações de camadas e produz pares de contatos para a física também se torna bastante grande. Nesta versão, estamos destacando a linha e a coluna selecionadas no momento para facilitar o uso.

- Uma junta é usada para vincular dois Rigidbodies e define as restrições em seu movimento relativo. A partir do Unity 2020.2, uma articulação também pode ser usada para vincular um Rigidbody a um ArticulationBody. Para tornar isso possível, cada classe Joint recebeu uma propriedade adicional que é mostrada no Inspector. É impossível vincular o Rigidbody e o ArticulationBody ao mesmo tempo, portanto, exibir as duas opções quando uma já foi definida ocupa espaço vertical sem motivo. Agora, somente a propriedade que foi definida é exibida.

- Um corpo rígido cinemático é um tipo especial de corpo que pode influenciar outros corpos, mas não permite que nenhum outro corpo o afete. Nesse aspecto, ele é análogo a um colisor estático, com a exceção de que se destina a ser movido com frequência. Os casos de uso típicos são controladores de personagens, física orientada por animação, simulação de realidade virtual (VR) de pulsos e assim por diante. Ele é controlado pela definição de um alvo cinemático que o corpo alcançará em apenas um quadro de simulação. A principal diferença em relação ao colisor estático aqui é que o alvo cinemático é alcançado não por teletransporte instantâneo (mudança de pose), mas pelo cálculo das velocidades linear e angular necessárias para alcançar o objetivo em um quadro e passá-las para o solucionador posteriormente. Dessa forma, o movimento pode contribuir corretamente para as matrizes Jacobianas de restrição e, portanto, qualquer cadeia de juntas anexada reagirá adequadamente (sem falhas). Nesta versão do Unity, apresentamos um novo método para definir a posição e a rotação da meta cinemática em uma única operação.
- A modificação de contato, introduzida no Unity 2021.2, permite alterar os detalhes do ponto de contato conforme gerado pela fase estreita, logo antes de serem usados para criar restrições de contato para o solucionador. Nesta versão, estamos adicionando novos getters para velocidades do corpo em um par de contatos, para casos de uso avançados, como este exemplo de atrito anisotrópico personalizado.
- A versão do PhysX foi atualizada para 4.1.2, a mais recente da linha 4.x até o momento. Trata-se de uma versão secundária, portanto, ela aborda apenas erros e falhas críticos. As notas de versão estão disponíveis aqui.
- Quando um corpo dinâmico se sobrepõe a um colisor, o solucionador tem como objetivo encontrar um impulso corretivo que os separe, satisfazendo todas as restrições. Internamente, esse impulso é calculado por cada ponto de contato em um par, mas tínhamos apenas um valor agregado que retornava uma soma total de todos os pontos. Com esta versão, estamos expondo uma nova propriedade da estrutura ContactPoint que permite recuperar impulsos para cada ponto de contato.
- Estamos observando atentamente o feedback sobre o componente ArticulationBody vindo da comunidade de robótica. Para facilitar a criação e o ajuste do comportamento de algumas peças menores do robô, ancoramos as alças de limite de articulação no espaço da tela para que elas não ocluam mais os colisores na cena.

- As consultas em lote de física foram o resultado de uma hackweek da Unity e foram enviadas diretamente para habilitar determinados casos de uso, mas com funcionalidade mínima. Eles continuam a evoluir, com novas funcionalidades para permitir ainda mais casos de uso, como aqueles com padrões de encadeamento mais sofisticados, e os tipos de consultas são mais diversificados. Nesta versão específica, estamos permitindo que as consultas em lote sejam executadas em qualquer cena de física e estamos adicionando um novo tipo de consulta em lote(Physics.ClosestPointCommand).
- Para que uma malha possa ser usada com o MeshCollider, ela precisa ser cozida primeiro. O "baking" é um processo caro de produção das estruturas de pesquisa espacial necessárias para a detecção de colisões. Normalmente, isso acontece implicitamente toda vez que a propriedade de malha de um MeshCollider é alterada e é executada na thread principal, bloqueando qualquer trabalho adicional até que seja concluída. No Unity 2019.3, expusemos um método thread-safe para executar o bake fora do thread principal sob demanda. A intenção era permitir malhas geradas processualmente mais sofisticadas, já que agora era possível jobificar a geração de conteúdo e a preparação da malha, obtendo uma utilização de thread muito maior. No entanto, uma desvantagem específica dessa função é que ela só suportava o cozimento com as opções de cozimento padrão. Nesta versão, corrigimos isso expondo uma nova variante do Physics.BakeMesh que suporta o cozimento com quaisquer opções de cozimento.
Mal podemos esperar para ver o que você criará com as novas APIs de dinâmica inversa e o Physics Debugger renovado! Baixe a versão mais recente do Unity 2022.1 hoje e participe da conversa no fórum de robótica e no fórum de visualizações de física.
