【J2ME3D系列学习文章之二】(立即模式)构造我们3D世界中的第一个立方体!

简介:
本站文章均为  李华明Himi  原创,转载务必在明显处注明: 

转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/j2me-kjava/255.html


为什么要先构造一个立方体的例子,其实在论证概念时,立方体是一种极好的示例,当然它并不是复杂的 3D 设计的里程碑。

首先介绍构造一个3D立方体

需要的步骤:

第一:构造一个立方体的空间顶点

第二:构造一个立方体的各个面这里会用到三角形带 ,详细三角形带的解释看 @备注1

第三:构造一个摄像机

第四:绑定画笔

第五:渲染.

那么下面先上代码,都有注释的,相信都能看懂!一些备注 下文有解释!

模拟器截图:

备注1 : 这里要详细讲解下三角形带,下面引用一张图a,大家根据图示来看这个顶点数组就应该明白了!

VERTEX_POSITIONS = { -1, -1, 1, 1, -1, 1, -1,1, 1, 1, 1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, 1, 1, -1 };

我们以立方体的中心为{0, 0,0},那么如果顶点 0坐标就是(-1, -1, 1)  那么顶点 2 是不是 {-1,1,1}了,肯定是!

这里坐标的三个点其实就是代表就是X轴 Y轴 Z轴

也就是说两个顶点0和顶点2这两个顶点都有共同的 -1, 1 ,而三角形带形式就是这种重复利用重复点的形式来标识了所有的立方体的顶点!

 

备注2:这里咱们定义了一个偏差数组 float pc[] = { 0, 0, 1 };  为什么要以数组形式呢?其实你换种形式看看,其实是一个坐标点,

毕竟这是3D世界了 娃哈哈,其实意思就是 X轴+=0,Y轴+=0,Z轴+=1,当我们把这个偏差点传入setPositions()这个方法里以后,

也就是代表将这个立方体中心点从{0,0,0}变成了{0,0,1}这一点,如果你运行此项目当按下左右按键对其立方体进行旋转的时候,

发现立方体旋转不是围绕中心点进行的旋转了,而是以{0,0,1}这一点做的旋转;所以setPositions()其实也是对中心点的一个偏差处理。

 

有些同学该说为什么中心点就是{0,0,0}这一点呢,其实没人规定而是咱们一开始定义立方体数组顶点的时候就自己在心里定下了一个规定,

以{0,0,0}为中心点了。如果你一开始定义VERTEX_POSITIONS 的时候不以{0,0,0}为中心点,而是以顶点0 坐标为中心点的话,

那么顶点2这时候的顶点坐标就成了{0,2,0} ,顶点3就成了{0,2,2}那么也能写成一个三角形带形式,但是要注意你后面的颜色数组和

定义三角形带数组的时候也要以为顶点0为中心点来写噢,这点别忘了,要一一对应!

 

备注3:camera.setPerspective(30, (float) this.getWidth()/ (float) this.getHeight(), 1, 1000);

第一个参数指的是透视的角度!不是高度!第二个指的是屏幕宽高比例,第三个是可视范围min和max

其实这里常用还有一个方法是:camera.setParallel() 这两个方法以及备注5在后续文章

           《深度缓冲与投影》的时候再向大家讲解。

备注4:Transform transform = new Transform(); 这里咱们定义了一个变换对象,其实咱们一开始定义的成员变量里也有一个

private Transform tf;但是这里要注意,transform 是为了设置摄像机的时候同时设定了相机的位置而定义的,而tf则是对渲染立方体的

候做反转、缩放、平移等操作定义的一个变化对象,等后续文章会对渲染时这个变化对象加以说明。一定要注意这两个Transform 区别!

备注5:备注3已经说明了 ,等后续文章学习《深度缓冲与投影》的时候再向大家讲解。

备注6:这里就是为了强调与备注4的Transform两个对象的区别!

备注7:这里调用 releaseTarget() 意思是终止渲染,大家会发现g3d.releaseTarget();这一句被写在了try catch块里,其实原因是因为

