小萌新刚开始学OpenGL,想做一个三维小球碰撞模拟。一开始试了好多写法,但都有问题,不断改进,终于完成了,感觉有必要记录一下。
首先,为了能够无限添加小球,我采用链表结构,并定义了小球结构体,其中包含小球的各个物理属性。
struct ball {
glm::vec3 position; //球心坐标
glm::vec3 speed; //速度矢量
glm::vec3 color;//可有可无
float r; //小球半径
float m; //小球质量
struct ball* next;
};
在渲染循环里面加上p->position += p->speed * deltaTime;实现小球移动。deltatime为渲染的时间间隔。
然后就是简单的循环,用来筛选发生碰撞的小球。
struct ball* p = head;
struct ball* q;
while (p != NULL) {
q = p->next;
while ((q != NULL)) {
if ((veclength(p->position - q->position) <= (p->r + q->r))) {
}
q = q->next;
}
p = p->next;
}
接着最关键的就是发生碰撞的两个小球的代码了。
一开始,我尝试先在草稿纸上,把碰撞后的速度算出来。然后if他们之间的距离小于半径之和ÿ