Apresentamos um resumo das etapas básicas para criar uma simulação de corpo rígido, usando os nós de Física de projéteis do MCG.
Criar um mundo
Um sistema de Física de projéteis é conhecido como um "mundo". O mundo é o que precisa ir para o cache e ser atualizado durante a simulação, e ele deve conter todos os corpos rígidos que participam da simulação, com suas restrições e relações.
Antes de acrescentar corpos rígidos ao mundo, é necessário criar o mundo em si. Isso exige um tempo inicial, que, normalmente, é o momento de início da sua cena. Também é possível definir a gravidade do mundo.
Adicionar um objeto dinâmico
Objetos dinâmicos são corpos rígidos cujas transformações são atualizadas pelo mecanismo de Física de projéteis, ao contrário de outros objetos que servem apenas como objetos para possível colisão.
- Em um controlador de animação, é possível gerar apenas uma transformação, de forma que é possível ter apenas um objeto dinâmico.
- Em outras situações, é possível ter mais de um objeto dinâmico. Por exemplo, é possível criar uma geometria através da distribuição de transformações dentro de um volume e do seu uso para instanciar várias cópias de uma malha. Nesse caso, é possível usar um operador Agregado com uma série de transformações para adicionar ao mundo vários corpos rígidos com as mesmas propriedades dinâmicas.
A adição de um objeto dinâmico no mundo prevê as seguintes etapas básicas:
- Configurar as propriedades dinâmicas do corpo rígido.
No caso de um objeto dinâmico, a massa deve ser um valor positivo diferente de zero.
- Usar as propriedades dinâmicas para criar um corpo rígido.
- No caso de um objeto dinâmico, é necessário definir a porta isKinematic como Falso.
- convexHull é a malha usada para detectar uma colisão. Ela deve ser impermeável e, se apresentar concavidades, apenas sua casca convexa será utilizada. Observe que não é necessário ser a mesma malha usada no formato do objeto renderizado. Por exemplo, é possível querer usar uma malha simplificada para acelerar os cálculos de colisão, ou uma malha menor para evitar as forças explosivas causadas pela interpenetração com objetos muito compactos.
- É possível, ainda, definir a velocidade inicial do objeto, além de criar restrições.
- Adicionar o objeto dinâmico ao mundo.
Posteriormente, será necessário ter um índice do objeto dinâmico para que o mundo devolva seu valor de transformação. Portanto, controle o número de objetos dinâmicos adicionados ao mundo, bem como a ordem deles. O primeiro objeto adicionado ao mundo leva o índice 0; o segundo leva o índice 1, e assim por diante.
Adicionar objetos de colisão
O mecanismo de Física de projéteis usa objetos de colisão para realizar colisões de objetos dinâmicos, mas ele não atualizará suas transformações. Normalmente, eles são usados para coisas como pisos e paredes, mas também podem ser animados.
A adição de objetos de colisão é semelhante à adição de objetos dinâmicos, mas é mais simples:
- isKinematic deve ser Verdadeiro. Isso não significa, necessariamente, que o objeto de colisão seja animado, mas, se for, o seu gráfico será responsável por atualizar suas transformações antes de avançar com o mundo.
- A massa é ignorada (sempre é zero).
- A velocidade e as limitações não se aplicam.
Novamente, é possível usar matrizes para adicionar vários objetos de colisão.
Criar um cache de mundo
Depois de adicionar o último corpo rígido, use a função resultante para definir o estado inicial do cache do mundo.
Atualizar o cache do mundo
Agora, é necessário definir como atualizar o cache em cada quadro. Isso pode ser feito em duas etapas:
- Se os objetos de colisão forem animados, atualize o mundo com suas novas transformações.
- Avance o mundo no tempo.
Atualizar as Transformações dos objetos de colisão
A atualização das transformações dos objetos de colisão prevê a obtenção de suas matrizes de transformação atuais dos INodes da cena, e a definição das transformações dos respectivos corpos rígidos no mundo pelo índice. Como antes, é possível usar matrizes para ter vários objetos.
Avançar no tempo
Avance a simulação de acordo com a diferença entre o tempo atual da cena e o último tempo da simulação. Conecte a função resultante à porta updateFunc do nó CreateCache.
Obter as transformações atualizadas
A última etapa é obter os valores de transformação simulados do mundo armazenado no cache por índice, e usá-los de alguma maneira.
- No caso de um controlador, você deve gerar a única transformação.
- No caso de algo como uma geometria, é possível instanciar cópias de uma malha em uma matriz de transformações.