gpt4 book ai didi

c - 实现碰撞检测

转载 作者:行者123 更新时间:2023-11-30 16:01:44 24 4
gpt4 key购买 nike

我编写了一个程序来模拟一个球从 50 米高的建筑物上扔下来。我添加了碰撞检测,当球撞击地面 (y < 0) 时,反转 y 方向的速度,保持水平速度相同,并将两个速度乘以某个最小值,以便球最终达到休息。

 #include<stdio.h>
#include<math.h>
#include <stdlib.h>

int main() {

FILE *fp;
FILE *fr;

float ax = 0, ay = 0, x = 0, y = 0, vx = 0, vy = 0;
float time = 0, deltaTime = .001;

float min = -.00000000001;
int numBounces = 0;

fr = fopen("input_data.txt", "rt");

fp = fopen( "output_data.txt", "w" );

if(fr == NULL){ printf("File not found");}

if(fp == NULL){ printf("File not found");}

fscanf(fr, "ax: %f ay: %f x: %f y: %f vx: %f vy: %f\n", &ax, &ay, &x, &y, &vx, &vy);

while (vx > min && vy > min) {

time = time + deltaTime;
vx = vx + ax*deltaTime;
vy = vy + ay*deltaTime;
x = x + vx*deltaTime + (.5*ax*deltaTime*deltaTime);
y = y + vy*deltaTime + (.5*ay*deltaTime*deltaTime);

fprintf(fp, "%f\t%f\t%f\t%f\t%f\t%f\t%f\t\n", ax, ay, x, y, vx, vy, time);

//Collision occurs; implement collision response
if(y < 0) {
vx = vx + ax*deltaTime*(.00001);
vy = -(vy + ay*deltaTime*(.00001));
numBounces++;

fprintf(fp, "%f\t%f\t%f\t%f\t%f\t%f\t%f\t\n", ax, ay, x, y, vx, vy, time);
}
}

fclose(fp);
fclose(fr);

system ("PAUSE");
return 0;

}

我没有获得生成正确数据图表所需的正确值。这可能是因为我在 while 循环中的条件需要改变,或者我没有正确实现碰撞响应。

这里还有一些示例数据:

ax: 0 ay: -9.8 x: 0 y: 50 vx: 8.66 vy: 5

Picture of data plot

最佳答案

如果不输出任何内容,您可以尝试 fflush(fp)在每个周期结束时。据我在你的代码中看到,你的物体在撞击地面时会获得更快的速度,你必须改变 vy = -(vy + ay*deltaTime*(.00001))vy = -(vy - ay*deltaTime*(.00001))来纠正它。如果您计算碰撞的确切时间 y < 0 ,您还可以创建更好的碰撞实现。然后在剩下的周期中向下移动物体,改变速度,然后向上移动物体以获得更真实的碰撞。

我们知道 deltaY = 1/2*ay*t^2 + vy*t 因此我们可以使用以下公式计算 t:

assuming py is the current height of object(it's distance to ground)
=> -py = 0.5 * ay* t * t + vy * t
=> 0 = 0.5 * ay * t * t+ vy * t + py
=> t = (-vy +- sqrt(vy*vy - 2 * ay * py)) / (2 * ay)

由于 t 必须为正数,并且知道 ay 为负数且 py 为正数,因此我们可以假设当前答案是

=> tc = (sqrt(vy*vy - 2 * ay * py) - vy) / 2 / ay

现在我们有了 tc,即碰撞时间。所以我们必须反转位置和速度的最后变化,然后只需步时间tc秒,然后反向 vy 和步骤 deltaTime - tc秒完成该帧。所以在 if 条件里面会是这样的(我可能在做数学时遇到一些问题,所以如果万一你没有得到预期的结果,只需仔细检查所有方程):

if (y < 0) {
float tc = (sqrt(vy*vy - 2 *ay * y)) / 2 / ay;
x = x - vx*deltaTime - (.5*ax*deltaTime*deltaTime);
y = y - vy*deltaTime - (.5*ay*deltaTime*deltaTime);
vx = vx - ax * deltaTime;
vy = vy - ay * deltaTime;
vx = vx + ax * tc;
vy = vy + ay * tc;
x = x + vx*tc + (.5*ax*tc*tc);
y = y + vy*tc + (.5*ay*tc*tc);
vy = -(vy - ay*deltaTime*(.00001));
// you can also change above line and simply write
// vy = vy * -0.99;
// that will also create friction as you want it to be there
vx = vx + ax * (deltaTime - tc);
vy = vy + ay * (deltaTime - tc);
x = x + vx* (deltaTime - tc) + (.5*ax* (deltaTime - tc)* (deltaTime - tc));
y = y + vy* (deltaTime - tc) + (.5*ay* (deltaTime - tc)* (deltaTime - tc));
numBounces++;

fprintf(fp, "%f\t%f\t%f\t%f\t%f\t%f\t%f\t\n", ax, ay, x, y, vx, vy, time);
}

关于c - 实现碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6170529/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com