热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于J2ME3D图形技术的实例详解

3D图形技术在各个领域已经越来越多的被应用了,当然这也包括了J2ME领域。在J2ME中为我们提供了JSR184这样一个可选包,该套API实现手机上3D图形的编程。同时也伴随着移动设备硬件的发展,现在也出现了越来越的支持该可选包的手机了,例如SonyEriCSSon的K系列、S系列等等。
3D图形技术在各个领域已经越来越多的被应用了,当然这也包括了J2ME领域。在J2ME中为我们提供了JSR184这样一个可选包,该套API实现手机上3D图形的编程。同时也伴随着移动设备硬件的发展,现在也出现了越来越的支持该可选包的手机了,例如Sony EriCSSon的 K系列、S系列等等。
  
  正巧前一段时间我简单的学习了一下3D图形学,所以最近开始对Mobile 3D的学习,在这里把学习到的东西拿出来与大家共享,希望能对大家有所帮助,也同时希望大家能够一起来学习JSR184。
  
  下面言规正传,首先我们来想象一下在现实生活中,我们是如何观察这个世界的。我们是通过眼睛来观察,我们生活在一个3维坐标系构成的世界。在Mobile3D中同样的有World类让你随心所欲的构造你想要的世界,当然在这里专业些,在3D制图中我们叫它“场景”;另外还有Camera类来作为你的眼睛,你可以来设置它的位置角度等参数,来显示出不同的图像。
  
  在Mobile 3D中是如何实现3D图像的显示呢?首先你要建立或者载入3D模型,然后根据需要设置场景中的环境、渲染方式等一系列的参数,再后生成并设置一架摄影机并且调整好你想要的光线,调整好你所需要的位置和角度。OK还需要什么呢?按下快门,这一步就是被叫做“渲染”一切就搞定了,这听起来似乎很简单其实也并不难,其实这也不难。
  
  下面我们分步骤的来讲解这些步骤:
  
  首先说模型的建立,在Mobile 3D中和大多数的3D编程API是一样的有两种方式:1 及时运算生成;2 外部建模导入。由于外部建模导入会将环境信息同时导入,所以稍候给大家做具体的介绍,这里着重要给大家介绍“及时运算生成”的部分,这样一来有助于大家了解Mobile 3D的工作原理。在Mobile 3D中为我们提供了VertexArray和VertexBuffer俩个类,这两个类用来保存3维模型的顶点信息。
  
  其中VertexArray 类用处比较多,也比较灵活,这个类最常用的用法有3个,1 保存顶点坐标信息; 2 保存法线信息;3保存帖图信息。有人也许要问这一个类怎么治理3种不同的东西呢?那下面我们来分析一下该类,首先该类的构造器有3个参数:1 该实例要包括的元素的数量; 2 每个元素要包括的元素数量; 3每个子元素所占的字节数。这样一来似乎清楚很多为什么这个类能被使用到3种东西上。
  
  另外该类还有一个比较常用的方法set(int index,int length,short[] array0)这个方法是用来向该类的实例对象种存放数据的,第一个参数是指从第几个元素开始;第二个参数是指要设置多少个;第三个参数就是实际设置的置了。
  
  下面简单介绍VertexBuffer类,该类才是真正保存多边形的框架信息的类。改类通过设置顶点位置、发现、帖图信息,来建立图形。其中
  
  setPositions(VertexBuffer v,float s,float[]b)
  
  是用来设置顶点位置的,在这个方法中你会发现有3个参数,第一个不用说了,是顶点的坐标信息,后两个是用来做坐标偏移等操作的,操作是这样的数学公式:
  
  v'=v*s+b
  
  还有一个
  
  setNormals(vertexBuffer norm)
  
  方法来设置法线。还有一个非常重要的方法
  
  setTexCoords(int, VertexArray, float, float[])
  
  这个方法中参数除第一个以外,后三个和
  
  setPositions(VertexBuffer v,float s,float[]b)
  
  是一样的,第一个参数是开始的元素编号。这样说是不是有些抽象呢?给大家一个例子吧,好让大家理解。
  

