毕业论文代写,职称论文发表
当前位置: > 免费论文 > 计算机论文 > 计算机应用论文 > >>查看论文

基于立即模式的Java ME 3D游戏角色设计与实现

分享到: 本站编辑:admin 日期: 2010-05-22 15:05 点击:

1 引言
随着移动通信技术的迅速发展,彩屏手机的日益普及,更加有趣、更为生动的手机游戏层出不穷。3D手机游戏作为视频游戏领域发展速度最快的部分,正逐步成为业界的新宠,也促使了3D手机游戏引领新的时代潮流。自从2004年6月,索爱推出第一款内置3D游戏的手机以来,3D手机游戏便获得了长足的发展,3D手机游戏以其逼真的视觉效果和优越的游戏性能,得到了广大用户的认可,这也促使各大厂商纷纷加大资金投入,都希望在3D手机游戏这一新的市场中找到自身的位置,抢食这块味道香甜的巨大蛋糕。3D游戏不仅使玩家在视觉上得到了满足感,更加深了玩家的游戏体验感,使玩家从游戏中得到更多的乐趣。
2 Java Me 3D场景结构
JSR-184包提供了一整套用于移动设备上的3D编程API,M3G (Mobile 3D Graphics) 技术则是定义了基于Java Me的上层接口,是Java Me在三维图形领域的扩展,以实现在手机上生成逼真三维图像的功能[1]。Java 3D的场景图是DAG(Directed—acyclic Graph),即具有方向性的开环不对称图[2],其结构如图1.1。
 
 
图1.1  在M3G中的场景层次
3 “魔块挑战”中3D魔块的实现
3.1 “魔块挑战”游戏中主角——3D魔块
“魔块挑战”是一款手机3D益智游戏,玩家通过上下左右键控制长方体模块在场景中翻滚,使其刚好能落入指定的入口中即为过关,在游戏中的这个长方体模块就是游戏的主角——3D魔块。
3.2  虚拟场景的建立
World类作为3D场景结构图中的根节点,它的对象用来存放游戏中所有节点的场景数据,包括Camera(用于设置观察者的视角)、Light(灯光)、Background(背景)和树形结构的任意数量的3D物体等。World类用来直接进行场景画面的渲染,本游戏中虚拟场景则用来存放游戏中的Camera、Light、Background)以及3D魔块,建立虚拟场景的核心代码如下:
camera = new Camera();//创建摄像机
camera.setPerspective(60.0f, (float) getWidth() / (float) getHeight(),1.0f, 1000.0f); //设置摄像机可视区域
world = new World();//创建World对象
world.addChild(camera);//添加摄像机
world.setActiveCamera(camera);//设置摄像机
3.3 3D魔块骨架搭建
Mobile 3D和大多数3D编程API可以通过“及时运算生成”或者“外部建模导入”的方式建立3D模型。本文通过“及时运算生成”的方式建立3D模型。使用JSR-184包中的VertexArray类来保存3D模块的顶点坐标、法线、帖图信息,用方法set(int index,int length,short[] array)来向该对象存放数据。相应地用JSR-184包中的VertexBuffer类来保存3D魔块的框架信息,该类通过VertexArray类提供的数组设置顶点位置、发现、帖图信息,以建立图形骨架。下面是创建模型骨架的具体代码:
//顶点数组
short[] vert ={8,16,8,    0,16,8,    8,0,8,    0,0,8,   //前
      0,16,0,    8,16,0,    0,0,0,    8,0,0,   //后
      0,16,8,    0,16,0,    0,0,8,    0,0,0,   //左
      8,16,0,    8,16,8,    8,0,0,    8,0,8,    //右
      8,16,0,    0,16,0,    8,16,8,   0,16,8,   //上
      8,0,8,     0,0,8,     8,0,0,    0,0,0}; //下
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={64, 0,        0, 0,       64,32,        0,32,
    0,32,       64,32,        0, 0,       64, 0,
    96, 0,       64, 0,       96,32,       64,32,
    96, 0,       64, 0,       96,32,       64,32,
    64, 0,        0, 0,       64,32,        0,32,
   0,32,       64,32,        0, 0,       64, 0 };
