【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下载:
源码下载:
LZ你这么屌你家里人知道么! 好有趣啊,不过不知道为什么有时碰壁时会突然快速旋转。(还有,你考虑E=mc^2了吗?;P) Jack 发表于 2014-4-17 16:36
好有趣啊,不过不知道为什么有时碰壁时会突然快速旋转。(还有,你考虑E=mc^2了吗?) ...
我没考虑E=mc²(那个也不重要吧?)
碰壁突然快速旋转是因为碰撞处理不科学。 0xAA55 发表于 2014-4-18 00:40
我没考虑E=mc²(那个也不重要吧?)
碰壁突然快速旋转是因为碰撞处理不科学。 ...
其实我在夸你已经考虑的很周全了!能不能再弄个有弹性的,皮球和海绵的效果对比一定很有趣。哎,动能定理动量守恒什么的全忘了! Jack 发表于 2014-4-17 16:48
其实我在夸你已经考虑的很周全了!能不能再弄个有弹性的,皮球和海绵的效果对比一定很有趣。哎,动能定理 ...
那是柔体引擎…… 0xAA55 发表于 2014-4-18 00:50
那是柔体引擎……
啊,那不属于物理引擎吗?是不是太复杂了。。 Jack 发表于 2014-4-17 16:53
啊,那不属于物理引擎吗?是不是太复杂了。。
是属于物理引擎。。。只是不知道2D的柔体引擎是个什么心态。。。 0xAA55 发表于 2014-4-18 00:55
是属于物理引擎。。。只是不知道2D的柔体引擎是个什么心态。。。
玩的心态。。。 Jack 发表于 2014-4-17 16:58
玩的心态。。。
交给你了。其实超简单的。 0xAA55 发表于 2014-4-18 02:08
交给你了。其实超简单的。
可要加上物体形变就不简单了吧 Jack 发表于 2014-4-18 03:42
可要加上物体形变就不简单了吧
其实只是改变了计算模型而已。柔体的质点弹簧法。
感谢楼主分享~~~ 感谢楼主分享~~~
页:
[1]