`
lixinye0123
  • 浏览: 335912 次
  • 性别: Icon_minigender_1
  • 来自: 温州
社区版块
存档分类
最新评论

利用J2ME开发移动3D游戏之3D图形API

    博客分类:
  • Java
阅读更多
   简述

  现在,移动游戏和移动应用开发极为热门!游戏中需要有时髦漂亮的图形,其设计标准比以前任何时候都要高。本文将告诉你怎样用酷毙的移动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。
分享到:
评论

相关推荐

    (Himi)j2me3D游戏开发api

    【标题】"Himi"所涉及的是一种基于J2ME平台的3D游戏开发API,主要利用了JSR184规范。这个标题暗示我们将会探讨如何使用Java技术在移动设备上创建三维游戏。 【描述】"j2me3D游戏开发api ,jsr184"表明该资源是关于...

    J2ME的3D开发教程

    本文旨在为那些拥有一定JAVA基础知识,尤其是熟悉J2ME环境并理解MIDLET和CANVAS概念的开发者,提供一份详尽的指南,引领他们探索移动3D开发的奥秘。 #### 版权声明与文档结构 在正式展开之前,必须提及的是,这份...

    j2me 开发手机3D图形程序源代码

    通过深入研究这个源代码,开发者可以掌握在有限的资源条件下,如何利用J2ME实现高效的3D图形渲染,从而为手机游戏开发打下坚实基础。同时,了解和实践3D图形编程也对提升对计算机图形学原理的理解大有裨益。

    J2ME3D手机游戏开发详解(随书源码)

    《J2ME3D手机游戏开发详解》是针对移动设备上的3D游戏开发的一本专业书籍,其随书源码提供了丰富的实践示例,帮助读者深入理解J2ME平台上的3D游戏编程技术。J2ME,全称为Java Micro Edition,是Java平台的一个子集,...

    J2ME 3D手机游戏开发详解代码和书籍

    由于移动设备的资源限制,性能优化在J2ME 3D游戏开发中尤为重要。这可能包括减少多边形数量、优化纹理贴图、使用适当的缓存策略以及避免不必要的计算。 **书籍资源** 提供的书籍很可能是关于J2ME 3D游戏开发的教程...

    基于J2ME平台的3D手机游戏开发

    为了优化性能,J2ME的3D游戏开发需要考虑资源管理,包括内存管理和图形资源的优化。由于手机硬件资源有限,开发者需要谨慎处理大量的3D模型和纹理,可能需要进行模型简化、纹理压缩或者动态加载以降低内存占用。 在...

    j2me 2D及3D向量几何图形学

    在Java 2 Micro Edition (J2ME)平台上,2D和3D向量几何图形学是构建游戏、应用程序和可视化工具的关键技术。向量几何图形学涉及到数学中的向量概念,以及如何在2D和3D空间中使用它们来表示位置、方向、速度和力。...

    j2me 3D开发教程

    总之,【J2ME 3D开发教程】是学习和掌握J2ME平台上3D图形编程的宝贵资料,对于想要进入移动3D领域的开发者来说,无论是从理论知识还是实践技能,都能提供全面的指导。通过这个教程,开发者可以学习如何在有限的移动...

    j2me开发角色游戏 黑暗迷宫

    【标题】"j2me开发角色游戏 黑暗迷宫" 涉及的主要知识点包括J2ME(Java 2 Micro Edition)平台的基础知识、角色扮演游戏(RPG)的开发原理以及3D图形在移动设备上的实现。 1. **J2ME**:J2ME是Java平台的一个子集,...

    J2ME 3D手机游戏开发详解

    《J2ME 3D手机游戏开发详解》是一本针对Java ME平台的3D游戏开发教程,旨在帮助开发者深入理解并掌握在移动设备上构建3D游戏的技术。本书结合理论与实践,通过丰富的实例,全面解析了J2ME 3D游戏开发的各个环节。 ...

    j2me3D开发源码3D滑雪

    然而,由于“3D滑雪”游戏是基于J2ME的,我们推测它可能没有使用这些高级库,而是依赖于MIDP内置的低级图形API,如Canvas,进行3D建模和渲染。 “EA_Snowboarding.jad”是Java应用描述文件,它包含了游戏的元数据,...

    基于j2me的3d游戏

    在本文中,我们将深入探讨基于J2ME的3D游戏开发,以及如何利用J2ME实现各种不同类型的游戏。 **1. J2ME游戏框架** 在J2ME中开发3D游戏,通常会使用如MIDP(Mobile Information Device Profile)和CLDC(Connected ...

    J2ME_M3G_API.rar_M3G API_j2me 3d_j2me m_jsr 184 api c_m3g a

    通过M3G API,J2ME扩展了其在2D图形之外的功能,让开发者能够在手机、PDA等设备上实现引人入胜的3D游戏和可视化应用。 **JSR 184 API C** 指的是JSR 184规范的C语言实现。JSR是Java社区进程的一部分,用于定义新的...

    j2me 3D游戏样例

    【标题】"j2me 3D游戏样例"揭示了这个压缩包是关于使用Java ME(J2ME)平台开发3D游戏的实例代码和项目。Java ME是一种轻量级的Java平台,用于在移动设备和嵌入式系统上运行应用程序,包括游戏。 【描述】"j2me开发...

    J2ME-API.rar_j2me api

    JSRs是J2ME扩展的标准,如JSR-184(M3G,3D图形),JSR-120(WMA,无线消息API)和JSR-226(SVG Tiny,矢量图形)。这些扩展为开发者提供了额外的功能,以满足特定的应用需求。 9. **开发工具** 开发J2ME应用通常...

    J2ME的3d开发教程.doc

    无论你是想为手机开发3D游戏,还是希望通过3D图形增强其他应用的功能,本教程都会是你宝贵的参考资料。 **注意事项**:虽然教程是由J2ME开发网的社区成员集体翻译和创作的,但未经许可,不得用于商业目的。教程受到...

    基于j2me的手机3D赛车游戏源码

    【基于j2ME的手机3D赛车游戏源码】是一个专为学习j2ME平台开发设计的游戏项目。...通过研究和实践,开发者不仅可以掌握j2ME的基本原理,还能了解到如何在资源受限的环境下创造引人入胜的3D游戏体验。

    J2ME 3D 游戏 黑暗之门 代码

    在游戏开发领域,尽管现代手机和游戏设备倾向于使用更强大的平台,如Android和iOS,但在早期,J2ME因其跨平台性和相对较低的硬件需求,成为了移动3D游戏的热门选择。本文将深入探讨“黑暗之门”这款J2ME 3D游戏的...

    开发j2me必备api 【jsr系列api】

    - 为J2ME提供了3D图形渲染能力,用于开发游戏和其他视觉丰富的应用。 在开发J2ME应用时,通常会根据设备特性和需求选择合适的JSR API。例如,如果需要开发一个包含蓝牙功能的应用,JSR 82是必不可少的;如果要创建...

Global site tag (gtag.js) - Google Analytics