快捷搜索:

J2ME 3D技术简介

3D技巧对我们来说已经异常认识了,最常用的3D API有OpenGL和Microsoft的Direct 3D,在桌面游戏中早已广泛利用。对付J2ME法度榜样而言,Mobile 3D Graphics API(JSR184)的呈现,使得为手机利用法度榜样添加3D功能成为可能。

JSR184标准(M3G:Mobile 3D Graphics)为Java移动利用法度榜样定义了一个简洁的3D API接口,J2ME法度榜样可以异常方便地应用M3G来实现3D利用比如游戏等等。M3G被设计为异常轻量级的,全部API的完备实现不跨越150kb。

M3G是J2ME的一个可选包,以OpenGL为根基的精简版,一共有30个类,运行在CLDC1.1/CLDC2.0上(必须支持浮点运算),可以在MIDP1.0和MIDP2.0中应用。今朝,支持M3G的手机有Nokia 6230/3650/7650/6600、Siemens S65/CX65/S55/M55、Sony-Ericsson K700i/P800/P900、Moto 220/T720等。M3G只是一个Java接口,详细的底层3D引擎一样平常由C代码实现,比这样多手机厂商的3D引擎采纳的就是SuperScape公司的Swerve引擎,这是一个专门为移动设备设计的高机能3D引擎。

类似于Microsoft的D3D,M3G支持两种3D模式:急速模式(immediate mode)和保留模式(retained mode)。在急速模式下,开拓者必须手动衬着每一帧,从而得到较快的速率,但代码较繁琐;在保留模式下,开拓者只需设置好关键帧,剩下的动画由M3G完成,代码较简单,但速率较慢。M3G也容许混杂应用这两种模式。

3D模型可以在法度榜样中创建,然则异常繁琐。是以,M3G供给一个Loader类,容许直接从一个单一的.m3g文件中读入整个3D场景。m3g文件可以经由过程3D Studio Max之类的软件创建。

假如认识OpenGL,那么M3G是异常轻易理解的。在M3G中,Graphics3D是3D衬着的屏幕接口,World代表全部3D场景,包括Camera(用于设置察看者视角)、Light(灯光)、Background(背景)和树型布局的随意率性数量的3D物体。3D工具在谋略机顶用点(Point, Pixel)、线(Line, Polyline, Spline)、面(Mesh)来描述,详细存储和运算(如扭转、投影)都是矩阵运算和变换。

SUN的WTK2.2已经内置了M3G的实现包,假如安装了WTK2.2,就可以在模拟器上运行3D MIDP法度榜样。可以参考WTK2.2的示例demo3d。

下面是一个最简单的M3G法度榜样,来自Sony-Ericsson的示例代码,它创建一个扭转的金字塔,可以从此处下载完备代码并在WTK2.2中运行。

首先,我们要得到独一的Graphics3D实例,用于衬着3D场景。Graphics3D是一个Singleton实现,可以在任何地方得到:

g3d = Graphics3D.getInstance();

然后,在Canvas中衬着:

public class MyCanvas extends Canvas

{

public void paint(Graphics g) {

try {

g3d.bindTarget(g);

... update the scene ...

... render the scene ...

} finally {

g3d.releaseTarget();

}

}

接下来创建一个World并设置Camera:

world = new World();

camera = new Camera();

world.addChild(camera);

// The width and height of the canvas.

float w = getWidth();

float h = getHeight();

// Constructs a perspective projection matrix and sets that as the current projection matrix.

camera.setPerspective(60.0f, w / h, 0.1f, 50f);

world.setActiveCamera(camera);

接着,在createPyramid()措施中创建一个Mesh,代表金字塔,并添加到World中:

private Mesh pyramidMesh; // the pyramid in the scene

pyramidMesh = createPyramid(); // create our pyramid.

pyramidMesh.setTranslation(0.0f, 0.0f, -3.0f); // move the pyramid 3 units into the screen.

world.addChild(pyramidMesh); // add the pyramid to the world

着末,在一个线程中让金字塔绕Y轴扭转起来:

public void run() {

Graphics g = getGraphics();

while(true) {

// rotate the pyramid 1 degree around the Y-axis.

pyramidMesh.postRotate(3.0f, 0.0f, 1.0f, 0.0f);

draw3D(g);

flushGraphics();

}

}

以上对M3G作了一个简单的先容,假如必要更多资料,可以参考:

http://jcp.org/en/jsr/detail?id=184

http://www.opengl.org

您可能还会对下面的文章感兴趣: