• bullet中btMotionState的理解


    在上一篇文章中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   btMotionState
    00024 {
    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 objects
    00035                 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结合的原理没有障碍。


    好了,今天就写到这吧!!


  • 相关阅读:
    jq实现简单的二级联动下拉框
    jq实现多选框及反选
    用js和css实现选项卡效果+jq(2019-10-09)
    python 创建类的实例对象
    selenium——获取元素的尺寸、文本信息、元素的属性、元素是否可见
    selenium——表单嵌套
    selenium控制浏览器
    类的应用
    零散的python知识点
    安装python2、python3
  • 原文地址:https://www.cnblogs.com/dancingrain/p/3405239.html
Copyright © 2020-2023  润新知