WAP之家:为您提供最全最新的WAP技术,CP.SP.3G等行业资讯。 WAP之家交流论坛全新开放 点击进入>>
WAP资讯 | 3G动态 | SP动态 | 运营商动态 | 内容商动态 | 制造商动态 | 论坛讨论>> 每次自动访问
WAP技术 | WAP源码 | 手机编程 | 手机源码 | 无线技术 | J2ME技术 | 手机软件 添加到收藏夹
IVR技术 | SP资料 | SMS MMS技术 | 商业方案 | IVR下载 | 书籍教程 | 工具软件 语言:繁體中文

WAP之家技术文章手机编程Symbian游戏开发在移动设备上使用M3G编程教程

在移动设备上使用M3G编程教程
作者:碧云天  来源:翻译  发布时间:2005-12-20 2:30:23
据。它可以转换成任何一个从Object3D类中继承过来的类。虽然,你们几乎都是使用这种方式来调入M3G文件。

       现在,我创建了一个简单的M3G文件,命名为map.M3G并且显示它。我们将使用loader.load方法来载入这个文件,正如我们看见的那样,这个函数返回的是一个Object3D的数组。正如程序显示的那样我们不能使用Object3D直接进行显示,我们必须将它转化成能够在屏幕上显示的对象。在这个教程中,我们将载入这个World节点。World节点是JSR184屏幕绘图的顶节点。它将处理各种类型的信息其中包括摄像机、灯光、背景、和一些贴图。在系列文章的以后部分将深入的讲解场景绘图和JSR184的其他接口,现在我们只需要知道的就是World类可以擦作一个整个的场景,和我们想做的额外的事情。请看下面的代码,这段代码的作用是从一个M3G文件中导入一个World节点。

** Loads our world */
    private void loadWorld()
    {
        try
        {
            // Loading the world is very simple. Note that I like to use a
            // res-folder that I keep all files in. If you normally just put your
            // resources in the project root, then load it from the root.
            Object3D[] buffer = Loader.load("/res/map.M3G");
           
            // Find the world node, best to do it the "safe" way
            for(int i = 0; i < buffer.length; i++)
            {
                if(buffer[i] instanceof World)
                {
                    world = (World)buffer[i];
                    break;
                }
            }
           
            // Clean objects
            buffer = null;
        }
        catch(Exception e)
        {
            // ERROR!
            System.out.println("Loading error!");
            reportException(e);
        }
    }

    正如你所看见的,我们使用Loader类载入Object3D数组以后,我们只需要简单地遍历整个数组并且找到World节点。这是查找一个World节点的最安全的方法。当我们发现我们的World节点以后我们应当中断我们的循环并且清除我们的缓冲区(既然不需要了,就应当删除了,虽然离开方法以后会自动删除,但养成好的习惯)。

    好了,新在我们已经载入了我们的World节点,也就是我们已经知道了一个场景的最高节点,和操作所有节点的信息。在向你展示简单的显示他们之前,让我们首先来展示一下我们如何移动一个摄像机在我们刚刚载入的文件中。

    摄像机操作:

    我们已经有一个准备绘制的World节点那么我们需要一个摄像机,这个摄像机的作用是使我们能够在整个世界中移动。如果你回忆一下你会发现我们已经准备好了一个我们能够使用的摄像机信息。所以我们应当从World中拾取出摄像机,并且操作它。

    在JSR184中一个摄像机通过Camera类来描述。这个类使得我们在我们的3D程序中更容易的操作摄像机完成简单地定位和旋转方法。我们在例子中只使用了两个方法分别是translate(float, float, float)和setOrientation(float, float, float, float)。第一种方法是在3D空间中移动偏移为X,Y和Z。举个例子,如果你想移动摄像机到X轴3个单位和Z轴3个单位,你应当做如下处理:

Camera cam = new Camera();  // This is our camera

//移动摄像机偏移   X  Y  Z
cam.translate(3.0f, 0.0f, 3.0f);

       小菜一碟,每个方法调用移动摄像机是在以前的基础上操作,也就是入阁我们调用了两次以上的方法那么实际上我们是在X轴上移动了6个单位、在Z轴上也移动了6个单位。旋转就象移动一样简单,但是我们首先还要解释一下这个方法。它看起来十分象3DAPI旋转的方法。我们需要四个参数,第一个参数是旋转的实际角度,其他三个参数是一个要旋转的方向向量(X轴,Y轴,Z轴)。转向和方向向量将在以后讲到,现在,我们只需要知道以下的就可以了:

//沿着X轴旋转30度
cam.setOrientation(30.0f, 1.0f, 0.0f, 0.0f);

//沿着Y轴旋转30度
cam.setOrientation(30.0f, 0.0f, 1.0f, 0.0f);

//沿着Z轴旋转30度
cam.setOrientation(30.0f, 0.0f, 0.0f, 1.0f);

       注意这个方法的名称是setOrientation,这意味着将清除摄像机以前的的所有旋转操作。我假设你已经知道了沿着一个轴旋转的意义是什么,我们将不再这里讨论这个问题。

       既然你已经知道了操作一个摄像机移动和旋转的方法,我们将展示如何从一个World中提取一个摄像机。

/** 载入我们的摄像机 */
    private void loadCamera()
    {
        // BAD!
        if(world == null)
            return;
       
        // 从世界中得到当前活动的摄像机

        cam = world.getActiveCamera();
       
        //
创建一个灯光
        Light l = new Light();
       
        //
确认灯光是 AMBIENT
        l.setMode(Light.AMBIENT);
       
        // 我们设置一个较亮的亮度

        l.setIntensity(3.0f);
       
        //
把它添加到世界中
        world.addChild(l);
    }

    这个容易吗?它很容易。我们只是使用getActiveCamera方法从World中提取当前活动的摄像机。这是我们世界被导出的时候已经带的摄像机。通过以上的方法我们得到了一个我们可以根据我们的想法来操作的摄像机。然而这个函数中也做了其他们功能,这里添加了一个灯。我们将在以后的章节中深入的讲述灯光,但是这里我们看见在世界中添加一个灯光是如此的容易。我们创建了一个环境灯光(如果你不知道,那么环境灯光就是所有的表面都被灯光从每个方向照亮。)并且添加到世界中。这个方法是我们得到了一个真实的世界,正如我在以前对你们讲到的,World节点能够操作所有类型的节点信息,包括灯光,所以我们只需要在我们的世界中添加一次灯光,JSR184将为我们操作。难道还手动的设置吗?我们在开始下一个部分:显示之前,让我们来移动摄像机。我们已经在以前提到了存储键盘信息的布尔型的数组,所以我们处理数组和操作我们的摄像机行为。首先我们需要一些使我们摄像机运动的变量。

// 摄像机旋转
float camRot = 0.0f;
double camSine = 0.0f;
double camCosine = 0.0f;
   
//
头部振动
float headDeg = 0.0f;

    以上的变量帮助我们保存摄像机的旋转,移动和头部抖动的信息。三角函数使用是为了以后的摄像机移动。头部抖动实现的也相当简单,当我们在世界中移动的时候我们使得摄像机上下抖动,这只是对视觉的一种欺骗,看起来更自然的感觉。好了,我们已经说明了所有的关于摄像机移动的问题了,我们在下面的方法中展示:

private void moveCame

上一页  [1] [2] [3] [4]  下一页

[] [返回上一页] [打 印]
文章评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码