Bullet(Cocos2dx)之凸多面体形状和组合形状

接高度地形图和三角形网格,同样是复杂图形的创建。

先来看看效果

左边通过提供的顶点生成的多面体,右边创建一个由球体与长方体组成的组合形状

首先来了解凸多面体

根据提供的顶点创建一个凸多面体形状,无论给定的顶点顺序是怎样的,都是创建一个由这些顶点组成的凸多面体。

先来看看btConvexHullShape的解释及构造函数

///this constructor optionally takes in a pointer to points. Each point is assumed to be 3 consecutive btScalar (x,y,z), the striding defines the number of bytes between each point, in memory.
///It is easier to not pass any points in the constructor, and just add one point at a time, using addPoint.
///btConvexHullShape make an internal copy of the points.
btConvexHullShape(const btScalar* points=0,int numPoints=0, int stride=sizeof(btVector3));

第一个参数就是顶点数据,第二个是顶点个数,第三个是每个顶点占得字节。

同时提出不需要一次将所有的顶点全部给出,以后可以添加:

void addPoint(const btVector3& point, bool recalculateLocalAabb = true);

增加的顶点信息,是否重新计算AABB包围盒

对于提供顶点数据,用户不需要一直保存,看源码可知btConvexHullShape会用btAlignedObjectArray<btVector3>m_unscaledPoints;

来保存这些顶点数据。

来个示例

看上图,为什么会出现一个是三棱锥,而一个却不是呢?,其实两个形状是一样的,请看我慢慢道来。

前面的解释btConvexHullShape会根据提供的数据建立多面体,我们要牢记在心。

通过查看继承关系图,我们知道btConvexHullShape继承自btPolyhedralConvexShape,

而btPolyhedralConvexShape,提供了

///optional method mainly used to generate multiple contact points by clipping polyhedral features (faces/edges)
///experimental/work-in-progress
virtual bool	initializePolyhedralFeatures(int shiftVerticesByMargin=0);

可以这样理解,将提供的点格式化成多面体,也就是说提供顶点后就可以调用initializePolyhedralFeatures

格式化成多面体。

上图下方是按我们提供的顶点的顺序生成的结果,上方为格式化后的结果

下面来看看笔者是如何加入到PhysicsWorld3D

btRigidBody* PhysicsWorld3D::addConvexHull(const float* floatData, int numPoints, const btVector3& position, bool bPoly, const PhysicsMaterial3D& material)
{
	btConvexHullShape* colShape = new btConvexHullShape(floatData, numPoints, sizeof(btVector3));
	if (bPoly)
	{
		colShape->initializePolyhedralFeatures();
	}

	auto body = getBody(colShape, position, material);
	_world->addRigidBody(body);

	return body;
}

btRigidBody* PhysicsWorld3D::addConvexHull(std::vector<btVector3>& points, const btVector3& position, bool bPoly, const PhysicsMaterial3D& material)
{
	auto body = addConvexHull(points[0].m_floats, points.size(), position, bPoly, material);

	return body;
}

提供两个重载函数,一个是直接将包含顶点数据的浮点数据指针作为参数, 另一个是将顶点数组作为参数。

提供第二个重载的目的就是为了从直接将raw文件的数据传入来生成多面体,还记得raw文件吧?Bullet(Cocos2dx)之创建地形

看个例子

std::vector<float> points;
PhysicsHelper3D::loadRaw("monkey.raw", points);	// blender 猴头

_convexBody = _world->addConvexHull(&points[0], points.size() / 3, btVector3(-2, 0, 5), false, PhysicsMaterial3D(5.f, 0.5f, 0.5f, 0.f));
_convexBody = _world->addConvexHull(&points[0], points.size() / 3, btVector3(2, 0, 5), true, PhysicsMaterial3D(5.f, 0.5f, 0.5f, 0.f));

右不格式化,左为格式化

再来了解一下组合形状

