位置: 编程技术 - 正文
推荐整理分享Bullet(Cocos2dx)之创建地形,希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!
Bullet提供了几个类btBvhTriangleMeshShape,btHeightfieldTerrainShape去创建一些网图形,首先了解btHeightfieldTerrainShape,通过高度图数据创建一个3D地形。
A static mesh that is optimised for and described by the surface of a height map.
官网解释: info(, , _heightMapData.getBytes(), PHY_UCHAR, 1.6f / uData, -1.f, 1.f, btVector3(.f / uData, 1.f, .f / uData));
(uData为_heightMapData的最大)
自定义数据生成高度地形图(PHY_FLOAT)
参数设置HeightfieldInfo info(, , mapData, PHY_FLOAT, 1.f, -1.f, 1.f, btVector3(1.f, 1.f, 1.f));
mapData自定义数据,随机0~1的数据
自定义数据生成高度地形图(PHY_FLOAT)
参数设置HeightfieldInfo info(, , mapData, PHY_SHORT, 1.f, -1.f, 1.f, btVector3(1.f, 1.f, 1.f));
mapData自定义数据0,1的数据
Bullet 自带的Demo中的例子
btHeightfieldTerrainShape 有两个构造函数,这里分析较复杂的一个
btHeightfieldTerrainShape(
int heightStickWidth, x轴总宽度
int heightStickLength, z轴总长度
比如 width = , length = 则x轴方向为,z轴方向为
const void* heightfieldData, 高度数据
btScalar heightScale, 每个字节*heightScale = 实际高度
btScalar minHeight, 最小高度
btScalar maxHeight, 最大高度
地形原点 = (minHeight maxHeight) * 0.5
int upAxis, 方向轴 取 0=x, 1=y, 2=z,决定地形的朝向,类法向量
PHY_ScalarType heightDataType, 数据式 3种, PHY_UCHAR, PHY_SHORT, PHY_FLOAT
bool flipQuadEdges 方形裁剪
);
举个例子
* 数据
for (int i=0; i<; i)
{
for (int j=0; j<; j)
{
heightMap[i*j] = j % 2;
}
}
对于heightMap[i*j]
1.如果为0, minHeight = 0.f, maxHeight = 6.f;
最低点正好为-3.f
2.如果为0, minHeight = 0.f, maxHeight = .f;
最低点正好为-6.f
3.如果为0, minHeight = 0.f, maxHeight = 3.f;
最低点正好为-1.5f
1.如果为2, minHeight = 0.f, maxHeight = 6.f;
最低点正好为-4.f
2.如果为2, minHeight = 0.f, maxHeight = .f;
最低点正好为-7.f
3.如果为2, minHeight = 0.f, maxHeight = 3.f;
最低点正好为-2.5f
地形偏移offsetY = -(minHeight maxHeight);
不推荐minHeight maxHeight < 0, 不稳定
heightScale * value(heightfieldData[i])为实际高度
高度计算:
对于PHY_UCHAR
最低点y = offsetY min(heightfieldData); minY = 0
最高点y = offsetY max(heightfieldData) * heightScale;
对于PHY_SHORT, PHY_FLOAT
最高点y = offsetY max(heightfieldData) * heightScale;
最低点y = offsetY min(heightfieldData) * heightScale;
注意:
网间隔不要过大,过大会出现物体穿过。
自定义数据类型简化参数传递
PhysicsWorld3D 创建高度地形图
下面来介绍btBvhTriangleMeshShape,通过载入三角网,实现网形状的物理模拟
看看效果
地形能够与模型完美的融合在一起,而且即使半径为0.1的球体也不会穿过地形
使用的shape就是btBvhTriangleMeshShape, 构造方法有两个btBvhTriangleMeshShape(
btStridingMeshInterface* meshInterface, // 网接口,存放网数据
bool useQuantizedAabbCompression,// 压缩?只有buildBvh为true才有效
const btVector3& bvhAabbMin,
const btVector3& bvhAabbMax, // mesh不可超过bvhaabb包围盒,只有buildBvh为true才有效
bool buildBvh = true);// 优化BVH
btBvhTriangleMeshShape(
btStridingMeshInterface* meshInterface,
bool useQuantizedAabbCompression,
bool buildBvh = true);
通过导入一个模型的原始三角形数据,就可以建立上图的地形
如何载入模型数据,官网类关系图
提供btTriangleIndexVertexArray,载入网数据
btTriangleIndexVertexArray(
int numTriangles, // 三角个数
int* triangleIndexBase, // 三角形索引数组首地址
int triangleIndexStride, // 每个三角形索引大小 = 索引类型大小 * 3
int numVertices, // 顶点个数
btScalar* vertexBase, // 顶点数组首地址
int vertexStride); // 每个顶点字节 = 顶点元素 * 3
既然索引类型为int,就用int
关于原始三角形数据如何得到,
1.可以利用cocos2dx的载入模型函数获取(有待实验)
2.利用Blender或者可以导出模型原始三角数据的软件,直接导出数据
关于Blender一款开源的3D建模软件,官网: , 自带游戏引擎,物理引擎就是Bullet
Blender raw 文件
导出三角形数据,Blender有个插件专门导出三角形数据 文件后缀名为raw,它是文本式的,
导出时首先要让模型旋转一定角度,坐标系不是opengl的坐标系,cocos2dx采用的就是opengl的坐标系
raw文件式非常简单:n行,每行9个浮点数据(描述一个三角形),每三个浮点为一个顶点
3.自定义式
。。。。
来实现数据的载入吧
首先读取raw文件,实现一个简单的PhysicsHelper3D
并不是很难吧,载入文件办法不好,不过先将就着用吧
释放申请的内存
在PhysicsWorld3D建立一个添加Mesh的方法
测试
HelloWorld 添加变量
添加网onExit()不要忘了
为了方便测试, 实现了一个漫游摄像机,有空讲解一下。
完整源码及资源
github
Cocos2dx ParticleEditor粒子编辑器 下载地址:程序调用代码:(plist文件要和贴图在同一目录)//创建粒子对象CCParticleSystem*lizi=newCCParticleSystemQuad();//设置plist动画文件lizi-initWithFile(rain1.pli
cocos2dx3.2开发 RPG《Flighting》(三)从Excel表中加载需要的数据 一、前言在一个游戏里面,需要用到的数据一般都是由游戏策划提供的(这里的策划还是由我自己担任啦哈哈)。什么是需要用到的数据?例如我创建
cocos2dx3.2开发 RPG《Flighting》(四)预先加载与选人界面 一、前言假设你已经看懂了前面三节,那么接下来我们就开始进入真正的开发啦~~二、正文1、预先加载首先我们先谈谈预先加载,什么叫预先加载,就
上一篇:Cocos2dx CCLabelAtlas字体与CCLabelTTF字体的使用方法
友情链接: 武汉网站建设