官方文档:http://bulletphysics.org

开源代码:https://github.com/bulletphysics/bullet3/releases

API文档:http://bulletphysics.org/Bullet/BulletFull/annotated.html

1. 初始化物体

  1. 物体的形状由btCollisionShape对象维护;
  2. 物体的位置,旋转状态由btTransform对象维护;
  3. 最终需要将物体封装成btRigidBodybtSoftBody或其它对象;
  4. 然后将步骤3的对象加入到场景中。

例如

btCollisionShape* shape = new btBoxShape(btVector3(btScalar(1000.),btScalar(10.),btScalar(1000.)));
btTransform trans; // 位置、旋转维护对象
trans.setIdentity();
trans.setOrigin(btVector3(0, -10, 0)); // 设置位置 btScalar mass=0.f;
btVector3 localInertia(0, 0, 0);
bool isDynamic = (mass != 0.f);
if (isDynamic)
shape->calculateLocalInertia(mass, localInertia); // 设置惯性 btDefaultMotionState* myMotionState = new btDefaultMotionState(trans);
btRigidBody::btRigidBodyConstructionInfo cInfo(mass, myMotionState, shape, localInertia);
btRigidBody* body = new btRigidBody(cInfo); // 封装成刚体
g_world->addRigidBody(body); // 将物体添加到场景

2. 常见物体对象

  • btCollisionObject 基类
  • btRigidBody 刚体
  • btSoftBody 流体

2.1. 物体对象常用函数

  • btCollisionShape* btCollisionObject::getCollisionShape()

    • btCollisionObject对象中获取形状维护对象
  • void btCollisionObject::setFriction(btScalar frict)
    • 设置摩擦力
    • 默认值:0
  • void btCollisionObject::setRestitution(btScalar rest)
    • 设置碰撞反弹系数
    • 默认值:0
  • void btRigidBody::applyImpulse(const btVector3 & impulse, const btVector3 & rel_pos)
    • 设置冲量/动量(通过这个设置初始速度)
  • void btRigidBody::applyCentralImpulse(const btVector3 & impulse)
    • 设置冲量/动量(通过这个设置初始速度)
    • 默认值:0

3. 初始化常见物体形状

http://bulletphysics.org/Bullet/BulletFull/classbtCollisionShape.html

常见的物体有长方体、球体、胶囊体、三角网格集合。

  • btCollisionShap

    • 基类
  • btBoxShape
    • 长方体
    • BOX_SHAPE_PROXYTYPE
  • btSphereShape
    • 球体
    • SPHERE_SHAPE_PROXYTYPE
  • btCapsuleShape
    • 胶囊体
    • CAPSULE_SHAPE_PROXYTYPE
  • btBvhTriangleMeshShap
    • 三角网格
    • TRIANGLE_MESH_SHAPE_PROXYTYPE

3.1. 物体对象常用函数

  • int btCollisionShape::getShapeType() const

    • 获取物品类型,类型参考以下枚举
    • #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" //for the shape types

3.2. 三角网格

  • 构造函数btBvhTriangleMeshShape::btBvhTriangleMeshShape(btStridingMeshInterface* meshInterface,bool useQuantizedAabbCompression)
  • 构造函数btBvhTriangleMeshShape::btBvhTriangleMeshShape(btStridingMeshInterface* meshInterface,bool useQuantizedAabbCompression, bool buildBvh = true)
  • btTriangleIndexVertexArray类集成于 btStridingMeshInterface接口。
  • btIndexedMesh 三角网格顶点列表和索引列表维护类
3.2.1. 三角网格数据假设格式如下
  • 顶点表 Vertex Buff
  • 三角形表 Index Buff
#define Landscape03.txCount 1980      // 顶点数量
#define Landscape03.dxCount 11310 // 三角形数量
#include "LinearMath/btScalar.h" btScalar Landscape03.tx[] = { // 顶点坐标列表(三维)
-3.0.0f,3.99193.,113.3.1f,
-3.0.0f,3.18397f,117.188f,
-3.6.094f,1.63.63.,113.3.1f,
...}; unsigned short Landscape03.dx[] = { // 三角形列表
0,1,3.
3,3.1,
3.3,4,
5,4,3,
4,5,6,
...};
3.2.3. btStridingMeshInterface接口

通用高性能三角网格访问接口。

btStridingMeshInterface* meshInterface = new btTriangleIndexVertexArray();
btIndexedMesh part; part.m_vertexBase = (const unsigned char*)LandscapeVtx[i];
part.m_vertexStride = sizeof(btScalar) * 3;
part.m_numVertices = LandscapeVtxCount[i];
part.m_triangleIndexBase = (const unsigned char*)LandscapeIdx[i];
part.m_triangleIndexStride = sizeof( short) * 3;
part.m_numTriangles = LandscapeIdxCount[i]/3;
part.m_indexType = PHY_SHORT; meshInterface->addIndexedMesh(part,PHY_SHORT); bool useQuantizedAabbCompression = true;
btBvhTriangleMeshShape* trimeshShape = new btBvhTriangleMeshShape(meshInterface,useQuantizedAabbCompression);

3.3. 长方体

  • 构造函数btBoxShape::btBoxShape(const btVector3 & boxHalfExtents)
  • 长宽高,封装成btVector3对象