简言之,将多个形状组合成一个图形,最上面的图片右方就是一个组合形状

可由多个不同的Primitive Shape组成

构造函数很简单

btCompoundShape(bool enableDynamicAabbTree = true);

默认开启动态树,优化

关键是增加碰撞形状

void	addChildShape(const btTransform& localTransform,btCollisionShape* shape);

localTransform形状相对偏移,shape碰撞形状。

相对偏移:加入最终btCompoundShape在(0,0,0),相对偏移就是相对于(0,0,0)

得出要想获得组合形状就要自己创建btCollisionShape,然后添加到btCompoundShape

笔者做了简单的封装

struct PhysicsShapeInfo3D
{
	btCollisionShape* colShape;
	btTransform transform;

	PhysicsShapeInfo3D() {};

	PhysicsShapeInfo3D(btCollisionShape* shape, btTransform& trans)
		: colShape(shape), transform(trans)
	{}
};

提供简单的结构体来传递Collision Shapes属性

btRigidBody* PhysicsWorld3D::addCompound(std::vector<PhysicsShapeInfo3D>& shapeList, const btVector3& position, const PhysicsMaterial3D& material)
{
	btCompoundShape* shape = new btCompoundShape;

	for (auto& shapeInfo : shapeList)
	{
		shape->addChildShape(shapeInfo.transform, shapeInfo.colShape);
	}

	auto body = getBody(shape, position, material);
	_world->addRigidBody(body);
	return body;
}

std::vector<PhysicsShapeInfo3D>& shapeList 形状属性列表,来获取组合形状的刚体

来个例子

// 1

shape = new btBoxShape(btVector3(1.f, 1.f, 1.f));

shapeInfo.colShape = shape;

trans.setOrigin(btVector3(0, 1, 0));

shapeInfo.transform = trans;

_shapes.push_back(shapeInfo);

// 2

shape = new btSphereShape(1.f);

shapeInfo.colShape = shape;

trans.setOrigin(btVector3(0, 3, 0));

shapeInfo.transform = trans;

_shapes.push_back(shapeInfo);

_world->addCompound(_shapes, btVector3(0, 0, 5.f));

上例创建一个上为球体,下为长方体的组合形状

当然也可以通过球体和圆柱创建保龄球,也就可以写出一个保龄球的小游戏。

源代码

时间: 2024-10-07 06:30:19

Bullet(Cocos2dx)之凸多面体形状和组合形状的相关文章

Cocos2d-x手机游戏开发中-组合动作

动作往往不是单一,而是复杂的组合.我们可以按照一定的次序将上述基本动作组合起来,形成连贯的一套组合动作.组合动作包括以下几类:顺序.并列.有限次数重复.无限次数重复.反动作和动画.动画我们会在下一节介绍,本节我们重点顺序.并列.有限次数重复.无限次数重复和反动 下面我们通过一个实例介绍一下组合动作的使用,这个实例如下图所示,下图是一个操作菜单场景,选择菜单可以进入到下图动作场景,在下图动作场景中点击Go按钮可以执行我们选择的动作效果,点击Back按钮可以返回到菜单场景. 下面我们再看看具体的程序

illustrator 2018 cc - 组合形状

这里就介绍一下图形组合  1. 组合两个图形 相加两个图形就是把两个图形连接在一齐,这里注意的是,那个图形在上层,就取上层图形的颜色作为合并后的图形颜色 2.图像相减 相减图形就是把两个图形相减,相减法则是,下面减上面,意思就是两个图形,那个图形在最上层,将会被减去 3. 交集 4. 差集 5.形状生成器工具 这个工具能快速地对象进行相加和相减 多选图形,然后显示为加号代表图形相加,按住option/alt键变成减号,代表图像相减 6. 扩展 这是一个比较重要的工具,在很多情况下我们都需要用到扩

Bullet(Cocos2dx)之创建地形

