选择显示字体大小

java游戏编程杀手:3d跳棋游戏(第一部分)

编者按:我们今天所要摘录的是给所有java玩家的,尤其是3d爱好者,我们知道你关心这。这两部分的第一部分是从《java游戏编程杀手》第十五章摘出,作者andrew davison描述了怎样在一个3d跳棋程序中用java建立一个场景。下周,andrew将说明怎样为这个3d跳棋程序建立一个浮动的球体。

版权声明:任何获得matrix授权的网站,转载时请务必保留以下作者信息和链接
作者:launze
原文:http://www.onjava.com/pub/a/onjava/excerpt/kgp_in_java_chap15/index.html
译文:http://www.matrix.org.cn/resource/article/44/44216_java+killer+game.html
关键字:java;killer;game

这章用一个java 3d例子来描述一个3d跳棋。这个例子建立了一个场景,包括:由一个暗绿色和兰色格相交平铺的,并带有标签的x轴和z轴形成的平面;一个兰色背景;一个可以在两个不同方向浮动的球体。用户可以通过鼠标来浏览(拉近放远)场景。
左边的截图15-1显示最初视图,右边的图是用户视图移动一些之后的效果。


figure 15-1. initial view, and later

3d跳棋阐述了java 3d编程中一些常用的方法和一些小窍门。例如,3d场景使用canvas3d类来实现显示(这个类和swing组件结合使用)。所有的java 3d程序需要一个场景图,3d跳棋说明了如何增加基本图形,灯光,背景。这些场景图形成了文件的可视形式,记录这些场景信息的文本版本通过daniel selman的java3dtree包很容易就能实现。(在这节的最后我会详细介绍)

地板和球体使用了java3d的quadarray, text2d, and sphere几何类:地板是由quadarray的一系列四边形组成,标签是用text2d对象沿着地板上的主轴形成。用户通过一个观察点查看这个3d世界,你将看到如何初始放置观察点、在使用java3d的orbitbehavior 类时候如何移动观察点。

3d跳棋类图

图15-2的类图说明了3d跳棋程序的public和private数据项和方法。


figure 15-2. class diagrams for checkers3d

checkers3d 是程序的顶层jframe . wrapcheckers3d 是场景图拥有的 jpanel ,作为一个canvas3d 对象,他是可视的. checkerfloor 建立地板的子图(例如方格,轴), with所有同颜色的方格用单独的coloredtiles 对象表示。

提示:例子的原代码在checkers3d/目录(可能是原书附带光盘)

java 3d和swing 的结合

就向swing文本和按纽,checkers3d 是gui控制位置的的一个 jframe ,把他放在必要的地方。在这个例子中,他建立一个wrapcheckers3d (一个 jpanel) 实例,并把他放在 borderlayout 中间。

    c.setlayout( new borderlayout( ) );
    wrapcheckers3d w3d = new wrapcheckers3d( );   // panel for 3d canvas
    c.add(w3d, borderlayout.center);