3.4. 球

  • 构造函数btSphereShape::btSphereShape(btScalar radius)
  • radius xyz轴的半径,可以设置为椭圆球

3.5. 胶囊体

  • 构造函数btCapsuleShape::btCapsuleShape()
  • 构造函数btCapsuleShape::btCapsuleShape(btScalar radius, btScalar height)
  • radius 胶囊体半径,可以设置为椭圆球
  • height 胶囊体长度,height为圆心之间的距离
  • 胶囊体的aabb的边的长度为 {radius2, radius2, radius*2+height}

[Bullet3]常见物体和初始化的更多相关文章

  1. SDRAM的初始化与刷新操作---看时序图写代码

    SDRAM的初始化与刷新操作---看时序图写代码 1.SDRAM的常见操作 2.初始化就是配置SDRAM 3.SDRAM初始化时序 时序解释如下: 4.刷新操作

  2. c++ 类初始化

    一. 成员初始化列表的位置. 成员初始化列表的位置位于构造函数的函数体和参数表之间.构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式,初始化 ...

  3. Java笔记: 初始化块

    Java语言提供了很多类初始化的方法,包括构造器.初始化器等.除了这两种方法之外,我们还可以用初始化块(initialization block)来实现初始化功能. 基本语法 初始化块是出现在类声明中 ...

  4. 一文看懂神经网络初始化!吴恩达Deeplearning.ai最新干货

    [导读]神经网络的初始化是训练流程的重要基础环节,会对模型的性能.收敛性.收敛速度等产生重要的影响.本文是deeplearning.ai的一篇技术博客,文章指出,对初始化值的大小选取不当,  可能造成 ...

  5. iommu分析之---intel iommu初始化

    intel 的iommu 是iommu框架的一个实现案例. 由于intel 的iommu 实现得比arm smmv3复杂得多,里面概念也多,所以针对intel 实现的iommu 案例的初始化部分进行一 ...

  6. 基于Unity的AR开发初探:第一个AR应用程序

    记得2014年曾经写过一个Unity3D的游戏开发初探系列,收获了很多好评和鼓励,不过自那之后再也没有用过Unity,因为没有相关的需求让我能用到.目前公司有一个App开发的需求,想要融合一下AR到A ...

  7. 全套 AR 应用设计攻略都在这里!

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/jILRvRTrc/article/details/79823908 通过将虚拟内容与现实世界融合,增 ...

  8. 【神经网络与深度学习】【计算机视觉】YOLO2

    YOLO2 转自:https://zhuanlan.zhihu.com/p/25167153?refer=xiaoleimlnote 本文是对 YOLO9000: Better, Faster, St ...

  9. [转]综述论文翻译:A Review on Deep Learning Techniques Applied to Semantic Segmentation

    近期主要在学习语义分割相关方法,计划将arXiv上的这篇综述好好翻译下,目前已完成了一部分,但仅仅是尊重原文的直译,后续将继续完成剩余的部分,并对文中提及的多个方法给出自己的理解. _论文地址:htt ...

随机推荐

  1. Codeforces AIM Tech Round3

    打得最烂一场Codeforces,多次都错题,无限WA... A题: 题意:给定n个橘子的大小,大小超过b的丢掉,不足d的补充进来,同时超过d的部分去掉,问要去掉几次 分析:直接模拟即可 #inclu ...

  2. mysql trouble shooting---- 从库停止同步lock_wait_timeout_exceeded_try_restarting_transaction

    问题描述: 数据库从库停止同步. 问题分析: show slave status\G;(也可使用show full processlist) 显示 某个update语句出错,Lock wait tim ...

  3. ZOJ 3931 Exact Compression

    题目看了半小时才看懂的. 题意:首先根据给出的序列,构造出哈夫曼树,构造出来的是一棵二叉树,每个节点都有一个权值,每个节点的两个儿子只能取一个,问能否使取出来的节点权值之和刚好等于e. 这样一分析就很 ...

  4. LPC1768的USB-相关结构体定义

    #ifndef __USB_H__ #define __USB_H__ //usb传输数据的宏定义描述 #include "sys.h" typedef __packed unio ...

  5. javascript 闭包理解

    摘自:http://www.cnblogs.com/jkswjw/p/3180384.html javascript 闭包基础分享 闭包向来给包括JavaScript程序员在内的程序员以神秘,高深的感 ...

  6. iOS 发布流程 分类: ios相关 app相关 2015-05-22 14:50 186人阅读 评论(0) 收藏

    1.登陆苹果开发者中心http://developer.apple.com(99美元账号) 2.进入itunes connect 3.选择Manage Your Apps 4.选择Add New Ap ...

  7. jQuery插件的开发

    jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...

  8. “&”详解

    1.引用 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样. &作为引用的时候,必须在定义时候就进行初始化,若不进行初始化则会编译报错. 2.取地址 &作为取地 ...

  9. 在Eclipse中配置tomcat

    为了在Eclipse中进行struts2的测试,才发现自己机器上的Eclipse没有集成Tomcat,在网上找了半天,不是这个插件没有下载地址,就是那个有好多注意事项或者版本问题. 结果,自己到tom ...

  10. ABP架构解析

    ABP总体介绍 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...