bullet中btMotionState的理解
来源:互联网 发布:linux桌面版哪个好 编辑:程序博客网 时间:2024/06/05 09:59
在上一篇文章中http://blog.csdn.net/doufei_ccst/article/details/7472663简单的讲了怎么改变bullet场景中物体的速度,
这里简单的讲一下btMotationSate 在把bullet结合进自己的3D引擎中时所起到的作用。
在bullet中,bullet本身是没有绘制功能的,因此就需要和其他的3D引擎结合起来完成场景的绘制。
假设我们选用的3D引擎叫做XXX3D ,那么XXX3D主要完成场景的绘制,而bullet主要完成场景中物体的物理。
例如:碰撞检测,重力影响 等。
这样,bullet会为XXX3D图像提供一个包围壳(我暂且这样叫了),这个包围壳是不显示的,我们看不到的,
只是存在于虚拟的物理空间中。XXX3D绘制的物体会显示在屏幕上,代表物理空间中的一个具体的物体。
那么这两者的位置变化又是怎么联系在一起的呢?
这里主要是通过btMotionState来完成的:
The btMotionState interface class allows the dynamics world to synchronize and interpolate the updated world transforms with graphics For optimizations, potentially only moving objects get synchronized (using setWorldPosition/setWorldOrientation).
也就是说,btMotionState是XXX3D和bullet之间位置变化的纽带.
00023 class btMotionState00024 {00025 public:00026 00027 virtual ~btMotionState()00028 {00029 00030 }00031 00032 virtual void getWorldTransform(btTransform& worldTrans ) const =0;00033 00034 //Bullet only calls the update of worldtransform for active objects00035 virtual void setWorldTransform(const btTransform& worldTrans)=0;00036 00037 00038 };可以看出,这是一个纯虚类,我们需要写自己的子类来继承这个函数,同时实现里面的
virtual void getWorldTransform(btTransform& worldTrans ) const =0;和
virtual void setWorldTransform(const btTransform& worldTrans)=0;方法。
通过getWorldTransform方法我们可以得到bullet的变化矩阵,使用这个变化矩阵对XXX3D物体施加这样的操作就可以达到
XXX3D绘制物体随着bullet包围壳移动的效果。
通过setWorlkTransform方法我们可以把XXX3D的变化矩阵传递给bullet,这样XXX3D中相应的物体在bullet中的包围壳就
可以使用这个变换矩阵更新自己的位置。
通过这样的两个函数就达到同步的效果了!
下面根据自己的实际经验讲一下怎么同步改变物体的位置(XXX3D物体和bullet包围壳同步移动):
void Isgl3dMotionState::getWorldTransform(btTransform& centerOfMassWorldTrans) const {float transformation[16];[_node getTransformationAsOpenGLMatrix:transformation];//这里相当于得到XXX3D中物体的转换矩阵centerOfMassWorldTrans.setFromOpenGLMatrix(transformation);//传递给bullet中的包围壳}void Isgl3dMotionState::setWorldTransform(const btTransform& centerOfMassWorldTrans) {float transformation[16];centerOfMassWorldTrans.getOpenGLMatrix(transformation);//从bullet中得到包围壳的转换矩阵[_node setTransformationFromOpenGLMatrix:transformation];//传递给XXX3D中的物体}注:这里我在开发的过程中选用的是iSGL3D开发引擎,所以上面的代码也是和iSGL3D有点关系的,不过对于理解bullet和XXX3D结合的原理没有障碍。
好了,今天就写到这吧!!
- bullet中btMotionState的理解
- bullet 中 btCollisionObject 的一些函数的理解
- Bullet中创建中心不在原点的碰撞体
- Bullet的最小化功能封装
- bullet 基本的类结构
- iOS 中引入Bullet 物理引擎
- 在Bullet Physics Engine中使用约束
- D3.js中Bullet Charts详解
- 整合OGRE和bullet的地形
- Bullet的3D Max插件
- Bullet学习之你的Hello World
- ogre和bullet的整合注意事项
- windows 下bullet库的安装使用
- bullet HashMap 内存紧密的哈希表
- bullet物理引擎btBvhTriangleMeshShape,btHeightfieldTerrainShape的使用
- Bullet physics 引擎的官方文档翻译
- Bullet physics 引擎的官方文档翻译
- 在Ubuntu下构建Bullet以及运行Bullet的例子程序
- 基于 Android NDK 的学习之旅-----Java 调用C
- maximo 按钮
- u-boot中的include/autoconf.mk文件是如何生成的
- 转 相信未来国内或许会像关心自己儿子一样研究电池
- 接下来的半年应该好好规划
- bullet中btMotionState的理解
- VC++获取系统当前时间
- 不重新启动LINUX服务器添加新硬盘!
- oracle 的to_char、to_number、to_date用法
- php打开文件fopen函数
- BACKUP DATABASE
- Linux查看和结束进程命令详解
- 常用下载资料网站
- 用git 更新自己的代码