- UID
- 1
- 精华
- 积分
- 76361
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
我编写这个只是为了研究物理引擎的算法。先用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下载:
SimPhyEXE.7z
(6.05 KB, 下载次数: 19, 售价: 1 个宅币)
源码下载:
SimPhy.7z
(9.04 KB, 下载次数: 14, 售价: 10 个宅币)
|
|