场景中的canvas3d 视图建立在wrapcheckers3d 类里。
    public wrapcheckers3d( )
    {
      setlayout( new borderlayout( ) );
      // other initialization code

      graphicsconfiguration config =
                 simpleuniverse.getpreferredconfiguration( );
      canvas3d canvas3d = new canvas3d(config);
      add("center", canvas3d);

      // other initialization code}


虽然 canvas3d 是一个重量级的gui 元素(一个系统产生窗口的轻量层),还是有一些必须注意的。重量级的组件没那么容易与swing控件组合(swing是一个轻量组件),这些控件主要由java产生。如果 canvas3d 对象内嵌到一个 jpanel问题就可以消除,并且建立出来的panel可以安全地和swing程序的其他部分结合。
提示: 这是在j3d.org的一个关于结合 canvas3d 和swing的详细讨论:(http://www.j3d.org/tutorials/quick_fix/swing.html).

相比前几章,这里没有update/draw循环。因为java 3d自身有机制来监视场景和最初视图的变化。下面以伪代码给出算法:

    while(true) {
      process user input; //用户输入
      if (exit request) break;
      perform behaviors;  
      if (scene graph has changed)  //场景改变
        traverse scene graph and render;  //移动场景视图
    }


其中的behaviors是一些影响其他部分图象的代码,比如移动的图形或改变灯光。他们用来监视图象,传递给程序中非3d部分详情。
详细代码比例子中的伪代码更加复杂,java 3d用多线程来并发移动和图形描述。因此,对这个过程有一个概括了解会对本章其他部分的理解有帮助。

场景图形建立

场景图形用 wrapcheckers3d的构造函数建立。


    public wrapcheckers3d( )
    {
      // initialization code

      graphicsconfiguration config =
                 simpleuniverse.getpreferredconfiguration( );
      canvas3d canvas3d = new canvas3d(config);
      add("center", canvas3d);
      canvas3d.setfocusable(true);     // give focus to the canvas
      canvas3d.requestfocus( );

      su = new simpleuniverse(canvas3d);

    
      createscenegraph( );
      inituserposition( );        // set user's viewpoint
      orbitcontrols(canvas3d);   // controls for moving the viewpoint

      su.addbranchgraph( scenebg );
    }


canvas3d 对象用从getpreferredconfiguration( );获得的配置来初始化。这个方法能取得硬件的图形信息。一些老的java 3d程序没有初始化一个graphicsconfiguration 对象,而是用null作为 canvas3d 的构造函数的参数,这种编程可不太好。
canvas3d 被设置成焦点,以便键盘能传递动作给场景图形。这些动作的触发通常是按键的按压和弹起,但是他们也能由定时器、帧的改变和由java 3d内部产生的事件触发。 checkers3d就不需要设置焦点,因为他没有任何动作。因为在所有的其他程序中我们都会考虑到线条,所以我没有给出线条的描绘代码。

su simpleuniverse 对象建立了标准子视图、场景图形的virtualuniverse 和locale 节点。
createscenegraph( ) 设置了灯光,天空的背景,地板,还有浮动球体。inituserposition( ) 和 orbitcontrols( ) 处理用户视角问题。最后把配置好的 branchgroup 加入到方法:

    private void createscenegraph( )
    {
      scenebg = new branchgroup( );
      bounds = new boundingsphere(new point3d(0,0,0), boundsize);


      lightscene( );         // add the lights
      addbackground( );      // add the sky
      scenebg.addchild( new checkerfloor( ).getbg( ) );  // add floor

      floatingsphere( );     // add the floating sphere

      scenebg.compile( );   // fix the scene
    } // end of createscenegraph( )


使用不同的方法来增加子图到 scenebg以建立需要的子视图。一旦图形被绘制完毕后,并允许java3d来优化他,scenebg 便只被编译一次。优化包括重排图形、重新组合编译节点。例如一连串的包含不同转换的transformgroup 节点会被编译成一个独立节点。另一个可能的优化是把具有相同显示属性的图形编成组,以便能更快地描绘。

bounds是一个 boundingsphere 类的全局实例,他用来指定环境节点对灯光、背景和orbitbehavior 对象的影响。跳跃的球体被放在场景的中心,被赋 boundsize 单位半径,并影响场景中所有事件。

最后的 wrapcheckers3d( ) 所显示的场景图象在图15-3中。
"floor branch" 节点是我发明出来掩藏一些细节,稍后将会涉及。图15-3所缺少的是场景图形的分支部分。

场景灯光

通过 lightscene( ).把一个环境灯光、两个有向灯光加入到场景中。环境灯光能到达场景中的每个角落,并且强度相同。

    color3f white = new color3f(1.0f, 1.0f, 1.0f);
    // set up the ambient light
    ambientlight ambientlightnode = new ambientlight(white);
    ambientlightnode.setinfluencingbounds(bounds);
    scenebg.addchild(ambientlightnode);


代码设置了灯光的颜色,环境灯光以bounds配置建立,并加入到场景中。类 color3f( ) 的构造函数设置rgb颜色为0.0f到1.0f(1.0f是全色)。

有向灯光模拟的一个从原处照射来的一束灯光,并从特定方向碰上物体表面。有向灯光和环境灯光的区别是有向灯光必须是方向向量。

    vector3f light1direction  = new vector3f(-1.0f, -1.0f, -1.0f);
       // left, down, backwards
    directionallight light1 =  new directionallight(white, light1direction);
    light1.setinfluencingbounds(bounds);
    scenebg.addchild(light1);



figure 15-3. partial scene graph for checkers3d

方向是介于(0,0,0)和(-1,-1,-1)的向量。灯光可以想象成是很多从不同方向,不同来源的平行灯光汇聚而成。
点光和场光是java 3d灯光的另外一种形式。点光放置在空间中,并向所有方向发射。场光以特定方向朝点光聚焦。

场景的背景

场景的背景可以指定为特定的背景(如下所示),一个静态图像或这是一个带形体的几何材质。

    background back = new background( );
    back.setapplicationbounds( bounds );
    back.setcolor(0.17f, 0.65f, 0.92f);    // sky color
    scenebg.addchild( back );

浮动的球体

sphere 是来自java 3d的 com.sun.j3d.utils.geometry 包的一个工具类,是primitive 类的一个子类,primitive 类为带有 shape3d 孩子节点的一个 group 节点。他的几何特性存储在java 3d的 trianglestriparray,这种类把球体看成一组可连接的三角形体。我没必要校准他的几何特性,但是他的现实和位置要改变。

appearance 节点是一个包含很多信息的容器,包含颜色、线条、点、多边形、描绘、透明度和材质特性。
colouringattributes 确定形体的颜色,而且不受场景灯光影响。如果一个形体需要颜色和灯光的交互作用,就要用到 material 组件。灯光要影响形体的颜色必须满足三种情况:
•        形体的几何特性必须是标准的。
•        形体的 appearance 节点必须拥有 material 组件。
•        material 必须用 setlightingenable( )打开他的光照允许。

用工具类 sphere 能自动制作成标准形体,所以第一种情况容易满足。

形体颜色
java 3d material 组件控制当一个形体被不同种类的灯光照射后的颜色。

    material mat = new material(ambientcolor, emissivecolor,
                                diffusecolor, specularcolor, shininess);


环境颜色参数指定当形体被环境灯光照射后的颜色:他给对象统一的颜色。放射性颜色贡献形体生成的颜色。这个参数经常被设置成黑色(相当于关闭)。当照射的时候,发散颜色就是对象的颜色,他的强度取决于光波照射到形体的角度。
提示:发散灯光和环境灯光通常被设置成相同,这与真实世界中的对象被照射时候的颜色一样。

镜子颜色参数的强度与从形体的光亮区域反射出的多少有关。他由控制reflective highlight尺寸的发光参数组合成。
提示:镜子颜色通常设置成白色,符合真实世界中大部分对象产生的颜色。

checkers3d类中,有两个不同方向的光,他们在球体顶部建立了两个不同的光路(如图15-1)。地板在他们的颜色未在形体的几何特性中设置前,是没有被照射到的。

floatingsphere( ) 中处理形体现实的代码如下:

  color3f black = new color3f(0.0f, 0.0f, 0.0f);
    color3f blue = new color3f(0.3f, 0.3f, 0.8f);
    color3f specular = new color3f(0.9f, 0.9f, 0.9f); // near white

    material bluemat= new material(blue, black, blue, specular, 25.0f);
    bluemat.setlightingenable(true);

    appearance blueapp = new appearance( );
    blueapp.setmaterial(bluemat);


布置形体
形体放置一般是在transformgroup 下放置图形节点。(参见图15-3 sphere group)。一个 transformgroup 用来放置、旋转和度量旗下节点。他由java 3d transform3d 对象定义其格式。

    transform3d t3d = new transform3d( );
    t3d.set( new vector3f(0,4,0));     // place at (0,4,0)
    transformgroup tg = new transformgroup(t3d);
    tg.addchild(new sphere(2.0f, blueapp));
           // set the sphere's radius and appearance
           // and its normals by default
    scenebg.addchild(tg);


set( ) 方法将形体的中心放置在(0.4.0),重置先前的旋转和度量。在重置其他格式的时候,set( ) 能用来改变度量和角度。方法settranslation( ), setscale( )和setrotation( ) 只能对已给格式起作用。

与其他3d画图程序包不同的是,java 3d中的y轴是垂直方向,而水平面由xoz决定,如图15-4。
球体的位置被设置为(0,4,0),在xoz面中心上方4个单位。


图15-4,java 3d中的坐标系

完,请等待part 2...


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons