位置: 编程技术 - 正文

Bullet(Cocos2dx)之创建地形

编辑:rootadmin

推荐整理分享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

Bullet(Cocos2dx)之创建地形

最高点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、预先加载首先我们先谈谈预先加载,什么叫预先加载,就

标签: Bullet(Cocos2dx)之创建地形

本文链接地址:https://www.jiuchutong.com/biancheng/372652.html 转载请保留说明!

上一篇:Cocos2dx CCLabelAtlas字体与CCLabelTTF字体的使用方法

下一篇:Cocos2dx ParticleEditor粒子编辑器

  • 借款利息收入是企业收入吗
  • 季度申报,其他收益科目是怎样的科目
  • 劳务公司在异地做项目需要提供当地完税证明
  • 代理费住宿费都包括什么
  • 出口合同包括哪些条款
  • 增值税普通发票需要交税吗
  • 出售专利权收入属于什么收入
  • 以前年度损益调整结转到哪里
  • 餐补和车补可以税前扣除吗?
  • 商业企业的购货运费计入什么
  • 地产公司土地分摊方案
  • 低价股权转让是利空还是利好
  • 月初缴纳的保险是当月的吗
  • 长期股权投资的明细科目有哪些
  • 双倍余额递减法考虑净残值吗
  • 已注销企业可以恢复吗
  • 餐饮管理公司设哪些科目
  • 收到实收资本要验资吗
  • 预收房租款如何入账
  • 房产企业可计入开发成本的利息如何确定?
  • 上月抵扣的进项税这个月怎么做分录
  • win11系统进程
  • mac系统怎么设置字体大小
  • 外贸企业国内运费可以抵扣吗
  • 滴滴公司的员工打车要钱吗
  • php红包源码
  • win7系统网络连接出现红叉
  • 其它业务收入是什么科目
  • owmngr.exe - owmngr是什么进程 作用是什么
  • 又十个超级有用的PHP代码片段
  • 销货方开具红票,购货方怎么入账
  • 会计分录由什么要素组成
  • 鹤望兰的养殖方法和注意事项浇水
  • latex希腊字母斜体
  • 四川成都熊猫基地介绍
  • uniapp 打开小程序
  • vue导出word文档打开报错,内容有问题
  • react中路由有哪些常用组件
  • php函数传值的引用是什么
  • cpu占满gpu不工作
  • 程序员后续发展
  • php websocket教程
  • 企业所得税应纳税所得额300万以下
  • mysql如何上锁
  • 客户的赔偿金会计分录
  • 投资款超过实收资本会计处理
  • mongodb数据类型有哪些
  • 收到法院款项如何做账
  • 混合销售如何做会计分录
  • 简易征收销售额是什么意思
  • 作废的发票会统计到税额里吗
  • 删除mysql57服务
  • 低值易耗品费用计入产品成本的方式有哪几种
  • 完税证明和纳税证明一样吗
  • 差旅费住宿专票可以抵扣增值税吗
  • 其他权益工具投资公允价值变动计入什么科目
  • 生产车间的会计科目
  • 合理损耗怎么算
  • 小规模纳税人开具的农产品普通发票
  • 饭店现金账怎么记账
  • 增值税纳税申报表在哪里打印
  • 一般纳税人加工费怎么做账
  • 私营公司固定资产怎么查
  • mac可以远程连接windows吗
  • linux中的awk命令详解
  • linux 常见
  • [置顶]马粥街残酷史
  • python选择器
  • 怎么申请返回
  • shell 算数计算
  • shell脚本中执行命令语句
  • unity assembly
  • android:Background线程池和UiThread线程池
  • 安卓开源组件
  • easyui加载数据慢
  • 广东省电子税务局app
  • 深圳龙华区税务局大浪税务所电话
  • 重庆地方税务局2016年2号
  • 上海买新房办贷款流程
  • 请问在哪里可以看到
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设