opengl教程第39课物理模拟简介_第1页
opengl教程第39课物理模拟简介_第2页
opengl教程第39课物理模拟简介_第3页
opengl教程第39课物理模拟简介_第4页
opengl教程第39课物理模拟简介_第5页
已阅读5页,还剩3页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第三十九课 物理模拟简介:还记得高中的物理吧,直线运动,落体运动,弹簧。在这一课里,创造这一切。物理模拟介绍如果你很熟悉物理规律,并且想实现它,这篇文章很适合你。在这篇里,你会创建一个非常简单的物理引擎,创建以下类:内容:位置类* classVector3D -用来物体的三维坐标的类力和运动* classMass -表示一个物体的物理属性模拟类* classSimulation -模拟物理规律模拟匀速运动* class ConstantVelocity: public Simulation -模拟匀速运动模拟在力的作用下运动* class MotionUnderGraviion : publi

2、c Simulation -模拟在引力的作用下运动模拟在弹簧的作用下运动* class MassConnectedWithSpring : public Simulation -class Masspublic: float m; Vector3D Vector3DVector3D/ 质量/ 位置/ 速度/ 力;vel; force;Mass(float m)this-m = m;/ 构造函数.下面的代码给物体增加一个力,在初始时这个力为 0void applyForce(Vector3Dthis-force += force;force)/ 增加一个力void init()/ 初始时设为 0

3、force.xforce.y force.z=0;0;0;.下面的步骤完成一个模拟:设置力应用外力根据力的时间,计算物体的位置和速度void simulate(float dt)vel += (force/ m) * dt;/ 更新速度+= vel *dt;/ 更新位置模拟类怎样:在一个物理模拟中,按以下规律进行模拟,设置力,更新物体的位置和速度,按时间一次又一次的进行模拟。下面是它的实现代码:class Simulationpublic:numOfMasses; Mass* masses;/ 物体的个数/ 指向物体结构的指针Simulation(numOfMasses,float m)/ 构

4、造函数this-numOfMasses = numOfMasses;masses = new Mass*numOfMasses;for (a = 0; a numOfMasses;+a)massesa = new Mass(m);virtual void release()/所有的物体for (a = 0; a numOfMasses;+a)delete(massesa);massesa = NULL;delete(masses);masses = NULL;Mass* getMass(index)if (index = numOfMasses)return NULL;/ 返回第i 个物体re

5、turn massesindex;.(class Simulation continued)virtual void init()/ 初始化所有的物体for (a = 0; a init();virtual void solve()/虚函数,在具体的应用中设置各个施加给各个物体的力virtual void simulate(float dt)/让所有的物体模拟一步for (a = 0; a simulate(dt);.整个模拟的部分被封装到下面的函数中(class Simulation continued)virtual voidinit();solve();operate(float dt)

6、/完整的模拟过程/ 设置力为 0/ 应用力/ 模拟simulate(dt);现在已经有了一个简单的物理模拟引擎了,它包含有物体和模拟两个类,下面基于它们创建三个具体的模拟对象:1.2.3.具有恒定速度的物体 具有恒定加速度的物体具有与距离成反比的力的物体在程序中控制一个模拟对象:在写一个具体的模拟类之前,让看看如何在程序中模拟一个对象,在这个里,模拟引擎和操作模拟的程序在两个文件里,在程序中使用如下的函数,操作模拟:void Update (DWORD milliseconds)/ 执行模拟这个函数在每一帧的开始更新,参数为相隔的时间。void Update (DWORD millisecon

7、ds).float dt = milliseconds/1000.0f;/ 转化为秒dt /= slowMotionRatio;/ 除以模拟系数timeElapsed += dt;/ 更新流失的时间.在下面的代码中,定义一个处理间隔,没隔这么长时间,让物理引擎模拟一次。.float maxsible_dt = 0.1f;/ 设置模拟间隔numOfIterations = ()(dt / maxsible_dt) + 1;/计算在流失的时间里模拟的次数if (numOfIterations != 0)dt = dt / numOfIterations;for (a = 0; a operate(

8、dt);motionUnderGraviion-operate(dt);massConnectedWithSpring-operate(dt);下面让来写着两个具体的模拟类:1. 具有恒定速度的物体* class ConstantVelocity : public Simulation-模拟一个匀速运动的物体class ConstantVelocity : public Simulationpublic:ConstantVelocity() : Simulation(1, 1.0f)masses0-= Vector3D(0.0f, 0.0f, 0.0f); masses0-vel = Vect

9、or3D(1.0f, 0.0f, 0.0f);/ 初始位置为 0/ 向右运动下面来创建一个具有恒定加速的物体:class MotionUnderGraviion : publicSimulationVector3D graviion;/加速度MotionUnderGraviion(Vector3D graviion) : Simulation(1, 1.0f)/构造函数this-graviion = graviion;/ 设置加速度masses0-= Vector3D(-10.0f, 0.0f, 0.0f);masses0-vel = Vector3D(10.0f, 15.0f, 0.0f);

10、/设置位置为左边-10 处设置速度为右上.下面的函数设置施加给物体的力virtual void solve()/ 设置当前的力for (a = 0; a applyForce(graviion * massesa-m);下面的类创建一个受到与距离成正比的力的物体:class MassConnectedWithSpringpublic:float springConstant;:public Simulation/ 弹性系数/ 连接方向Vector3D connection;MassConnectedWithSpring(float springConstant) : Simulation(1,this-springConstant = springConstant;1.0f)/构造函数connection= Vector3D(0.0f, -5.0f, 0.0f);masses0-= connection+ Vector3D(10.0f, 0.0f, 0.0f);masses0-vel = Vector3D

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论