热门文章
阿标在线 动力3.62HTML生成3.62网站文件说明
动力3.62整合动网7.0 SP2插
MDAC2.8 下载!
动力3.62版 防止垃圾留言
动力3.6全方位改动方法
让3.62不同频道实现不同风
把3.62首页登陆为横向代码
动易3.6首页随机FLASH修改
362首页和文章频道页图文幻
个性化修改3.6宝典
3.62轻易实现网摘功能
如何正确统计中文字数?
弹出JAVASCRIPT语法错误对
后台使“网站顶部LOGO地址
最新图片文章横向移动的修
html 生成艺术字
3.6 Sp2 Logo和Banner及广
日期值的计算
汉字转拼音
首页“图片更新”图片滚动
简体中文转换为繁体中文的
如何在css中定义链接的下划
J2ME 3D技术简介
[ 录入:阿标 | 点击数: | 更新时间:2005-3-12 9:16:00]
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();
}
}