bulletphysics初识

来源:互联网 发布:数据迁移工具在哪 编辑:程序博客网 时间:2024/06/05 12:33

第一步,当然是搜索bulletphysics,经过筛选,会得到如下有用信息:

百度百科:开源物理引擎一堆套话,忽略不计;

Bullet官方:http://bulletphysics.org/wordpress/  balabala 挑选有用的。左上角特别小的icon

第二步,当然是Download。选择尽量比较新的版本,当然如果有特殊需求,选择自己需要的版本即可。

这个是我下载的版本。

打开看看list

自己觉得英文比较好的话,就可以开始看Bullet_User_Manual.pdf

目录简单介绍:

 Demos 演示例子。

 Extras  兼容库

 Glut   界面渲染库

 Lib    暂时是空的

 Msvc  各种显卡和VS版本的项目文件

 Src    源码

 UniteTests 测试用例子

这个版本是已经编译好的Window版本。

接着进入

Msvc 目录选择自己合适的项目打开,

因为我用的是VS2010,所以选择进入该文件夹,打开解决方案.sln. 即可进入学习。

当然还有获得代码的SVN checkout途径:http://bullet.googlecode.com/svn/trunk  (this is read only

此版本需要配合cmake,编译使用,checkout完毕以后,

需要安装cmake

详细参见 http://bulletphysics.org/mediawiki-1.5.8/index.php/Installation

图文教程 http://bulletphysics.org/mediawiki-1.5.8/index.php/Creating_a_project_from_scratch

Cmake 图标

在线文档:http://bulletphysics.com/Bullet/BulletFull/index.html

国人写的入门教程 :http://blog.csdn.net/vagrxie/article/details/5952310

正题:

BulletPhysics Demos

App_BasicDemo

1.入口函数,不解释。

int main(int argc,char** argv)

{

BasicDemo ccdDemo; 建立了一个类

ccdDemo.initPhysics();初始化

ccdDemo.getDynamicsWorld()->setDebugDrawer(&sDebugDraw);

#ifdef CHECK_MEMORY_LEAKS

ccdDemo.exitPhysics();

#else

return glutmain(argcargv,1024,600,"Bullet Physics Demo. http://bulletphysics.org",&ccdDemo);

//gultmain 函数 界面入口;注册回调,按键响应等功能

#endif

//default glut doesn't return from mainloop

return 0;

}

接着来看 BasicDemo.h

#define PlatformDemoApplication GlutDemoApplication

class BasicDemo : public PlatformDemoApplication

{

BasicDemo(){}

virtual ~BasicDemo(){exitPhysics();}

    //万恶的少年,你发现了,框架函数

voidinitPhysics();

voidexitPhysics();

virtual void clientMoveAndDisplay();

virtual void displayCallback();

virtual voidclientResetScene();

//所有demo的基类函数

static DemoApplicationCreate()

{

BasicDemodemo = new BasicDemo;

demo->myinit();

demo->initPhysics();

return demo;

}

所以当你需要了解这个流程的时候 请参看DemoApplication类。

接下来,我们来看BasicDemo的流程。

首先是 initPhysics()

1.纹理和阴影以及镜头初始化(别问为什么!这是规则,就这样)

setTexturing(true);

setShadows(true);

setCameraDistance(btScalar(SCALING*50.));

2.balabala 后面的每行解释参看英文注释,跳过simida

3.  下面是:

m_dynamicsWorld = new btDiscreteDynamicsWorld(

m_dynamicsWorld->setGravity(btVector3(0,-10,0));

模拟世界的建立,模拟重力的设定。

4.  下面是:

     //create a few basic rigid bodies 创建基本元素。

     创建元素分两种方法,一种是例子中的code描述;

     另一种是DemoApplication::localCreateRigidBody

5.  接着看完函数以后,我们在每个函数入口打个断点。运行,调试。

6.  对了 就是这个

clientMoveAndDisplay() 主循环回调函数(Loooop())。这个函数是注册在GultMain函数里的。

Tips; 某大牛说  大概看看DemoApplication这个基类和GlutDemoApplication知道必须要实现的两个纯虚函数是
virtual  void initPhysics() = 0;
virtual  void clientMoveAndDisplay() = 0;
BasicDemo的实现后,知道还需要实现displayCallback这个现实回调,基本上就没有其他东西了,理解起来也还算容易。
原来的程序有些代码重复,其实只要下列代码就够了:(一般的程序也不需要修改)
void  BasicDemo::clientMoveAndDisplay()
{
    //simple dynamics world doesn't handle fixed-time-stepping
    float  ms = getDeltaTimeMicroseconds();
    
    ///step the simulation
    if  (m_dynamicsWorld)
    {
        m_dynamicsWorld->stepSimulation(ms / 1000000.f );
    }
        
    displayCallback();
}

void  BasicDemo::displayCallback(void ) {

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    renderme();
    //optional but useful: debug drawing to detect problems
    if  (m_dynamicsWorld)
        m_dynamicsWorld->debugDrawWorld();

//绘图刷新
    glFlush();
    swapBuffers();
}

好了框架大致讲到这里,接着我们来继续往后走,自己写一个小例子:

巴拉巴拉巴拉

建项目,Win32Console Project 如果是需要独立接口和插件,请建立DLL,后面讲)

模仿建立一个Demo类,实现接口函数

Main函数 copy下例子基本一样了。(参见示例)

这里主要讲一下设置。

第一步引入项目;

第二步设置库路径:

Debug Information Format 也要注意下哈。

第三步LINKER中引用GLUT


第四步引入reference 

大功告成。截图不贴。

原文参考:http://www.showcoor.com/a/jisuanji/biancheng/C__/2012/0918/69.html

Click

原创粉丝点击