[Bullet3]常见物体和初始化
官方文档:http://bulletphysics.org
开源代码:https://github.com/bulletphysics/bullet3/releases
API文档:http://bulletphysics.org/Bullet/BulletFull/annotated.html
1. 初始化物体
- 物体的形状由
btCollisionShape对象维护; - 物体的位置,旋转状态由
btTransform对象维护; - 最终需要将物体封装成
btRigidBody或btSoftBody或其它对象; - 然后将步骤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]常见物体和初始化的更多相关文章
- SDRAM的初始化与刷新操作---看时序图写代码
SDRAM的初始化与刷新操作---看时序图写代码 1.SDRAM的常见操作 2.初始化就是配置SDRAM 3.SDRAM初始化时序 时序解释如下: 4.刷新操作
- c++ 类初始化
一. 成员初始化列表的位置. 成员初始化列表的位置位于构造函数的函数体和参数表之间.构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式,初始化 ...
- Java笔记: 初始化块
Java语言提供了很多类初始化的方法,包括构造器.初始化器等.除了这两种方法之外,我们还可以用初始化块(initialization block)来实现初始化功能. 基本语法 初始化块是出现在类声明中 ...
- 一文看懂神经网络初始化!吴恩达Deeplearning.ai最新干货
[导读]神经网络的初始化是训练流程的重要基础环节,会对模型的性能.收敛性.收敛速度等产生重要的影响.本文是deeplearning.ai的一篇技术博客,文章指出,对初始化值的大小选取不当, 可能造成 ...
- iommu分析之---intel iommu初始化
intel 的iommu 是iommu框架的一个实现案例. 由于intel 的iommu 实现得比arm smmv3复杂得多,里面概念也多,所以针对intel 实现的iommu 案例的初始化部分进行一 ...
- 基于Unity的AR开发初探:第一个AR应用程序
记得2014年曾经写过一个Unity3D的游戏开发初探系列,收获了很多好评和鼓励,不过自那之后再也没有用过Unity,因为没有相关的需求让我能用到.目前公司有一个App开发的需求,想要融合一下AR到A ...
- 全套 AR 应用设计攻略都在这里!
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/jILRvRTrc/article/details/79823908 通过将虚拟内容与现实世界融合,增 ...
- 【神经网络与深度学习】【计算机视觉】YOLO2
YOLO2 转自:https://zhuanlan.zhihu.com/p/25167153?refer=xiaoleimlnote 本文是对 YOLO9000: Better, Faster, St ...
- [转]综述论文翻译:A Review on Deep Learning Techniques Applied to Semantic Segmentation
近期主要在学习语义分割相关方法,计划将arXiv上的这篇综述好好翻译下,目前已完成了一部分,但仅仅是尊重原文的直译,后续将继续完成剩余的部分,并对文中提及的多个方法给出自己的理解. _论文地址:htt ...
随机推荐
- Ext实现简单计算器
以下是本人原创,如若转载和使用请注明转载地址.本博客信息切勿用于商业,可以个人使用,若喜欢我的博客,请关注我,谢谢!少帅的博客 使用Ext实现简单计算器,网页版实现 1.页面部分calculator. ...
- mysql 千万量级的表的优化
参考: 一 大的优化方向: 数据结构优化,慢查询优化,索引优化,mysql参数设置优化 数据结构优化:先读写分离.再垂直拆分.再水平拆分! 说3点 1. 设计合适的索引,基于主键的查找,上亿数据也是 ...
- DWR3.0框架入门(1) —— 实现ajax
框架简介:DWR(Direct Web Remoting) 是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏 ...
- C#的逆变和协变
out: 输出(作为结果),in:输入(作为参数) 所以如果有一个泛型参数标记为out,则代表它是用来输出的,只能作为结果返回,而如果有一个泛型参数标记为in,则代表它是用来输入的,也就是它只能作为参 ...
- 数据结构-String、char
String 常用方法: 获取长度:int length = strl.length() 获取第i个字符:char iChar = str.charAt(i) String转成字符数组:char[] ...
- c#第5章 变量的更多内容 隐式和显式转换、枚举、结构、数组、
1.目标数据 destination 英[ˌdestɪˈneɪʃn] 美[ˌdɛstəˈneʃən] n. 目的,目标; 目的地,终点; [罕用语] 预定,指定; 2.源数据 source 英[sɔ: ...
- Python twisted article
学习python twisted 的好文章 An Introduction to Asynchronous Programming and Twisted Reference: http://kron ...
- java 类中的属性为什么一般都是私有的
作为一种规范,所有可能被外部访问的可修改变量,都应该有一对对应的getXXX()和setXXX()的存取方法.保证所有对属性值的存取操作,均通过唯一的途径进行. 而我们一般使用private来作这种信 ...
- Codeforces 320A Magic Numbers
因为晚上有一个cf的比赛,而自己从来没有在cf上做过题,就找了道题熟悉一下. 题目大意:给一个数,判断是否能由1,14,144三个数连接得到. 代码如下: #include <stdio.h&g ...
- winform总结5> winform程序开发注意事项
1.全局异常捕获 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); //处理UI线程异常 Ap ...