例子:前后车轮由弹簧维系。
若无最小距离,则前后轮可以粘在一起。解决方法:加限制。
例子:简谐函数。
那个关于采样频率的定理:采样定理 - 维基百科,自由的百科全书 (wikipedia.org)
例子:碰撞。
Force de collision 模拟碰撞。(说还是用impulsion)
Deux objets : leur mouvement après collision peut être calculé en fonction du mouvement avant collision.
Comme une collision arrive dans un très petit lapse de temps, nous manipulerons directement la vitesse et la position des objets.
重叠:直接改位置。
Dans le cas d'un contact entre deux particules, la direction du contact peut être extraite de leur position.
Normale entre particules : $$ \hat{n} = (p_a - p_b) $$ Normal avec du sol : $$ 0 \1\ 0 $$
-
vitesse d'approche $$ v_c = p_a \cdot (p_b - p_a) + p_b \cdot (p_a - p_b)\ v_c = -(p_a - p_b) \cdot (p_a - p_b) $$
-
vitesse d'éloignement 反过来
弹性碰撞
单位(g):$N \cdot s$,与动量单位相同。
En fonction de l'algorithme de détection, la collision pet être détectée trop tard, quand deux objets se sont déjà interpénétrés.
Le changement de vélocité suite à une collision n'est souvent pas suffisant pour résoudre ce problème. surtout dans le cas de petite vitesse.
解决方法之一:靠质量加权移动(分离)物体。
solutions :
-
anticiper le contact pour empêcher l'interpénétration ;
-
détecter si la vélocité est due à la gravité sur 1 frame. 速度非零时先计算对地面的分量。
-
appliquer la troisième loi de Newton
-
simuler le contact à l'aide d'un ressort raide
-
détecter la vibration
- entrée : liste de contacts
- algo :
- application de l'impulsion
- résolution des interpénétrations
- gestion des contacts au repos
- sortie :
- modification de la vitesse
- modification de la position
résoudre les contacts les plus importants d'abord.
回到前文例子:模拟车轮靠一段刚体+一个加了绳子的弹簧。
绳子弹簧是一般“接触”的继承。
- la simulation de corps rigides implique d'avoir des objets qui peuvent tourner en plus de se déplacer
- tout comme c'est le cas pour la position, l'orientation d'un objet sera modifiée par le processus d'intégration
| 动量 | 角动量 |
|---|---|
| position | orientation |
| vitesse | vitesse angulaire |
-
rotation en 2D
-
orientation en 2D
- 单位圆
$\theta = [cos \theta \ sin \theta]^T$
e.g.
-
la position d'un objet est représentée par la position de son origine
-
on peut toujours déduire la position d'un morceau de l'objet par rapport à son origine
-
l'origine peut être hors de l'objet
transformation linéaire + translation = transformation affine
matrice de rotation
- lacet
- tangage
- roulis
问题:
-
操作顺序对结果有影响
-
gimnal lock
- axe de rotation
$\vec n$ - angle de rotation
$[-\pi, \pi]$
那个3B1B视频:
Visualizing quaternions (4d numbers) with stereographic projection - YouTube
- l'algorithme slerp permet d'obtenir une interpolation fluide entre deux angles
- concaténation et inversion rapide des déplacements angulaires
- conversion rapide à la forme matricielle et vice-versa
- seulement quatre valeurs à conserver
- représentation compact et pratique pour les jeux en réseaux
la vélocité angulaire $$ \dot \theta = r \hat a $$
平移放在第四列,然后位置向量尾巴上加个一。
注意到对于旋转变换矩阵,其逆矩阵等于其转置。
用的时候再查,懒得抄了。
- la transformation d'un vecteur de direction ne deverait pas être affectée par les translations
- la solution consiste à ignorer le dernier élément
非坐标系原点的物体的旋转
那个从来记不清顺序的$PBP^{-1}$
pour les rotations, $$ \tau = I \ddot \theta \implies \ddot \theta = I^{-1} \tau $$
-
$\tau$ le couple -
$I$ le moment d'inertie
有些计算好的样例。
同前文:本地坐标系和世界的变换。
Le système de détection de collision n'est pas utilise que pour la physique.
- le rendu graphique peut également utiliser les mêmes principes de détection pour savoir quoi rendre à l'écran ;
- le gameplay peut utiliser la détection de collision mêmes si cela n'est pas directement reliée à la physique
- détection un objet dans une zone
- détecter si un objet est dans le champ de vision
Chaque objet peut entrer en collision avec n'importe quel autre,
Chaque collision est géométriquement complexe.
-
toutes les collisions de la simulation doivent être contenues dans la liste potentielles
-
la liste doit être plus petite possible
sphère, AABB alix-alignes bounding box, OBB oriented bounding box, 8-DOP discrete-oriented plotopes, convex Hull
从左到右逐渐精确,但是增加复杂度。
arbre (binaire) dont les noeuds correspondent au volume englobant de ses enfants
将整体的碰撞块再细分。逐步检测。适用于静态物体。
- top-down
- bottom-up
- insertion
on utilise une grille contenant des cellules de taille uniforme
- facile à implémenter
- chaque cellule est accessible de manière constante, il est donc facile de placer les objets dans la grille
- difficile de choisir la taille de grille
- utilise plusieurs grilles de cellules de taille différentes
- convient à des scènes qui ont des objets de tailles différents
utilisation d'un plan
struct {
Vect position;
Vect direction;
}la taille de objets, la complexité des objets
la taille de la scène
la quantité d'objet dans la scènes
le type d'objet
- broad phase
- narrow phase
- génération du collision
rendu (polugon meshs) 显示的模型
collisions (primitives) 碰撞块
volume englobant (BV) 包裹的区域
détection des contacts par priorité :
- point-face, edge-edge
- edge-face, face-face
- ...
- pointe de contact
- normal de contact
- pénétration
- corps rigides concernées
- coefficient de restitution
- friction
(一些细节,如某种碰撞下法线的计算,参见课件)
void generateContacts(const Primitive &first, const Primitive &second, CollisionData* data);
class Primitive {
public:
RigidBody* body;
Matrix4 offset;
};class Sphere: public Primitive {
};class Plane: public Primitive {
public:
Vector3 normal;
real offset;
};class Box: public Primitive {
public:
Vector3 halfSize;
};test every point of the 8 vertex of box.
dist = realEnter.x;
if (dist > box.halfSize.x) dist = box.halfSize.x;
if (dist < - box.halfSize.x) dist = -box.halfSize.x;
closestPt.x = dist;
// same for y, z“最大化碰撞”
- Separating Axis Tests
- Gilbert-Johnson-Keerthi
- Voronoi-Clip
Let
闵可夫斯基和
S'il existe un axe selon lequel deux objets sont séparés, alors les objets ne sont pas en contact ;
pour un polyèdre convexe, les axes à tester sont :
- la normal de tous les faces des deux objets
- l'angle d'angle droites à tous les paris d'arêtes des différents objets
- les axes similaires ou de direction ...
La différence :
- vitesse angulaire (impulsion de couple)
- modification de l'orientation
couple $$ r = p_f \times f \ \tau = I \ddot \theta \ \ddot \theta = I^{-1} \tau $$ implusion de couple $$ u = I \dot \theta \ \dot \theta = I^{-1} u $$
On calculera cette vitesse au point de contact en prenant en compte la vitesse angulaire des corps rigides.
- création d'une base au point de contact
- calculer le changement de vélocité
- inverser le résultat pour obtenir l'implusion nécessaire à un changement de vélocité
- calculer la vélocité désirée
- de la vélocité désirée, calculer l'impulsion nécessaire
- ...
vitesse d'un point d'un objet
课程过得太快,需要回头补课件
主要思路是在接触点建系,计算各种数据之后还原到各自的坐标系。
- projection linéaire
- résolution basée sur la vélocité
- projection non-linaire
On souhaite pondérer le déplacement selon :
-
l'inertie de chacun des objets
-
l'inertie linéaire et angulaire
calcul de l'inertie linéaire pour chaque objet
calcul de l'inertie angulaire pour chaque objet
pondèrement
calculer la rotation nécessaire
multiplier par le nombre d'unité nécessaire
appliquer la rotation au quaternion d'orientation
on peut limter la rotation à une certaine valeur
- Force/Torque generators
- Rigid-body update
- Contact generator
- Contact resolution