`
izuoyan
  • 浏览: 9221158 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

在JSR184中使用3D帖图

阅读更多

作者:whycloud 文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=663

在这里我们将向您展示在您的JSR184 MIDlet中怎样使用3D帖图

这是一个可以获得非常漂亮的效果和意想不到的性能的方法;窍门就是渲染你的3D world到一个Image2D对象,并且将这个Image2D对象作为帖图。这样一来帖图本身就是一个包含动画的3D场景。<wrap type="square"><img onmousewheel="return bbimg(this)" height="309" src="http://www.j2medev.com/Article/UploadFiles/200508/20050830125823685.gif" width="215" onload="javascript:resizepic(this)" border="0" alt=""></wrap>

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_s1026" style="MARGIN-TOP: 0px; Z-INDEX: 1; LEFT: 0px; MARGIN-LEFT: -9pt; WIDTH: 161.25pt; POSITION: absolute; HEIGHT: 231.75pt; TEXT-ALIGN: left" type="#_x0000_t75"><p></p></shape>

在这个例子中,我们需要创建两个world对象。

第一个是用来渲染一个四棱锥到Image2D对象中;第二个用来渲染一个用刚刚建立的Image2D对象作为帖图的多边形

渲染四棱锥到Image2D

texg3d.bindTarget(sceneTexture); // 绑定一个Image2D图形对象

texg3d.render(texWorld); // 渲染四棱锥到这个Image2D

g3d.bindTarget(g); // 绑定Graphics g3d

g3d.render(world); // 渲染该 world

帖图的长宽必须是2的指数 (2, 4, 8, 16 ? 256).

sceneTexture = new Image2D(Image2D.RGB, 64, 64);

使用这个Iamge2D作为帖图并且赋给多边形

现在使用我们刚刚生成的Image2D创建一个帖图;并且设置该帖图到平面的 appearance

Texture2D texture1 = new Texture2D(sceneTexture);

texture1.setBlending(Texture2D.FUNC_REPLACE);

texture1.setWrapping(Texture2D.WRAP_CLAMP, Texture2D.WRAP_CLAMP);

texture1.setFiltering(Texture2D.FILTER_NEAREST, Texture2D.FILTER_NEAREST);

appearance.setTexture(0, texture1);

mesh.setAppearance(0, appearance);

这样一来我们就把sceneTexture设置在了帖图上了,我们可以通过及时的改变texWorld来改变这个帖图,也就是说我们获得了一个动画帖图。

源代码

英文原文

译者心得:

这篇文章介绍了一种非常有意思的特效果,作者很巧妙的通过绑定一个Image2D对象到Graphics3D上,并且将一个World对象渲染到了该Graphics3D上,从而获得了一个及时的动画帖图,这是一个很高明的做法。换一个简单的说法,就是作者在这里渲染了两个World一个渲染到帖图上一个渲染到屏幕,似乎这样解释更容易明白了。

这里既然是介绍帖图的那么,我就来个大家补充一些东西。

对于初学Mobile3D的人来说,及时生成模型的过程中有一个设置是比较难理解的

// The texture coordinates is scaled down to 0-1 values in the setTextCoords method

short []TEXTURES = new short[] {0, 255, 255, 255, 127, 0,

0, 255, 255, 255, 127, 0,

0, 255, 255, 255, 127, 0,

0, 255, 255, 255, 127, 0,

0, 0, 255, 0, 255, 255,

0, 0, 255, 255, 0, 255};

TEXTURE_ARRAY = new VertexArray(TEXTURES.length / 2, 2, 2);

TEXTURE_ARRAY.set(0, TEXTURES.length / 2, TEXTURES);

vertexBuffer.setTexCoords(0, TEXTURE_ARRAY, (<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1" unitname="F" w:st="on">1.0f</chmetcnv>/<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="255" unitname="F" w:st="on">255.0f</chmetcnv>), null);

vertexBuffer.setTexCoords(1, TEXTURE_ARRAY, (<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1" unitname="F" w:st="on">1.0f</chmetcnv>/<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="255" unitname="F" w:st="on">255.0f</chmetcnv>), null);

这里TEXTURES其实设置的是每个顶点对应在帖图中的位置,也许有人在这里要问,帖图的尺寸是1为单位的,而这里这个数组只可以设置成short类型的,那么我如何获得帖图中的某个位置呢?在这个例子中就给出解决的方法。在设置顶点对应帖图坐标的时候在这个例子中给出的是大于1的正整数。而在设置多边形的时候vertexBuffer.setTexCoords(0, TEXTURE_ARRAY, (<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1" unitname="F" w:st="on">1.0f</chmetcnv>/<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="255" unitname="F" w:st="on">255.0f</chmetcnv>), null);这个方法中的第三个参数恰恰就是设置帖图的比例尺,这样一来就需要用数组中的值乘以该比例,获得是该顶点的帖图坐标。

这里调用两次vertexBuffer.setTexCoords(0, TEXTURE_ARRAY, (<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1" unitname="F" w:st="on">1.0f</chmetcnv>/<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="255" unitname="F" w:st="on">255.0f</chmetcnv>), null);其实是设置两个帖图信息,为什么要设置两次?这和Graphics3D有关。具体细节这里不介绍了,但要告诉你的是,这里你把第二此调用去掉也可以运行该例程。

分享到:
评论

相关推荐

    [JSR-184][3D编程指南]Part II: Light 3D theory and orientation

    在"src"目录中,可能包含了示例代码,展示如何使用JSR-184创建和操作3D对象,设置光源,以及处理物体的定向。这些代码可能包括定义3D形状、设置光源属性、应用变换以及渲染场景的函数。 在"res"目录下,可能包含了...

    jsr_184_midlet.rar_DEMO_jsr184_jsr184-m3g.jar_m3g

    在提供的压缩包"jsr_184_midlet.rar_DEMO_jsr184_jsr184-m3g.jar_m3g"中,我们可以看到与JSR 184相关的几个关键元素: 1. **DEMO**:这是一个演示程序,用于展示JSR 184技术的实际应用。通过这个DEMO,开发者或用户...

    m3g 3d jsr184中文文档

    在JSR 184中,它通过提供一系列的类和方法来实现这一目标。这些类包括但不限于几何对象(如立方体、球体等)、纹理、光照、相机视角控制等关键元素,它们共同构成了3D场景的基础。 **M3G API** M3G,即Mobile 3D ...

    JSR-184.zip_JSR184 3D_jsr184

    用jsr184编写的手机3d编程实例,用户可以任意旋转箭头,放大缩小等等。包含如何使用数据定义mesh,如何操作camera如何旋转等等,程序功能较繁杂,但是界面较粗糙(数据定义的模型当然是越简单越好啦),学习意义大于...

    j2me jsr184 api

    在提供的压缩包中,`jsr184 M3G API`很可能是包含了JSR 184的实现库或者相关文档,对于想要在J2ME平台上进行3D图形开发的开发者来说,这是一个宝贵的资源。通过深入学习和实践,可以掌握如何利用这些API创建引人入胜...

    jsr184+M3G+API.rar

    在实际开发中,开发者会使用这些API来构建3D场景,通过编程实现模型的旋转、平移、缩放等变换,以及复杂的动画效果。同时,通过`site.xml`和`plugins`目录提供的工具和配置,可以更方便地进行开发、调试和优化工作,...

    j2ME jsr 184

    JSR 184,全称为“Mobile 3D Graphics API”,是一项针对J2ME平台的规范,旨在提供在移动设备上进行3D图形编程的能力。 **核心概念与功能** 1. **3D图形渲染**:JSR 184提供了基础的3D图形渲染框架,包括向量和...

    J2ME_M3G_API.rar_M3G API_j2me 3d_j2me m_jsr 184 api c_m3g a

    JSR 184(Java Specification Request 184)定义了这个API,旨在为小型设备提供高效且易于使用的3D图形接口。 **M3G API** 是J2ME中的一个重要组成部分,它提供了一组类和接口,使得开发人员能够利用有限的移动设备...

    [JSR-184][3D编程指南]Part IV:M3G built-in collision,light physics and camera perspec

    `res`可能包含了教程中使用的3D模型、纹理或其他资源,而`src`则可能包含了实现上述功能的源代码。结合理论与实践,将有助于开发者更好地掌握M3G的高级特性。 总之,【JSR-184】【3D编程指南】Part IV探讨了移动3D...

    [JSR-184][3D编程指南]Part I: Quick jump into the world of Mobile Java 3D programming

    在提供的`src`和`res`文件中,`src`可能包含示例代码,用于演示如何使用JSR-184 API创建3D对象和交互。`res`文件夹可能包含纹理图像、3D模型文件以及其他资源,这些资源可以与代码配合使用,以展示一个完整的3D应用...

    (Himi)j2me3D游戏开发api

    总结来说,"Himi"提供的j2me3D游戏开发api基于JSR184,为J2ME平台的3D游戏开发提供了一套全面的工具集,让开发者能够在有限的移动设备资源下创造出引人入胜的3D游戏体验。通过理解和掌握这一API,开发者可以拓宽其在...

    [JSR-184][3D编程指南]Part III: Particle systems and immediate mode rendering (2)

    在JSR-184中,理解如何创建和管理粒子系统对于开发高质量的3D游戏或应用至关重要。 立即模式渲染(Immediate Mode Rendering)与缓存模式相对,它不依赖于图形硬件的预定义状态。在立即模式下,开发者直接向GPU发送...

    [JSR-184][3D编程指南]Part V: Heightmap terrain rendering using M3G

    总之,【JSR-184】的3D编程指南Part V专注于使用M3G在移动设备上实现基于高度图的地形渲染,涉及图像处理、3D网格构建、纹理映射、光照以及移动平台的图形渲染技术。通过实践和理解这些概念,你将能够创建出逼真的3D...

    dg_java_3d_cn_r33a.rar_micro3D

    Micro3D则是JSR184的一个实现框架,由Esmertec公司开发,它提供了一个高效且易于使用的接口,帮助开发者快速构建3D应用程序。Micro3D支持多种3D图形特性,包括顶点数组、多边形渲染、视口设置、深度缓冲以及3D变换等...

    3-D_Game_Development_on_JSR-184_v1_0_3

    《3-D Game Development on JSR-184 v1_0_3》是关于使用Java 3D技术在J2ME平台上开发3D游戏的一份重要资料,它为初学者提供了一个宝贵的入门教程。JSR-184,全称为Java ME 3D API,是Java Micro Edition(J2ME)平台...

    jsr168和jsr268中文文档及开发手册

    JSR168和JSR268是两个与Java Portal技术相关的标准,它们主要涉及如何创建和管理可重用的、模块化的Web内容组件,这些组件可以在门户应用中集成和展示。 JSR168,全称为“portlet API 1.0”,于2003年发布,是...

    文件操作-JSR75包使用总结

    在J2ME开发中,JSR75是Java Community Process定义的一个标准,它为移动设备提供了文件系统和个人信息管理(PIM)的访问接口。本文主要聚焦于JSR75中的文件操作部分,总结了一些核心知识点。 首先,我们需要确定...

    3D宝箧塔形状基础模型代码

    在实际编码过程中,你需要定义每个3D形状的顶点坐标,然后利用JSR184提供的渲染功能将它们绘制到屏幕上。此外,可能还需要考虑光照、纹理映射等高级3D效果,以增强视觉表现。 文件名“BQYT”可能是指宝箧印塔的具体...

    tuxla3d:使用 JSR-184 移动 3D 图形 API 使用 Java 构建的适用于 J2ME 平台的移动 3D 块游戏

    移动 3D 块游戏适用于 J2ME 平台,使用 JSR-184 移动 3D 图形 API 使用 Java 构建。 指示 不同颜色的盒子会从游戏区的顶部掉下来。 您的目标是使用控制键对相同颜色的框进行分组。 一旦三个或更多的盒子在一行、一...

    使用JSR356在Java中构建WebSocket应用

    使用JSR356在Java中构建WebSocket应用,详细介绍,包括1.服务器推送给客户端和2.客户端发送给服务器

Global site tag (gtag.js) - Google Analytics