Bullet提供了几个类btBvhTriangleMeshShape,btHeightfieldTerrainShape去创建一些网格图形,首先了解btHeightfieldTerrainShape,通过高度图数据创建一个3D地形. A static mesh that is optimised for and described by the surface of a height map. 官网解释:http://bulletphysics.com/Bullet/BulletFull/cla

Bullet(Cocos2dx)之分析刚体创建与销毁(Primitives)

相关链接:http://bulletphysics.org/mediawiki-1.5.8/index.php/Collision_Shapes Bullet基本图形简介 Bullet提供的基本图形包括球体.长方体.圆柱体.胶囊体.圆锥体.多球体 当然还有一个Plane,一个无限的平面 1.球体是个很简单的形状: btSphereShape (btScalar radius) 提供一个球体的半径 2.长方体(盒子) btBoxShape (const btVector3 &boxHalfExte

Bullet(cocos2dx)学习制作桌球游戏之前期准备

使用cocos2dx结合bullet设计一款简陋的桌球游戏,就是为了回顾前期学过的bullet. 首先要把桌球游戏需要的基本资源准备好,15个球,1个白球,1张台球桌,球杆可有可无. 先看看目前实现的效果 至于这张台球桌的模型,我是随便设计一下 当然这个模型只是为了加载raw文件(静态网格数据),为了使模型的贴图显示出来, 我使用Blender直接创建了一个Plane,然后将台球桌的贴图贴在Plane上,于是就能以假乱真的 实现一个台球桌 在游戏开始前,初始化物理环境,加载一张台球桌,设置相应的

Bullet(Cocos2dx)之内存泄露检测

编写的程序难免会有内存泄露,为了检测内存泄露,可以采取各种各样的措施, 今天向大家介绍一款windows下的内存检测工具Visual Leak Detector for Visual C++ 去官网下载最新版本安装. 用VS建立一个C++控制台项目, 1.将vld安装目录下的include的头文件copy到c++目录下 2.把lib/win32(如果vs版本为64的,则选择win64)copy到c++目录, //3.把bin/win32copy到c++的Debug目录(先Debug运行c++)下

C# 绘制Word图形、组合图形

一.序言 在Office Word中,支持在Word文档中插入类型非常丰富的形状,包括线条.矩形.基本形状(诸如圆形.多边形.星形.括号.笑脸等等图形).箭头形状.公式形状.流程图.旗帜图形.标注图形等等,我们在编程过程中,想要在Word中绘制不同类型的图形,可以通过类库来操作.控件Spire.Doc for .NET 6.0及以上版本开始支持Office Word中的所有图形,可以通过代码操作某个单一的形状,也可以通过将单一形状进行组合来获得想要的图形或形状效果,当然,也支持自己自定义图形,通

微软Hololens学院教程-Hologram 212-Voice(语音)

语音输入是我们操作全息对象的另一种交互方式,语音指令在实际操作过程中是非常自然和容易的,设计语音指令需要考虑以下几点: 自然的 容易记住的 上下文一致 与同一上下文中的其他选项有足够的区别 在Holograms 101的教程里,已经使用关键字识别构建了两个简单的语音指令,这节教程将更深入的学习语音输入相关的知识: 设计为HoloLens语音引擎优化的语音指令. 使用户知道什么语音指令可用. 确认Hololens已经听到了用户的语音指令. 使用听写识别器(Dictation Recognizer)

数据可视化-OmniGraffle软件

OmniGraffle Pro for mac破解版是一款运行在MAC OS平台上的思维导图流程图制作软件,通过思维导图软件(OmniGraffle Pro MAC)帮你组织头脑中思考的信息,组织头脑风暴的结果,绘制心智图,作为样式管理器,或设计网页或PDF文档的原型,OmniGraffle Pro MAC是非常强大的图表,流程图,组织结构图以及插图绘制软件,未来小编为大家提供最新中文破解版下载. 思维导图软件(OmniGraffle Pro MAC)破解方法: 1.软件下载完成后,打开软件包如