官方文档: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. 为什么需要权重初始化(weight initialization)?常见的权重初始化方式有哪些?启发式权重初始化的好处?

    为什么需要权重初始化(weight initialization)?常见的权重初始化方式有哪些?启发式权重初始化的好处? 目录 为什么需要权重初始化(weight initialization)?常见 ...

  2. 碎片2:大白话讲解Mask R-CNN及常见物体检测算法

    文章目录 MASK R-CNN调研报告 1.Introduction 1.1 MASK R-CNN简介 1.2 直觉理解MASK R-CNN 2.Algorithm 2.1已有物体检测算法概述 2.1 ...

  3. 化学实验室自动化 - 1. 深度学习视觉检测(实例分割) - COCO格式的化学实验室常见物体实例分割数据集制作

    前言 随着自动化.智能化技术在各行各业获得了广泛应用,化学实验室领域也不可避免的迎来了变革.视觉检测是自动化和智能化的基础,本文将介绍化学实验室常见物体的COCO格式的实例分割数据集的制作方法,后续将 ...

  4. 常见的参数初始化方法

    常见的参数初始化方法 我们常见的几种初始化方法是按照"正态分布随机初始化--对应为normal"和按照"均匀分布随机初始化--对应为uniform",这里就不再 ...

  5. DirectX12渲染物体的初始化流程

    最近想通过DirectX12写一些简单的DEMO,初始化DirectX是每个DEMO都不可避免的,文章将对其初始化做一个简单的总结,对相关概念和笔者认为需重点掌握的概念和需要关注的流程和API做简单说 ...

  6. Bullet3物理引擎碰撞检测相关代码片段

    近期公司要做多人末日生存类手游(对就是吃鸡!!) 所以笔者兴趣爱好就是钻研! 所以自己课下就调研下同步.碰撞检测.射线检测.移动寻路系统.定点数 在调研碰撞检测过程中,发现某Moba游戏源码中有相关片 ...

  7. SLAM系列——机器人顶刊T-RO!用于关联、建图和高级任务的物体级SLAM框架

    系列文章目录 SLAM系列--第一讲 预备知识[2023.1] SLAM系列--第二讲 初识SLAM[2023.1] SLAM系列--第三讲 三维空间刚体运动[2023.1] SLAM系列--第四讲 ...

  8. 一文看懂神经网络初始化!

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:磐创AI [导读]神经网络的初始化是训练流程的重要基础环 ...

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

    来源:新智元 本文约3000字,建议阅读5分钟. 本文是deeplearning.ai的一篇技术博客,对初始化值的大小选取不当,可能造成梯度爆炸或梯度消失等问题,并提出了针对性的解决方法. 神经网络的 ...

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

      新智元报道   来源:deeplearning.ai 编辑:大明 [新智元导读]神经网络的初始化是训练流程的重要基础环节,会对模型的性能.收敛性.收敛速度等产生重要的影响.本文是deeplearn ...

最新文章

  1. protobuf-2.6.1生成java文件
  2. AC日记——任务查询系统 洛谷 P3168
  3. udacity开源的数据_评论:Udacity数据分析师纳米学位计划
  4. “SqlNullValueException: Data is Null. This method or property cannot be called on Null values.”的解决方案
  5. linux wget安装mysql_linux安装mysql
  6. 迪杰斯特拉算法dijkstra(可打印最短路径)
  7. 统一修改gcd高程文字样式_样式与格式的使用
  8. 用友u8不显示服务器名,用友u8提示对数据库服务器名
  9. 基于python的图像处理的毕业论文_图像处理毕业论文 精品
  10. 算命小程序公历农历阴历阳历切换选择组件
  11. 5年后、10年后,你希望自己是个什么样的人?
  12. 一个有下雨效果的注册界面(html+css+原生javascript)
  13. 数据分析之Excel
  14. UEFI启动模式下, 双硬盘安装UBuntu16.04与Win10双系统
  15. android水印控件,Android图片添加文字水印并保存水印文字图片到指定文件
  16. Ps经典实例教程3000例
  17. SpringBoot 自定义全局异常处理器
  18. 智能世界2030八大展望
  19. 计算机组成原理实验箱D7,计算机组成原理实验(实验箱).doc
  20. Mac快捷键大全(常用的可以修改)

热门文章

  1. 作为管理者,就不要总等着领导给你布置任务了
  2. java 获取剪切板文件_如何在Java程序中读写系统剪切板的数据
  3. Excel单元格引用方式
  4. 小米手机连接电脑只能看到部分相片_小米手机连接电脑后怎么看照片?
  5. Dynamics CRM 365 - 零基础入门学习后端插件的调试方法
  6. python学习笔记(8)
  7. 8-PIN STM8优秀设计集锦
  8. 安卓ASO怎么做?有哪些工具平台?安卓aso工具有哪些
  9. matlab洛伦兹吸引子,用Matlab求解洛伦兹方程
  10. 修改dns服务器有什么用,修改dns的好处是什么?