0xAA55 发表于 2014-4-16 16:44:43

【VB】VB编写的一个超简单的2D物理引擎

我编写这个只是为了研究物理引擎的算法。先用VB写一个。等以后我会完成它的C语言版,提供一个漂亮的接口,供有需求者使用。
往后我要开发出3D的物理引擎。目前先用2D的做研究。
Bullet、PhysX、Havok都是C艹的,我写个C的出来雷一下大家。

图形方面,我让它自动保留运动轨迹。摩擦力方面的处理还是有点问题,但是总体上很成功了已经。
标题栏上显示的是角速度。
操作说明:【WASD】移动,【QE】转动,【空格】乱动,点住鼠标左键然后拖动是施加作用力,点住鼠标右键是设置物体的位置。
其它方面的说明:

1、常量:
Radius:半径,可以改。决定物体的大小。
Gravity:重力加速度。可以改。
Accel:键盘加速度。控制WASDQE这几个键的效果。
PI:圆周率。不要改。总之圆周率不要改。圆周率约等于3.1415926535897932384626433832795就行。
Density:密度。物体的质量是按照圆面积(通过半径求出)乘密度计算出来的。随你改。
MouseForce:鼠标拉力的倍数。影响鼠标点住左键拉动的拉力。太小的话,鼠标左键效果不明显。太大的话,鼠标左键太鬼畜。
BorderRestitution:窗体边框的弹力参数。取值范围是0.5到1,超过1的话物体每次撞到边上动能都会增加,很不科学。低于0.5的话,物体撞到边上虽然物体没有陷进边里面,但是还是很不科学。
FricFac:动摩擦因数。为0的话毫无摩擦力。为0.5比较正常。为1的话,就像弹力球打在橡胶地面一样。这个值过大就会让物理模拟变得很不稳定,各种不科学。

2、全局变量:
SW&、SH&:窗口的客户区域的宽度和高度。像素。
X!, Y!, A!, XV!, YV!, AV!:物体的中心(重心)的位置,物体的朝向,物体的线速度,角速度。
Mass!, Iner!:物体的质量,转动惯量。
ElaspedTime As Double:弹性时间。每一帧渲染所需时间。
Paused As Boolean:是否已暂停。在点住鼠标左键尝试给物体施加作用力的时候,暂停。Paused = True的时候一切都是静止的。
Dragging As Boolean:是否正在点住鼠标右键拖动。如果Dragging = True,那么物体的中心就被强制设置为(DragX, DragY)处,线速度强制归零。
MouX!, MouY!, DragX!, DragY!:鼠标X,鼠标Y,拖动X,拖动Y,主要用于计算点住鼠标左键给物体施加的作用力的大小和方向。
HitPoints(99) As HitPoint:物体用于碰撞判断的点。每个元素的值是一个二维向量,碰撞点相对于物体中心的相对坐标。
Key(255) As Boolean:键盘状态。按下按键以后,Key(按键值) = True

3、函数:
Draw:画物体。
GetAbsPos:根据相对坐标计算出绝对坐标。用于计算碰撞判断点在屏幕上的真实位置。
HitTest:判断某绝对坐标是否“撞到边上了”。是的话进行受力分析。
ApplyForceRel:从相对坐标处给物体施加作用力。
ApplyForce:从绝对坐标处给物体施加作用力。
GetPointAngVel:取得某绝对坐标处假定是物体上的点相对于物体中心的线速度。
GetPointRelAngVel:取得某相对坐标处假定是物体上的点相对于物体中心的线速度。
GetPointVel:取得某绝对坐标处假定是物体上的点的线速度。
GetPointRelVel:取得某相对坐标处假定是物体上的点的线速度。
ProcHit:碰撞的受力分析处理。

EXE下载:

源码下载:

Golden Blonde 发表于 2014-4-16 17:02:25

LZ你这么屌你家里人知道么!

Jackeriss 发表于 2014-4-18 00:36:48

好有趣啊,不过不知道为什么有时碰壁时会突然快速旋转。(还有,你考虑E=mc^2了吗?;P)

0xAA55 发表于 2014-4-18 00:40:41

Jack 发表于 2014-4-17 16:36
好有趣啊,不过不知道为什么有时碰壁时会突然快速旋转。(还有,你考虑E=mc^2了吗?) ...

我没考虑E=mc²(那个也不重要吧?)
碰壁突然快速旋转是因为碰撞处理不科学。

Jackeriss 发表于 2014-4-18 00:48:16

0xAA55 发表于 2014-4-18 00:40
我没考虑E=mc²(那个也不重要吧?)
碰壁突然快速旋转是因为碰撞处理不科学。 ...

其实我在夸你已经考虑的很周全了!能不能再弄个有弹性的,皮球和海绵的效果对比一定很有趣。哎,动能定理动量守恒什么的全忘了!

0xAA55 发表于 2014-4-18 00:50:04

Jack 发表于 2014-4-17 16:48
其实我在夸你已经考虑的很周全了!能不能再弄个有弹性的,皮球和海绵的效果对比一定很有趣。哎,动能定理 ...

那是柔体引擎……

Jackeriss 发表于 2014-4-18 00:53:14

0xAA55 发表于 2014-4-18 00:50
那是柔体引擎……

啊,那不属于物理引擎吗?是不是太复杂了。。

0xAA55 发表于 2014-4-18 00:55:17

Jack 发表于 2014-4-17 16:53
啊,那不属于物理引擎吗?是不是太复杂了。。

是属于物理引擎。。。只是不知道2D的柔体引擎是个什么心态。。。

Jackeriss 发表于 2014-4-18 00:58:00

0xAA55 发表于 2014-4-18 00:55
是属于物理引擎。。。只是不知道2D的柔体引擎是个什么心态。。。

玩的心态。。。

0xAA55 发表于 2014-4-18 02:08:18

Jack 发表于 2014-4-17 16:58
玩的心态。。。

交给你了。其实超简单的。

Jackeriss 发表于 2014-4-18 11:42:56

0xAA55 发表于 2014-4-18 02:08
交给你了。其实超简单的。

可要加上物体形变就不简单了吧

0xAA55 发表于 2014-4-18 15:27:26

Jack 发表于 2014-4-18 03:42
可要加上物体形变就不简单了吧

其实只是改变了计算模型而已。柔体的质点弹簧法。

xiawan 发表于 2022-5-10 16:34:49


感谢楼主分享~~~

xman2000 发表于 2023-3-8 17:04:18

感谢楼主分享~~~
页: [1]
查看完整版本: 【VB】VB编写的一个超简单的2D物理引擎