O documento discute simulação de física em games, abordando fenômenos físicos, engines de física, simulação de partículas, corpos rígidos, constraints, colisões e alguns engines populares.
1. Simulação de Física em Games
Nilson Souto - xissburg - Twitter @xissburg - http://xissburg.com
2. Conteúdo
•Fenômenos físicos que nos interessam
•Engines de Física
•Simulação de Partículas
•Simulação de Corpos Rígidos
•Constraints
•Colisões
•Alguns Engines Populares
3. Fenômenos Físicos
•Diversos fenômenos físicos podem simulados
em um computador
•No caso dos jogos, em geral, apenas nos
interessam a Mecânica
•A Mecânica de Newton é suficiente
•Leis de Newton:
•Inércia
•F = ma
•Ação e Reação
4. Engine de Física
•Engines de física são softwares que simulam o
movimento de objetos de acordo com as leis
da física
•Não possuem representação gráfica
internamente
•O resultado da simulação pode ser usado para
criar a animação procedural de objetos
representados graficamente
5. Engine de Física
Criar e configurar
Step
objetos Aplicar forças
Atualizar velocidade
e posição
Detectar colisões
Resolver constraints
Exibir resultado
6. Engine de Física
•Após criar os objetos, iniciamos o main loop da
simulação
•Em cada iteração fazemos um passo na
simulação proporcional ao intervalo de tempo
que passou entre a iteração anterior e a atual,
conhecido como delta-time ou time-step
•Após cada passo, obtemos as novas posições e
velocidades para cada objeto, e assim podemos
redesenhar a cena
7. Simulação de Partículas
•Partículas possuem posição, velocidade linear,
massa e reagem à forças
•Partículas possuem volume infinitamente
próximo de zero
•Partículas não rotacionam
•Relativamente simples de simular várias
partículas se movimentando e reagindo aos
efeitos de forças quaisquer
8. Simulação de Partículas
•Posição, velocidade e força são grandezas
vetoriais geralmente de 2 ou 3 dimensões
•Vetores são objetos geométricos que possuem
comprimento e apontam numa direção
y
y1 v = (x1, y1)
x x1
O
10. Simulação de Partículas
• pi
: posição da i-ésima partícula
• vi
: velocidade da i-ésima partícula
• fi
: força aplicada na i-ésima partícula
• mi
: massa da i-ésima partícula
11. Simulação de Partículas
•Algoritmo
for i in [1, n] do
pi = p0i
vi = v0i
end
loop
for i in [1, n] do
fi = ComputeForce(i)
vi = vi + (fi/mi)dt
pi = pi + vidt
end
end
13. Simulação de Corpos Rígidos
•Um corpo rígido é uma idealização de um
sólido em que suas deformações podem ser
ignoradas
•Pode ser simulado de forma semelhante à
partícula
•Possui volume, forma fixa, e pode rotacionar
•Temos que considerar o momento de inércia,
orientação, torque e velocidade angular
15. Simulação de Corpos Rígidos
•O Centro de Massa é o ponto médio da
distribuição da massa de um corpo
!
!
R =
1
M
Z
V
⇢(r)rdV
!
•M é a massa total do corpo, r é o vetor posição
de um ponto do corpo, V é o volume do corpo,
e ρ é a função densidade do corpo, onde ρ(r)
= m(r)/v(r)
16. Simulação de Corpos Rígidos
•A posição do Centro de Massa é a considerada
posição do corpo rígido
•A rotação é um ângulo em radianos em 2D
•A velocidade do Centro de Massa é a
velocidade do corpo
•A velocidade angular ω é um escalar em 2D
(radianos por segundo)
17. Simulação de Corpos Rígidos
•O momento de inércia é o análogo da massa
para a rotação
•Determina o quão rápido um corpo ganha ou
perde velocidade angular ao receber um torque
•Em 2D o momento de inércia é um escalar
com unidade kgm2 que é calculado a partir da
massa e da forma do corpo
I =
Z
V
⇢(r) r2 dV
18. Simulação de Corpos Rígidos
•Exemplos de momento de inércia:
w
h I =
m(h2 + w2)
12
r
I =
mr2
2
p0
p1
p2 p3
p4
p5 p6
I =
m
6
NP1
n=1 k~Pn+1 ⇥ ~Pnk(( ~Pn+1 · ~Pn+1) + (~Pn+1 · ~Pn) + (~Pn · ~Pn))
NP1
n=1 k~Pn+1 ⇥ ~Pnk
19. Simulação de Corpos Rígidos
•Algoritmo
SetupRigidBodies(n)
loop
for i in [1, n] do
fi = ComputeForce(i)
vi = vi + (fi/mi)dt
pi = pi + vidt
⌧i = ComputeTorque(i)
!i = !i + (⌧i/Ii)dt
↵i = ↵i + !idt
end
end
20. Constraints
•Restrição no movimento de um objeto
•Utilizadas para criar juntas e conexões entre
corpos e para resolver colisões
•Representada por uma função C e um
conjunto de equações e/ou inequações
envolvendo C
21. Constraints
•Por exemplo, uma constraint para criar uma
junta entre dois corpos rígidos pode ser
descrita da seguinte maneira:
C(t) = krA(t) − rB(t)k
C(t) = 0
rA(t) = pA(t) + RA(t)rA0
rB(t) = pB(t) + RB(t)rB0
RA(t) =
cos ↵A(t) −sin ↵A(t)
sin ↵A(t) cos ↵A(t)
24. Colisões
•Colisão entre corpos rígidos é um dos efeitos
mais importantes numa simulação
•Permite que os corpos interajam entre si de
forma realista
•O processo é dividido em duas partes:
detecção e resolução de colisões
25. Colisões - Detecção
•Em geral, o processo de detecção de colisões é
dividido em duas partes
•Broad Phase: utiliza formas simplificadas das
formas originais dos objetos para encontrar
potenciais pares que estão colidindo de forma
eficiente
•Narrow Phase: verifica se os pares da Broad
Phase colidem de fato e calcula os pontos de
contato
31. Colisões - Narrow Phase
•Para detectar se os corpos estão colidindo,
calculamos a distância entre eles ou o
penetration depth caso estejam penetrando
•Dois algoritmos elegantes para executar essa
fase são o GJK (cálculo de distância entre
formas convexas) e EPA (Expanding Polytope
Algorithm para cálculo de penetration depth)
32. Colisões - Detecção
•Pode ser dividida em dois tipos:
•Discreta: identifica em cada passo os pares
que colidem. Tem problemas com objetos que
se movimentam muito rápido e objetos de
pequenas dimensões, onde um objeto pode
eventualmente atravessar outro (tunneling)
•Contínua (CCD): calcula o instante em que
ocorreu a colisão (time of impact) durante um
passo. Evita que objetos atravessem uns aos
outros
34. Colisões - Resolução
•A resolução de colisões calcula e aplica forças
ou impulsos nos pontos de contato para evitar
que os corpos penetrem
•Impulse-Based Dynamics é a forma mais popular
de se resolver colisões, calculando e aplicando
impulsos nos corpos de acordo com algumas
propriedades dos materiais como o coeficiente
de restituição e o coeficiente de atrito
35. Colisões - Resolução
•Partindo da expressão vrel(ti)=ϵvrel(ti+1), onde ϵ
é o coeficiente de restituição, podemos chegar
à famosa fórmula do impulso normal
!
36. Colisões - Resting Contacts
•Resting Contacts são pontos de contatos que
persistem por mais que um passo da simulação
•Precisam de um tratamento especial para
manter a estabilidade da simulação,
principalmente no empilhamento de objetos
(stacking)
•Sequential Impulses é um método popular para
resolver os resting contacts e constraints em
simulações baseadas em impulsos
37. Engines
•Box2D: engine de física 2D criada por Erin
Catto em C++, licença zlib
•Chipmunk: engine de física 2D criada por
Scott Lembcke em C, licença MIT
•Bullet Physics: engine de física 3D criada por
Erwin Coumans em C++, licença zlib
•PhysX: engine de física 3D proprietário da
Nvidia, suporta aceleração por hardware em
placas GeForce
38. Referências
•Halliday, Resnick. Fundamentals of Physics, 8th Ed.
•Andrew Witkin, David Baraff. Physically Based
Modeling: Principles and Practice. http://
www.cs.cmu.edu/~baraff/sigcourse/index.html
•Gino van den Bergen.A Fast and Robust GJK
Implementation for Collision Detection of
Convex Objects. http://www.win.tue.nl/~gino/
solid/jgt98convex.pdf