VertexArray texArray=new VertexArray(tex.length/2,2,2);
texArray.set(0,tex.length/2,tex);      //设定纹理数组
//建立一个正方体
VertexBuffer vb  = new VertexBuffer();
 vb.setPositions( vertArray, 1.0f, null );      
vb.setNormals( normArray );
vb.setTexCoords( 0, texArray, (1.0f/128.0f), null  );
在上述全部代码中给出了正方体所需要全部顶点和面的信息,不过这里还没有生成对应的模型,原因是TriangleStripArray类没有定义生成面的三角面的信息。如:
int[] stripLen = { 4, 4, 4, 4, 4, 4 }//三角带的长度
TriangleStripArray tsa = new TriangleStripArray(0, stripLen);//创建三角带的索引缓冲
3.4 3D魔块的外观效果——环境和材质的实现
3D对象的外观属性信息是由Appearace类来设置和实现的, Appearance的属性结构如图1.2。
 
图1.2 Appearance 的属性结构
本游戏使用Appearace类来实现魔块的纹理属性为一个钳位的二维图片纹理、材质属性设置为镜面反光的材质。核心代码如下:
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);   //设置纹理属性
iAppearance.setTexture(0,texture);          //添加纹理属性
iAppearance.setMaterial(iMaterial);         //添加材质属性
iMaterial.setVertexColorTrackingEnable(true);   
iMaterial.setColor(Material.SPECULAR,0xFFFFFFFF);   //设置材质的颜色
iMaterial.setShininess(100.0f);                    //外观属性添加
iAppearance.setPolygonMode(polygonMode);
3.5 模型的渲染
模型建立后,我们的最终目的是为了渲染到屏幕上,而渲染的操作主要由Graphics3D和Camera类完成。可以把Camera理解为观察者在虚拟场景中的眼睛,3D场景对象的获得则可以在任何地方调用 getInstance()方法,这也是获得对象的惟一的方法。Graphics3D在Canvas中渲染3D场景的三个步骤为:绑定对象、绘制场景、释放对象。在本游戏中通过如下代码渲染3D魔块:
public  class MyCanvas extends Canvas{
Graphics3D   myG3D =Graphics3D.getInstance;获取惟一的Graphics3D实例
public void paint (Graphics g){
try{
myG3D.bindTarget(g);
……更新场景•••
          •••渲染场景•••}
finally{//释放目标对象
myG3D.releaseTarget();}
}
}
Graphics3D重载了4个render()方法用于渲染模型,最后就可以利用paint方法把这个正方体画到手机屏幕上去,效果如图1.3所示。
                    
图1.3 魔方效果图
4 移动、旋转物体
对3D物体位置的操作是通过矩阵运算来实现的,在应用中通过Transform类封装的方法实现物体的变换操作。核心代码实现如下:
transform.postRotate(3.0f, 1.0f, 0.0f, 0.0f);//物体以中心坐标到点(1,0,0)为轴旋转3.0f的角度
transform.postTranslate(0.0f, 0.0f, 5.0f);//物体在本地坐标系下沿向量{0,0,5}移动
但是postRotate(float angle,float ax,float ay,float az)方法提供的旋转是绕物体自身坐标系旋转,而不是绕世界坐标系旋转,要使物体绕世界坐标系旋转就必须使用JSR 184包的另一个类——transformable类。图1.4为transform类和transformable类在不同坐标系下旋转结果。
 
 图1.4 不同坐标系的旋转效果 
5 结束语
本文主要介绍“魔块挑战”游戏中3D实例的实现及基本游戏操作,让读者了解手机3D游戏中以“及时运算生成”的方式建立3D对象的方法和3D对象的基本操作。用一个活动的照相机聚焦在游戏中的3D对象——能翻转的魔块上,通过对魔块的骨架搭建、外观属性设置、模型渲染建立具体的3D对象,并通过平移、旋转功能的实现展示了3D魔块的基本操作。

参考文献:
[1] http://java.sun.com/products/midp/overview.html
[2] 李振鹏,龚剑.J2ME手机游戏开发技术详解.清华大学出版社.2006年3月.
附:
 


  

本文出自:http://www.starlunwen.net/jisuanjiyingyong/16483.html

本文TAGS:游戏 角色 设计 实现 立即 模式 基于 3D // 场景

上一篇简易逻辑分析仪设计 下一篇面向数字化校园的用户统一认证管理