许多 Graphics3D 的方法都会抛出不可控异常,但绝大多数错误都是不可恢复的, 所以不管是否出现异常都要保证能终止渲染!

备注8:这里是对按键的操作,按键处理和对立方体操作(缩放、平移、旋转)会在后续学习文章中详细解释的。

最后给大家放出源码,希望大家一起相互交流。所有文章都是原创,很多地方可能存在错误希望大家多多指点。谢谢!
    “j2me3D-立方体.rar”             下载地址: http://vdisk.weibo.com/s/hq1O_

相关文章
|
存储 缓存 固态存储
Intel PMEM的使用经验和指南
作为一种Persistent Memory设备,同时也是第一款可扩展的商用NVDIMM,英特尔Optane DIMM (dual In-line memory module) 设备的性能介于传统持久性存储介质和内存之间,它的出现将有助于扩展内存容量,或提供低延迟持久性存储设备。本文主要介绍,后者使用方式下的介质的性能特点和使用指南。 本文内容主要来自于“An Empirical Guide to the Behavior and Use of Scalable Persistent Memory (FAST 20)”,加上本人的一些要点提炼和批注。
9163 2
Intel PMEM的使用经验和指南
|
数据采集 机器学习/深度学习 分布式计算
从0到1搭建车企数字化营销中台(4):客户数据平台(CDP)
CDP作为数字化营销中台的核心数据引擎,承载着拉通客户全渠道、全旅程链路的数据,实现智能洞察和营销决策
4092 0
从0到1搭建车企数字化营销中台(4):客户数据平台(CDP)
|
安全 Linux Docker
容器新体验 - Rootless Container + cgroup V2
![image.png](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/145b98103c9bcd945b81c9463fab1867.png) 在2020年12月最新的 Docker 20.10 版本中,其中两个关键的特性发布揭示了容器运行时技术发展一些新方向。 首先是 Cgroup V2 已经被正式支持,虽然这个功能对最终用户很
4950 114
容器新体验 - Rootless Container + cgroup V2
|
存储 监控 固态存储
基于C++开发的医院医学影像PACS 二次开发,三维重建
可与HIS连接,直接从HIS提取病人的基本信息,减轻输入劳动量,同时防止漏费现象;通过WorkList服务传递病人信息给影像采集设备,减轻医生输入劳动量,提高信息录入的准确性; 自动传送病人信息到医生级工作站系统,方便科室检查医生快速填写报告;对已经安排的预约提供改约和取消预约功能;
450 0
|
JavaScript 开发者
node使用 nodemon 来监听文件变化
知识边界: nodemon 就像是vue里面的开启热加载功能一样,开发者只要放心开发,不用修改一点就需要重新启动项目,进行测试
node使用 nodemon 来监听文件变化
|
SQL 关系型数据库 MySQL
NineData:强大的ClickHouse GUI管理工具
NineData除了可以支持以GUI的方式访问和管理ClickHouse之外,NineData还支持MySQL到ClickHouse的数据迁移/同步/复制功能,相比ClickHouse内置的集成引擎,NineData很好的解决了上游MySQL DDL变更时的链路稳定性以及复制时对象映射等问题,可以帮助用户高性能、高效率、高稳定性的完成从MySQL到ClickHouse的数据复制。
1658 0
NineData:强大的ClickHouse GUI管理工具
|
人工智能 算法 Java
2023年第十四届蓝桥杯JavaB组省赛真题(题目+全部完整题解)1
2023年第十四届蓝桥杯JavaB组省赛真题(题目+全部完整题解)
1593 0
|
移动开发 运维 前端开发
|
新零售 供应链 数据管理
解决方案应用实例 |“业务+数据”双中台驱动,源氏木语构建数字化平台
源氏木语携手阿里云,基于业务中台和数据中台双轮驱动,进行新一代数字化系统重建,深化销售数字化能力,打通全链路供应链闭环,实现围绕业务的全面数字化支撑。
1096 0
解决方案应用实例 |“业务+数据”双中台驱动,源氏木语构建数字化平台
|
新零售 前端开发 BI
盒马中后台跨端方案探索
中后台跨端方案的探索。
盒马中后台跨端方案探索