|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
而学习JAVA我觉得最应该避免的就是:只学习,不思考,只记忆,不实践!3D手艺对我们来讲已十分熟习了,最经常使用的3DAPI有OpenGL和Microsoft的Direct3D,在桌面游戏中早已普遍使用。关于J2ME程序而言,Mobile3DGraphicsAPI(JSR184)的呈现,使得为手机使用程序增加3D功效成为大概。
JSR184尺度(M3G:Mobile3DGraphics)为Java挪动使用程序界说了一个简便的3DAPI接口,J2ME程序能够十分便利地利用M3G来完成3D使用好比游戏等等。M3G被计划为十分轻量级的,全部API的完全完成不凌驾150kb。
M3G是J2ME的一个可选包,以OpenGL为基本的精简版,一共有30个类,运转在CLDC1.1/CLDC2.0上(必需撑持浮点运算),能够在MIDP1.0和MIDP2.0中利用。今朝,撑持M3G的手机有Nokia6230/3650/7650/6600、SiemensS65/CX65/S55/M55、Sony-EriCSSonK700i/P800/P900、Moto220/T720等。M3G只是一个Java接口,详细的底层3D引擎一样平常由C代码完成,好比很多手机厂商的3D引擎接纳的即是SuperScape公司的Swerve引擎,这是一个专门为挪动设备计划的高功能3D引擎。
相似于Microsoft的D3D,M3G撑持两种3D形式:当即形式(immediatemode)和保存形式(retainedmode)。在当即形式下,开辟者必需手动衬着每帧,从而取得较快的速率,但代码较烦琐;在保存形式下,开辟者只需设置好关头帧,剩下的动画由M3G完成,代码较复杂,但速率较慢。M3G也同意夹杂利用这两种形式。
3D模子能够在程序中创立,可是十分烦琐。因而,M3G供应一个Loader类,同意间接从一个单一的.m3g文件中读进全体3D场景。m3g文件能够经由过程3DStudioMax之类的软件创立。
假如熟习OpenGL,那末M3G长短常简单了解的。在M3G中,Graphics3D是3D衬着的屏幕接口,World代表全部3D场景,包含Camera(用于设置察看者视角)、Light(灯光)、Background(背景)和树型布局的恣意数目的3D物体。3D对象在盘算机顶用点(Point,Pixel)、线(Line,Polyline,Spline)、面(Mesh)来形貌,详细存储和运算(如扭转、投影)都是矩阵运算和变更。
SUN的WTK2.2已内置了M3G的完成包,假如安装了WTK2.2,就能够在摹拟器上运转3DMIDP程序。能够参考WTK2.2的示例demo3d。
上面是一个最复杂的M3G程序,来自Sony-Ericsson的示例代码,它创立一个扭转的金字塔,能够从此处下载完全代码并在WTK2.2中运转。
起首,我们要取得独一的Graphics3D实例,用于衬着3D场景。Graphics3D是一个Singleton完成,能够在任何中央取得:
g3d=Graphics3D.getInstance();
然后,在Canvas中衬着:
publicclassMyCanvasextendsCanvas
{
publicvoidpaint(Graphicsg){
try{
g3d.bindTarget(g);
...updatethescene...
...renderthescene...
}finally{
g3d.releaseTarget();
}
}
接上去创立一个World并设置Camera:
world=newWorld();
camera=newCamera();
world.addChild(camera);
//Thewidthandheightofthecanvas.
floatw=getWidth();
floath=getHeight();
//Constructsaperspectiveprojectionmatrixandsetsthatasthecurrentprojectionmatrix.
camera.setPerspective(60.0f,w/h,0.1f,50f);
world.setActiveCamera(camera);
接着,在createPyramid()办法中创立一个Mesh,代表金字塔,并增加到World中:
privateMeshpyramidMesh;//thepyramidinthescene
pyramidMesh=createPyramid();//createourpyramid.
pyramidMesh.setTranslation(0.0f,0.0f,-3.0f);//movethepyramid3unitsintothescreen.
world.addChild(pyramidMesh);//addthepyramidtotheworld
最初,在一个线程中让金字塔绕Y轴扭转起来:
publicvoidrun(){
Graphicsg=getGraphics();
while(true){
//rotatethepyramid1degreearoundtheY-axis.
pyramidMesh.postRotate(3.0f,0.0f,1.0f,0.0f);
draw3D(g);
flushGraphics();
}
}
进而能拉拢大多数程序员用windows产品。并且从ASP.NETAJAX可以跨平台这一点上,间接证明了我们的推断,至少证明了微软做过这方面的研究。所以如果哪一天突然听说了.net可以跨平台了,那么请不要吃惊,如果这一天真的到来,java就到了真正和.net决战的时刻。因为不到万不得以的时候微软是不会推出跨平台的.net的,如果跨平台的.net还不足以对抗java的话,那么微软还剩的手段就是开源了,呵呵。 |
|