- 浏览: 335993 次
- 性别:
- 来自: 温州
文章分类
最新评论
-
helloworldlove:
Axis_UNZIP_PATH\Axis-version\we ...
3步把您的java程序转换为webservice -
hcqenjoy:
这个工具能再提供下吗 已经没办法下载了 谢谢
汉化 Flex Builder 3 帮助文档 -
NASa_CJ:
String source = HttpClientExamp ...
利用HttpClient获取网页内容 -
zlsj80:
下载地址无效了,楼主修正一下吧
汉化 Flex Builder 3 帮助文档 -
fykyx521:
下载地址都不能用了,是不过时了
汉化 Flex Builder 3 帮助文档
简述
现在,移动游戏和移动应用开发极为热门!游戏中需要有时髦漂亮的图形,其设计标准比以前任何时候都要高。本文将告诉你怎样用酷毙的移动3D图形API为J2ME设备开发3D图形游戏。
如果你在用MIDP1.0进行用户接口编程,那么有两条路你可以选择:使用高级的UI类或者一切由你自己从头开始。作为游戏开发者,第一种选择往往是不可能的;这是为什么游戏开发者不得不为他们的高级游戏开发自己的3D引擎的原因。无疑,这需要付出大量的时间和努力,而缺乏浮点数支持的CLDC 1.0(MIDP 1.0正是建于其上)对问题的解决没有多大帮助。
在MIDP 2.0中,有一个可选的叫移动3D图形API的软件包,或者叫JSR 184。该API是第一个基于Java标准开发的移动设备上的三维图形软件包。该API既有高级又有低级图形特征;其中,高级特征称为保留模式,低级特征称为立即模式。保留模式使得开发者有可能使用场景图形并使场景中的物体根据虚拟相机和灯光的位置进行自身的着色。立即模式能够允许应用程序直接进行物体绘制。如果需要,可以在同一个应用程序中使用这两种模式。
本文着重介绍立即模式(在第二篇文章中我们将分析保留模式)。
3D API
让我们以列举和解释该3D API中的类作为开始。除了这些API外,JSR 184还包含了一个场景图形结构和一个相应的文件格式以有效地管理和配置3D内容。该文件格式定义了一种m3g文件,这种文件典型地从3D建模文件应用程序中转换而来。
表1.3D API类
我们将开发一个简单的旋转一个多边形的3D应用程序为例。该多边形是一个立方体,它的纹理是一张旧汽车相片。列表1展示了例程midlet的主要类-应用程序的中心类。该类负责创建应用程序并建立起运行MyCanvas的计时器。
列表1. MIDletMain类
列表2显示了MyCanvas类,该类包含了应用程序的所有图形逻辑。init()方法负责结点的创建,纹理文件的装载并设置纹理,外观和背景也被一起设置。paint()方法负责着色并旋转立方体。图1展示了正在一个模拟器中运行的实际程序。
列表2. MyCanvas类
小结
JSR 184对于可以运行MIDP 2.0的设备来说,是一个节省时间和空间的可选的软件开发包。它允许开发者使用两种图形方式-保留模式和立即模式-来产生3D图形。本文集中讲述了立即模式,并给出一个例子程序来说明怎样使用3D API。
现在,移动游戏和移动应用开发极为热门!游戏中需要有时髦漂亮的图形,其设计标准比以前任何时候都要高。本文将告诉你怎样用酷毙的移动3D图形API为J2ME设备开发3D图形游戏。
如果你在用MIDP1.0进行用户接口编程,那么有两条路你可以选择:使用高级的UI类或者一切由你自己从头开始。作为游戏开发者,第一种选择往往是不可能的;这是为什么游戏开发者不得不为他们的高级游戏开发自己的3D引擎的原因。无疑,这需要付出大量的时间和努力,而缺乏浮点数支持的CLDC 1.0(MIDP 1.0正是建于其上)对问题的解决没有多大帮助。
在MIDP 2.0中,有一个可选的叫移动3D图形API的软件包,或者叫JSR 184。该API是第一个基于Java标准开发的移动设备上的三维图形软件包。该API既有高级又有低级图形特征;其中,高级特征称为保留模式,低级特征称为立即模式。保留模式使得开发者有可能使用场景图形并使场景中的物体根据虚拟相机和灯光的位置进行自身的着色。立即模式能够允许应用程序直接进行物体绘制。如果需要,可以在同一个应用程序中使用这两种模式。
本文着重介绍立即模式(在第二篇文章中我们将分析保留模式)。
3D API
让我们以列举和解释该3D API中的类作为开始。除了这些API外,JSR 184还包含了一个场景图形结构和一个相应的文件格式以有效地管理和配置3D内容。该文件格式定义了一种m3g文件,这种文件典型地从3D建模文件应用程序中转换而来。
表1.3D API类
类 | 描述 |
AnimationController | 控制动画顺序。 |
AnimationTrack | 把一个KeyframeSequence同一个AnimationController相关联。 |
Appearance | 定义一个网眼(Mesh)或一个Spring3D的着色属性的一组对象。 |
Background | 定义视图是怎样被清除的。 |
Camera | 一个场景图顶点,它定义了场景中观察者的位置以及从3D到2D的投影。 |
CompositingMode | 一个Appearance类,它封装了每一个像素的合成属性。 |
Fog | 一个Appearance类,它包含了雾化的有关属性。 |
Graphics3D | 一个单独的3D图形上下文。所有的着色操作都是在该类中的render()方法中实现的。 |
Group | 一个场景图形结点,它存储了一个无序的结点集作为它的子结点。 |
Image2D | 一个二维图像,可用于纹理,背景,或者精灵图像。 |
IndexBuffer | 该类定义了如何把顶点连接起来以形成一个几何体。 |
KeyframeSequence | 封装了一系列的具有时间戳和矢量值的关键帧的动画数据。 |
Light | 描述了不同类型的光源。 |
Loader | 下载和反串行化图形结点及结点成分,以及整个场景图形。 |
Material | 封装了进行光学计算的材质属性。 |
Mesh | 描述了一个3D对象,它是用多边形面定义的。 |
MorphingMesh | 描述了一个顶点-变形的多边形网眼。 |
Node | 所有场景图形结点的抽象基类。其五个具体子类是:Camera,Mesh,Sprite3D,Light和Group。 |
Object3D | 所有可以成为3D世界中组成部分的对象的抽象基类。 |
PolygonMode | 封装了多边形级别属性。 |
RayIntersection | 存储了对于分割的Mesh或Sprite3D的引用,以及有关分割点的信息。 |
SkinnedMesh | 描述了一个框架动画的多边形网眼。 |
Sprite3D | 用3D位置来描述一个2D图像。 |
Texture2D | 封装了一个2D纹理图像和一个属性集合,这些属性指出该图像是如何应用到子网眼上的。 |
Transform | 一个通用的4x4的浮点数矩阵,用来描述一个变换。 |
Transformable | Node和Texture2D类的抽象基类。 |
TriangleStripArray | 定义了一个三角形带数组。 |
VertexArray | 一个整型矢量数组,描述了顶点位置,法线,颜色或者纹理坐标。 |
VertexBuffer | 存储对于VertexArrays的引用,它包含了一个顶点集的位置,颜色,法线,以及纹理坐标。 |
World | 一个特别的Group结点,它作为场景图最顶层的容器。 |
举例
我们将开发一个简单的旋转一个多边形的3D应用程序为例。该多边形是一个立方体,它的纹理是一张旧汽车相片。列表1展示了例程midlet的主要类-应用程序的中心类。该类负责创建应用程序并建立起运行MyCanvas的计时器。
列表1. MIDletMain类
import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.util.*; public class MIDletMain extends MIDlet { static MIDletMain midlet; MyCanvas d = new MyCanvas(); Timer iTimer = new Timer(); public MIDletMain() { this.midlet = this; } public void startApp() { Display.getDisplay(this).setCurrent(d); iTimer.schedule( new MyTimerTask(), 0, 40 ); } public void pauseApp() {} public void destroyApp(boolean unconditional) {} public static void quitApp() { midlet.destroyApp(true); midlet.notifyDestroyed(); midlet = null; } class MyTimerTask extends TimerTask { public void run() { if( d != null ) { d.repaint(); } } } } |
列表2显示了MyCanvas类,该类包含了应用程序的所有图形逻辑。init()方法负责结点的创建,纹理文件的装载并设置纹理,外观和背景也被一起设置。paint()方法负责着色并旋转立方体。图1展示了正在一个模拟器中运行的实际程序。
列表2. MyCanvas类
import javax.microedition.lcdui.*; import javax.microedition.m3g.*; public class MyCanvas extends Canvas { private Graphics3D graphics3d; private Camera camera; private Light light; private float angle = 0.0f; private Transform transform = new Transform(); private Background background = new Background(); private VertexBuffer vbuffer; private IndexBuffer indexbuffer; private Appearance appearance; private Material material = new Material(); private Image image; public MyCanvas() { // 创建Displayable对象以探听命令事件 setCommandListener(new CommandListener() { public void commandAction(Command c, Displayable d) { if (c.getCommandType() == Command.EXIT) { MIDletMain.quitApp();}} }); try { init();} catch(Exception e) { e.printStackTrace();} } /** * 组件的初始化 */ private void init() throws Exception { addCommand(new Command("Exit", Command.EXIT, 1)); graphics3d = Graphics3D.getInstance(); camera = new Camera(); camera.setPerspective( 60.0f,(float)getWidth()/ (float)getHeight(), 1.0f, 1000.0f ); light = new Light(); light.setColor(0xffffff); light.setIntensity(1.25f); short[] vert = { 5, 5, 5, -5, 5, 5, 5,-5, 5, -5,-5, 5, -5, 5,-5, 5, 5,-5, -5,-5,-5, 5,-5,-5, -5, 5, 5, -5, 5,-5, -5,-5, 5, -5,-5,-5, 5, 5,-5, 5, 5, 5, 5,-5,-5, 5,-5, 5, 5, 5,-5, -5, 5,-5, 5, 5, 5, -5, 5, 5, 5,-5, 5, -5,-5, 5, 5,-5,-5, -5,-5,-5 }; VertexArray vertArray = new VertexArray(vert.length / 3, 3, 2); vertArray.set(0, vert.length/3, 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 }; VertexArray normArray = new VertexArray(norm.length / 3, 3, 1); normArray.set(0, norm.length/3, norm); //各个结点的纹理坐标 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 }; VertexArray texArray = new VertexArray(tex.length / 2, 2, 2); texArray.set(0, tex.length/2, tex); int[] stripLen = { 4, 4, 4, 4, 4, 4 }; // 对象的VertexBuffer VertexBuffer vb = vbuffer = new VertexBuffer(); vb.setPositions(vertArray, 1.0f, null); vb.setNormals(normArray); vb.setTexCoords(0, texArray, 1.0f, null); indexbuffer = new TriangleStripArray( 0, stripLen ); //纹理图像 image = Image.createImage( "/pic1.png" ); Image2D image2D = new Image2D( Image2D.RGB, image ); Texture2D texture = new Texture2D( image2D ); texture.setFiltering(Texture2D.FILTER_NEAREST, Texture2D.FILTER_NEAREST); texture.setWrapping(Texture2D.WRAP_CLAMP,Texture2D.WRAP_CLAMP); texture.setBlending(Texture2D.FUNC_MODULATE); // 创建外观(Appearance)对象 appearance = new Appearance(); appearance.setTexture(0, texture); appearance.setMaterial(material); material.setColor(Material.DIFFUSE, 0xFFFFFFFF); material.setColor(Material.SPECULAR, 0xFFFFFFFF); material.setShininess(100.0f); background.setColor(0xffffcc); } protected void paint(Graphics g) { graphics3d.bindTarget(g, true, Graphics3D.DITHER | Graphics3D.TRUE_COLOR); graphics3d.clear(background); //设置照相机 Transform transform = new Transform(); transform.postTranslate(0.0f, 0.0f, 30.0f); graphics3d.setCamera(camera, transform); //设置灯光 graphics3d.resetLights(); graphics3d.addLight(light, transform); //设置旋转 angle += 1.0f; transform.setIdentity(); transform.postRotate(angle, 1.0f, 1.0f, 1.0f); graphics3d.render(vbuffer, indexbuffer, appearance, transform); graphics3d.releaseTarget(); } } |
图1 正在一个模拟器中运行的应用程序 |
小结
JSR 184对于可以运行MIDP 2.0的设备来说,是一个节省时间和空间的可选的软件开发包。它允许开发者使用两种图形方式-保留模式和立即模式-来产生3D图形。本文集中讲述了立即模式,并给出一个例子程序来说明怎样使用3D API。
发表评论
-
Java 5.0 多线程编程实践
2006-01-23 13:20 772<noscript type="text/ja ... -
web开发框架——JSF开发实战
2006-01-23 20:01 1422JSF开发实战的第一篇(jsf开发实战一)演示了如何建立一个最 ... -
Tomcat 的数据库连接池设置与应用
2006-01-23 20:28 7701.将数据库驱动程序的JAR文件放在Tomcat的 commo ... -
Eclipse Plugins Manager Beta 0.1 (Link's Only) 发布
2006-03-18 17:11 791<noscript type="text/ja ... -
常青图书管理系统 BETA V0.1
2006-03-19 15:03 840<noscript type="text/ja ... -
Java程序的性能优化
2006-03-19 15:15 806<noscript type="text/ja ... -
Java中四种XML解析技术之不完全测试
2006-03-20 12:16 697<noscript type="text/ja ... -
解决Tomcat中文乱码问题
2006-03-26 22:58 867一、中文问题的来源 计算机最初的操作系统支持的编码是单 ... -
Swing技巧. 设置全局字体(sun jdk)
2006-04-02 14:04 1343S ... -
Dom4j 使用简介
2006-04-05 20:19 674DOM4J是dom4j.org出品的一个开源XML解析包 ... -
Java手机技术 之 J2ME及其基本慨念
2006-04-06 12:42 726如果您曾经http://www.javasoft.com ;网 ... -
Java手机技术 之 J2ME新手入门要点
2006-04-06 12:50 1002一、J2ME中需要的Java基础知识现在有大部分人,都是从零开 ... -
JAVA设计模式系列之Singleton模式
2006-04-06 13:18 829单态定义: Singleton模式主要作用是保证在Java应 ... -
高手指点你实战体会Java的多线程编程
2006-04-06 13:39 836在 Java 程序中使用多线程要比在 C 或 C++ 中容 ... -
Java基础--JSP应用语法详解大全
2006-04-06 13:49 9021)HTML注释: 可以用注释内容,也可以用表达式. 2) ... -
javamail使用完全手册
2006-04-08 20:44 8781,哪里是开始:初始环境,安装好你的j2sdk和你的web服务 ... -
JavaMail通过sina的smtp验证
2006-04-08 20:47 1122import javax.mail.*;import java ... -
用javamail发送邮件
2006-04-08 20:49 997用javamail发送邮件 aistill(原作) ... -
修改后可以发送附件、抄送、密送的javabean
2006-04-08 20:51 935/**A ... -
javamail实现smtp身份认证
2006-04-08 20:57 950现在大多 ...
相关推荐
【标题】"Himi"所涉及的是一种基于J2ME平台的3D游戏开发API,主要利用了JSR184规范。这个标题暗示我们将会探讨如何使用Java技术在移动设备上创建三维游戏。 【描述】"j2me3D游戏开发api ,jsr184"表明该资源是关于...
本文旨在为那些拥有一定JAVA基础知识,尤其是熟悉J2ME环境并理解MIDLET和CANVAS概念的开发者,提供一份详尽的指南,引领他们探索移动3D开发的奥秘。 #### 版权声明与文档结构 在正式展开之前,必须提及的是,这份...
通过深入研究这个源代码,开发者可以掌握在有限的资源条件下,如何利用J2ME实现高效的3D图形渲染,从而为手机游戏开发打下坚实基础。同时,了解和实践3D图形编程也对提升对计算机图形学原理的理解大有裨益。
《J2ME3D手机游戏开发详解》是针对移动设备上的3D游戏开发的一本专业书籍,其随书源码提供了丰富的实践示例,帮助读者深入理解J2ME平台上的3D游戏编程技术。J2ME,全称为Java Micro Edition,是Java平台的一个子集,...
由于移动设备的资源限制,性能优化在J2ME 3D游戏开发中尤为重要。这可能包括减少多边形数量、优化纹理贴图、使用适当的缓存策略以及避免不必要的计算。 **书籍资源** 提供的书籍很可能是关于J2ME 3D游戏开发的教程...
为了优化性能,J2ME的3D游戏开发需要考虑资源管理,包括内存管理和图形资源的优化。由于手机硬件资源有限,开发者需要谨慎处理大量的3D模型和纹理,可能需要进行模型简化、纹理压缩或者动态加载以降低内存占用。 在...
在Java 2 Micro Edition (J2ME)平台上,2D和3D向量几何图形学是构建游戏、应用程序和可视化工具的关键技术。向量几何图形学涉及到数学中的向量概念,以及如何在2D和3D空间中使用它们来表示位置、方向、速度和力。...
总之,【J2ME 3D开发教程】是学习和掌握J2ME平台上3D图形编程的宝贵资料,对于想要进入移动3D领域的开发者来说,无论是从理论知识还是实践技能,都能提供全面的指导。通过这个教程,开发者可以学习如何在有限的移动...
【标题】"j2me开发角色游戏 黑暗迷宫" 涉及的主要知识点包括J2ME(Java 2 Micro Edition)平台的基础知识、角色扮演游戏(RPG)的开发原理以及3D图形在移动设备上的实现。 1. **J2ME**:J2ME是Java平台的一个子集,...
《J2ME 3D手机游戏开发详解》是一本针对Java ME平台的3D游戏开发教程,旨在帮助开发者深入理解并掌握在移动设备上构建3D游戏的技术。本书结合理论与实践,通过丰富的实例,全面解析了J2ME 3D游戏开发的各个环节。 ...
然而,由于“3D滑雪”游戏是基于J2ME的,我们推测它可能没有使用这些高级库,而是依赖于MIDP内置的低级图形API,如Canvas,进行3D建模和渲染。 “EA_Snowboarding.jad”是Java应用描述文件,它包含了游戏的元数据,...
在本文中,我们将深入探讨基于J2ME的3D游戏开发,以及如何利用J2ME实现各种不同类型的游戏。 **1. J2ME游戏框架** 在J2ME中开发3D游戏,通常会使用如MIDP(Mobile Information Device Profile)和CLDC(Connected ...
通过M3G API,J2ME扩展了其在2D图形之外的功能,让开发者能够在手机、PDA等设备上实现引人入胜的3D游戏和可视化应用。 **JSR 184 API C** 指的是JSR 184规范的C语言实现。JSR是Java社区进程的一部分,用于定义新的...
【标题】"j2me 3D游戏样例"揭示了这个压缩包是关于使用Java ME(J2ME)平台开发3D游戏的实例代码和项目。Java ME是一种轻量级的Java平台,用于在移动设备和嵌入式系统上运行应用程序,包括游戏。 【描述】"j2me开发...
JSRs是J2ME扩展的标准,如JSR-184(M3G,3D图形),JSR-120(WMA,无线消息API)和JSR-226(SVG Tiny,矢量图形)。这些扩展为开发者提供了额外的功能,以满足特定的应用需求。 9. **开发工具** 开发J2ME应用通常...
无论你是想为手机开发3D游戏,还是希望通过3D图形增强其他应用的功能,本教程都会是你宝贵的参考资料。 **注意事项**:虽然教程是由J2ME开发网的社区成员集体翻译和创作的,但未经许可,不得用于商业目的。教程受到...
【基于j2ME的手机3D赛车游戏源码】是一个专为学习j2ME平台开发设计的游戏项目。...通过研究和实践,开发者不仅可以掌握j2ME的基本原理,还能了解到如何在资源受限的环境下创造引人入胜的3D游戏体验。
在游戏开发领域,尽管现代手机和游戏设备倾向于使用更强大的平台,如Android和iOS,但在早期,J2ME因其跨平台性和相对较低的硬件需求,成为了移动3D游戏的热门选择。本文将深入探讨“黑暗之门”这款J2ME 3D游戏的...
- 为J2ME提供了3D图形渲染能力,用于开发游戏和其他视觉丰富的应用。 在开发J2ME应用时,通常会根据设备特性和需求选择合适的JSR API。例如,如果需要开发一个包含蓝牙功能的应用,JSR 82是必不可少的;如果要创建...