写在所有的内容之前:如果您的E文足够强悍, bullet自带的Bullet User Manual一定要看一看【哪怕是根本不强悍其实也要如此】。当然了,直接硬生生的去看,对于没有接触过物理引擎的来说,确实是一件痛苦又自虐的事情。不过痛并快乐着嘛!相信在看完本文后,在看user manual的话,应该会更容易一些。学习如果更有目的性,自然会更舒畅。但是,user manual是一定要看的。而且不推荐看中文翻译。并非贬低那些辛苦的翻译者们,那些翻译的文档当然会对阅读英文文档有些帮助,但是毕竟原文中有很多翻译者无法精确表述的部分。
Bullet是一个很有意思的物理引擎。之所以有意思,是因为我不会,又听说相对简单。不管怎么样,这是一篇学习记录。初学乍练,也不会回答任何问题。只是想把bullet中最简单的创建过程记录下来。错误是必然的,可以说是肯定有的。毕竟是第一次接触。以后检验吧!
为了使得我们做出来的东西能看得见摸得着【事实上真的可以摸到哦,用鼠标】,Bullet提供了一些学习用的类:DemoApplication,是用glut实现的各种功能。包括窗口啦,键盘鼠标响应啦,甚至还有纹理与阴影光照。
所以说,我们可以首先创建一个自己的类,名字暂时叫做BasicDemo【因为人家给的例子叫这个名字…既然是人家的代码…就要保持高度的还原度嘛】,公有继承GlutDemoApplication类。
BasicDemo类中,首先定义一些私有成员以及公有成员函数,具体的请看如下【因为详细解释都在代码里面。这里还要多嘴一句,#pragma once这句一定要有啊,不然的话,嘿嘿。我写代码最喜欢重叠头文件…所以多亏了这句代码帮忙了】:
#pragma once
#include <OpenGL/GlutDemoApplication.h>
#include <LinearMath/btAlignedObjectArray.h>
#include <btBulletDynamicsCommon.h>
class BasicDemo :
public GlutDemoApplication
{
private:
//默认的碰撞设置。包含了一些内存设置,碰撞设置等等。用户可以自定义设置。
btDefaultCollisionConfiguration* m_collisionConfiguration;
//碰撞调度器。大概是设置碰撞方法的?暂时不是很理解。并行处理的需要参看其他。
btCollisionDispatcher* m_dispatcher;
//宽相,这个概念不明白。果然物理碰撞一点不懂啊……貌似是很多物理引擎都是用的概念
//需要好好看看了。这里说btDbveBroadphase是很通用的broadphase
btBroadphaseInterface* m_overlappingPairCache;
//默认的约束solver【解算器?】并行的solver请参考其他。
//时序脉冲约束solver,是不是线性的意思?
btSequentialImpulseConstraintSolver* m_solver;
//这个类提供一种分离刚体的模拟。模拟什么的。
//其构造函数后面有一些参数,顺次是:
//dispatcher碰撞调度器
//宽相的那个概念的东西。不理解
//设置约束solver
//碰撞设置collisionconfiguration
//但是这里不能自定义啊,自定义的出不来东西……
// btDynamicsWorld* m_dynamicsWorld;
//btAlignedObjectArray是一个类似于vector的存在
//bullet讲究的是责任分配到家。谁分配内存,谁删除内存
//只要有可能就要确保在刚体中复用碰撞形体。翻译的真不叫事。还不如看英文。
//这个vector的作用大概主要是删除内存或者复用的时候很方便吧!
btAlignedObjectArray<btCollisionShape*> m_collisionShapes;
public:
BasicDemo(void){}
~BasicDemo(void){exitPhysics();}
void initPhysics(); //物理设置
void exitPhysics(); //撤销物理设置
//这个应该是客户端的移动和显示函数。场景生成一定要调用这个函数
//虚函数,就不解释了。重载于DemoApplication【貌似在这个类里面是纯虚的吧?】
virtual void clientMoveA