short x = 20;
  
  short y = 20;
  
  short z = 20;
  
  short fx = (short) -x;
  
  short fy = (short) -y;
  
  short fz = (short) -z;
  
  //定点坐标
  short[] vert = {x,y,z, fx,y,z, x,fy,z, fx,fy,z, //D
  
  fx,y,fz, x,y,fz, fx,fy,fz, x,fy,fz, //C
  
  fx,y,z, fx,y,fz, fx,fy,z, fx,fy,fz, //B
  
  x,y,fz, x,y,z, x,fy,fz, x,fy,z, //F
  
  x,y,fz, fx,y,fz, x,y,z, fx,y,z, //A
  
  x,fy,z, fx,fy,z, x,fy,fz, fx,fy,fz}; //E
  
  try{vertArray=
new
 VertexArray(vert.length/3,3,2);
  vertArray.set(0,vert.length/3,vert);
  }catch(
Exception
 e){System.out.
PRint
ln("vert");}
  
  //发线
  byte[] norm = { 0,0,127, 0,0,127, 0,0,127, 0,0,127,
  
  0,0,-127, 0,0,-127, 0,0,-127, 0,0,-127,
  
  -127,0,0, -127,0,0, -127,0,0, -127,0,0,
  
  127,0,0, 127,0,0, 127,0,0, 127,0,0,
  
  0,127,0, 0,127,0, 0,127,0, 0,127,0,
  
  0,-127,0, 0,-127,0, 0,-127,0, 0,-127,0};
  
  try{normArray=new VertexArray(norm.length/3,3,1);
  normArray.set(0,norm.length/3,norm);
  }catch(Exception e){System.out.println("norm");e.printStackTrace();}
  
  //给出顶点们对应
图片
上的点(vert和tex
数组
是一一对应的)
  short[] tex = { 1, 0, 0, 0, 1, 1, 0, 1,
  
  1, 0, 0, 0, 1, 1, 0, 1,
  
  1, 0, 0, 0, 1, 1, 0, 1,
  
  1, 0, 0, 0, 1, 1, 0, 1,
  
  1, 0, 0, 0, 1, 1, 0, 1,
  
  1, 0, 0, 0, 1, 1, 0, 1 };
  
  try{
  texArray=new VertexArray(tex.length/2,2,2);
  texArray.set(0,tex.length/2,tex);
  }catch(Exception e){System.out.println("tex");}
  
  //建立正方体
  vb=new VertexBuffer();
  vb.setPositions(vertArray,1.0f,
null
);
  vb.setNormals(normArray);
  vb.setTexCoords(0,texArray,1.0f,null);

  在上述代码中我建立一个正方体所需要全部顶点和面的信息,但大家要注重这里并没有生成对应的模型。原因就是我们还没有设置生成模型所以的其他信息,下面我们来看看TriangleStripArray类,该类是构成面所需要的三角面的信息类,熟悉3D制图的人都清楚构造3D图形是通过多个面构造一个3D实体的,而三角面是比较常用的一个方法。具体内容我这里不具体说明了。
  
  下面我们还需要设置一些环境和材质信息,这里要用到的类比较多Appearance、Texture2D、Material。先来看个例子:

  appearnce=new Appearance();
//创建帖图
  Texture2D texture=new Texture2D(image2d);
  texture.setBl
end
Color(Texture2D.FUNC_DECAL);
  texture.setWrapping(Texture2D.WRAP_REPEAT,Texture2D.WRAP_REPEAT);
  texture.setFiltering(Texture2D.FILTER_NEAREST,Texture2D.FILTER_NEAREST);
  
  material=new Material();
  material.setColor(Material.D
IF
FUSE, 0xFFFFFFFF);
  material.setColor(Material.SPECULAR, 0xFFFFFFFF);
  material.setShininess(100.0f);
  
  appearnce.setTexture(0,texture);
  appearnce.setMaterial(material);
  
  mesh=new Mesh(vb,tsa,appearnce);
  mesh.setAppearance(0,appearnce);

  我个人感觉Appearance类有些类似VertexBuffer类,同样是多种属性的持有者;在这里要强调一点,就是Appearance类的设置远远不止上述给出的东西,还有很多的设置(例如FOG也就是雾的设置)。Texture2D是帖图类,用它来设置帖图的信息,例如帖图的方式是平铺等方式。Material物名斯意就是指材质,这里你可是设置“反光度”、“颜色”等等信息。另外这里我还要介绍一种设置渲染参数的方法

