最简单的物理引擎

1 物理引擎

**维基百科
物理引擎指一个用来模拟物理系统的电脑软件,用来模拟一些物理系统,如刚体,流体动力学等,主要用在视频游戏,电影等领域。
**开发人员
物理引擎设置一些参数,输出一些结果,驱动游戏中的物体
**例子
NVIDIAphysx
box2d
chipmunk

2 内容简介
物理引擎涉及到很多数学计算,甚至是很高深的很复杂的数学概念和计算,但是也可以很简单
最简单比如做一个沿抛物线移动的子弹,遵循简单物理规律
战舰游戏中的物理引擎包括
碰撞检测 船-船 船-山
炮弹弹道计算
寻路算法
本文主要介绍碰撞检测相关,也就是船-船 船-山

3 预备知识(最好)
向量{x,y} {x,y,z}
矩阵乘法
点乘 ab=|a||b|cosα

4 最简单的引擎
子弹轨迹的模拟可以算是最简单的引擎了,设置一个初始位置,初速度,在重力影响下击中物体或者落地完成生命周期

5 质点引擎
m1v1+m2v2=m1v1+m2v2
v1+v2=k(v1+v2)

战舰引擎

6 刚体引擎

7 四元数

8 结合在一起

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
写一个完整的2D物理引擎需要涉及到很多知识,包括数学、物理等方面。以下是一个简单物理引擎实现的代码,可以作为参考。 ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define GRAVITY 9.8f // 重力加速度 #define DELTA_T 0.01f // 时间间隔 typedef struct { float x; // x轴坐标 float y; // y轴坐标 float vx; // x轴速度 float vy; // y轴速度 float ax; // x轴加速度 float ay; // y轴加速度 float mass; // 物体质量 float radius; // 物体半径 } Circle; // 计算两个物体之间的距离 float distance(Circle c1, Circle c2) { float dx = c1.x - c2.x; float dy = c1.y - c2.y; return sqrt(dx * dx + dy * dy); } // 计算两个物体之间的碰撞 void collide(Circle *c1, Circle *c2) { float dx = c1->x - c2->x; float dy = c1->y - c2->y; float d = sqrt(dx * dx + dy * dy); float nx = dx / d; float ny = dy / d; float tx = -ny; float ty = nx; float dpTan1 = c1->vx * tx + c1->vy * ty; float dpTan2 = c2->vx * tx + c2->vy * ty; float dpNorm1 = c1->vx * nx + c1->vy * ny; float dpNorm2 = c2->vx * nx + c2->vy * ny; float m1 = (dpNorm1 * (c1->mass - c2->mass) + 2.0f * c2->mass * dpNorm2) / (c1->mass + c2->mass); float m2 = (dpNorm2 * (c2->mass - c1->mass) + 2.0f * c1->mass * dpNorm1) / (c1->mass + c2->mass); c1->vx = tx * dpTan1 + nx * m1; c1->vy = ty * dpTan1 + ny * m1; c2->vx = tx * dpTan2 + nx * m2; c2->vy = ty * dpTan2 + ny * m2; } // 更新物体的位置和速度 void update(Circle *c) { c->vx += c->ax * DELTA_T; c->vy += c->ay * DELTA_T; c->x += c->vx * DELTA_T; c->y += c->vy * DELTA_T; c->ax = 0.0f; c->ay = -GRAVITY; } int main() { Circle c1 = {0, 0, 0, 0, 0, 0, 1, 1}; Circle c2 = {3, 0, 0, 0, 0, 0, 1, 1}; Circle c3 = {0, 3, 0, 0, 0, 0, 1, 1}; Circle c4 = {3, 3, 0, 0, 0, 0, 1, 1}; Circle *circles[] = {&c1, &c2, &c3, &c4}; int numCircles = sizeof(circles) / sizeof(Circle*); int i, j; for (i = 0; i < numCircles; i++) { for (j = i + 1; j < numCircles; j++) { float d = distance(*circles[i], *circles[j]); if (d < circles[i]->radius + circles[j]->radius) { collide(circles[i], circles[j]); } } } for (i = 0; i < numCircles; i++) { update(circles[i]); printf("circle %d: (%f, %f)\n", i, circles[i]->x, circles[i]->y); } return 0; } ``` 这个物理引擎实现了圆形物体的运动和碰撞。在主函数中,定义了四个圆形物体,并对它们进行了初始化。然后,计算了所有物体之间的距离,并在物体之间发生碰撞时,调用了碰撞函数。最后,更新了所有物体的位置和速度,并输出了它们的坐标。这个物理引擎只是一个简单的示例,需要根据具体需求进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值