zoukankan      html  css  js  c++  java
  • [Bullet3]创建世界(场景)及常见函数

    创建世界(场景)及常见函数

    官方文档:http://bulletphysics.org
    开源代码:https://github.com/bulletphysics/bullet3/releases
    API文档:http://bulletphysics.org/Bullet/BulletFull/annotated.html

    0. 世界的继承类

    • btCollisionWorld
      • 基类
    • btDynamicsWorld
      • 继承于btCollisionWorld
      • 基础的动力学实现
    • btDiscreteDynamicsWorld
      • 继承于btDynamicsWorld
      • 刚体的运动模拟

    1. 创建世界(场景)

    // 初始化场景
    
    // 用于配置碰撞检测堆栈大小,默认碰撞算法,接触副本池的大小
    btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
    
    // 用于计算重叠对象(碰撞检测,接触点计算)(接触点会被封装成 btPersistentManifold 对象)
    btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
    
    // 提供成对的aabb重叠监测(重叠对象的管理,存储,增加删除等)
    btBroadphaseInterface* overlappingPairCache = new btDbvtBroadphase();
    
    btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver;
    btDynamicsWorld* world = new btDiscreteDynamicsWorld(dispatcher, overlappingPairCache, solver, collisionConfiguration);
    
    

    2. 场景函数

    • void btDynamicsWorld::addRigidBody(btRigidBody* body)
      • 添加一个刚体
    • void btCollisionWorld::removeCollisionObject(btCollisionObject* collisionObject)
      • 删除对象
    • int btCollisionWorld::getNumCollisionObjects()
      • 获取数量
    • btAlignedObjectArray<btCollisionObject*> btCollisionWorld::getCollisionObjectArray()
      • 获取场景所有对象
    • void btDynamicsWorld::setGravity(const btVector3& gravity)
      • 设置重力
      • 默认值:btVector3(0,0,0)
    • void btDynamicsWorld::performDiscreteCollisionDetection()
      • 碰撞检测
    • int btDynamicsWorld::stepSimulation(btScalar timeStep, int maxSubSteps = 1, btScalar fixedTimeStep = btScalar(1.)/btScalar(60.))
      • 模拟运动

    3. 举例

    1. 场景场景;
    2. 添加一个刚体;
    3. 释放内存退出。
    #include "btBulletDynamicsCommon.h"
    #include <stdio.h>
    
    int main(int argc, char** argv)
    {
        int i;
        ///-----initialization_start-----
    
        ///collision configuration contains default setup for memory, collision setup. Advanced users can create their own configuration.
        btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
    
        ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded)
        btCollisionDispatcher* dispatcher = new	btCollisionDispatcher(collisionConfiguration);
    
        ///btDbvtBroadphase is a good general purpose broadphase. You can also try out btAxis3Sweep.
        btBroadphaseInterface* overlappingPairCache = new btDbvtBroadphase();
    
        ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded)
        btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver;
    
        btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,overlappingPairCache,solver,collisionConfiguration);
    
        dynamicsWorld->setGravity(btVector3(0,-10,0));
    
        ///-----initialization_end-----
    
        //keep track of the shapes, we release memory at exit.
        //make sure to re-use collision shapes among rigid bodies whenever possible!
        btAlignedObjectArray<btCollisionShape*> collisionShapes;
    
    
        ///create a few basic rigid bodies
        btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.)));
    
        btTransform groundTransform;
        groundTransform.setIdentity();
        groundTransform.setOrigin(btVector3(0,-56,0));
    
        btScalar mass(0.);
    
        //rigidbody is dynamic if and only if mass is non zero, otherwise static
        bool isDynamic = (mass != 0.f);
    
        btVector3 localInertia(0,0,0);
        if (isDynamic)
            groundShape->calculateLocalInertia(mass,localInertia);
    
        //using motionstate is optional, it provides interpolation capabilities, and only synchronizes 'active' objects
        btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform);
        btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia);
        btRigidBody* body = new btRigidBody(rbInfo);
    
        //add the body to the dynamics world
        dynamicsWorld->addRigidBody(body);
    
        //cleanup in the reverse order of creation/initialization
        delete body;
        delete myMotionState;
        delete groundShape;
    
        delete dynamicsWorld;
        delete solver;
        delete overlappingPairCache;
        delete dispatcher;
        delete collisionConfiguration;
    }
    
    
  • 相关阅读:
    03 http请求协议与响应协议
    02 web应用程序
    Django web框架目录
    01 http协议
    Django框架
    Bootstrap栅格系统
    bootstrap介绍和引入
    Python中日志logging模块
    Python 装饰器实现单列模式
    Python 如何理解可更改元组中的可变序列
  • 原文地址:https://www.cnblogs.com/rond/p/6371682.html
Copyright © 2011-2022 走看看