//设置poly模式设置
  PolygonMode polygOnMode=new PolygonMode();
  polygonMode.setShading(PolygonMode.SHADE_SMOOTH);
  polygonMode.setCulling(PolygonMode.CULL_NONE);
  
  //生成外貌
  appearnce=new Appearance();
  appearnce.setPolygonMode(polygonMode);

  看刚刚给出的代码,似乎比上面的更简单是吧?其实在PolygonMode中已经替我们做了很多工作。该的设置很类似3D MAX中的Poly的使用。
  
  刚才的代码中还给出了一个Mesh类,该类材质最后我们要的模型。建立模型后,我们要建立Camera。在Camera中我在这里只简单介绍两个方法setParallel(float, float, float, float)和setPerspective(float, float, float, float)。我们首先来看setParallel(float, float, float, float)该方法是设置Camera的视图方法为平视图;第一个参数是设置视角的高度,注重是高度,不是角度,因为这里是平视图;第二个参数是Camera的宽高比例,例如我们的电视是4:3、宽银幕电影是16:9;第三、四参数分别是最近和最远渲染的范围。同样的setPerspective是设置Camera为透视图,这种视图比较接近我们日常生活中的观察的角度,而该方法的后三个参数和setParallel的后三个参数是一样的,而第一个参数是可是角度,这里你可不要忽视这个角度问题,这个角度是在透视图中计算投影的一个重要参数。
  
  似乎一切都设置好了,其实不然,到目前为止我们仅仅是把我们所需要的素材都预备好了。下面我们来看看Mobile 3D的治理机制,熟悉3D制图的人都清楚大部分3D软件,3D API都是通过树状结构来治理素材的,这样的好处是每个模型、模型组、摄像机等元素作为节点都可以设置自己的旋转轴等等属性,并可以按照自己所设定好的动画信息进行运动。在Mobile 3D中为我们规定了该树状结构的根节点必须是World类的实例对象,其中摄影机和光线比较非凡,可以不被放置在这个树中,而是通过Graphics3D类的对象来设置


推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了一个从入门到高手的VB.NET源代码,通过学习这些源代码,可以在21天内成为VB.NET高手。文章提供了下载地址,并提醒读者加入作者的QQ群和收藏作者的博客。 ... [详细]
  • Linux环境变量$PATH的作用及使用方法
    本文介绍了Linux环境变量$PATH的作用及使用方法。$PATH是一个由多个目录组成的变量,用冒号分隔。当执行一个指令时,系统会按照$PATH定义的目录顺序搜索同名的可执行文件,如果有多个同名指令,则先找到的会被执行。通过设置$PATH变量,可以在任何地方执行指令,无需输入绝对路径。 ... [详细]
  • 本文介绍了某点评网的搜索策略,包括名称和地址的匹配策略,模糊匹配的方法以及不同口音和拼音的近似发音。同时提供了一些例子来说明这些策略的应用。 ... [详细]
  • loader资源模块加载器webpack资源模块加载webpack内部(内部loader)默认只会处理javascript文件,也就是说它会把打包过程中所有遇到的 ... [详细]
  • asp中如何嵌入python的简单介绍
    本文目录一览:1、如何在IIS中执行Python脚本 ... [详细]
  • Opencv提供了几种分类器,例程里通过字符识别来进行说明的1、支持向量机(SVM):给定训练样本,支持向量机建立一个超平面作为决策平面,使得正例和反例之间的隔离边缘被最大化。函数原型:训练原型cv ... [详细]
  • vb6集成ad登录共享文件_SCSP实验2单点登录
    01—实验目的掌握单点登陆相关原理和深信服配置02—实验环境1.AC版本v12.0.42AC1地址:https:172.172.1.1AC2地址:htt ... [详细]
  • vb.net面试题,请大家帮忙,谢谢。如果需要讲详细一点,那就加我QQ531412815第4题,潜在的错误,这里的错误不是常规错误,属于那种只有在运行是才知道的错误:Catchex ... [详细]
  • asp.net(vb脚本)如何获取xml的节点值?xmlversion1.0encodingutf-8?rootimageimagemenusmenuurl#frame_paren ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 【Python 爬虫】破解按照顺序点击验证码(非自动化浏览器)
    #请求到验证码base64编码json_img_datajson_raw.get(Vimage)#获取到验证码编码 #保存验证码图片到本地defbase64_to_img(bstr ... [详细]
author-avatar
shao4224
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有