Centos系统下载大全 | Redhat系统下载大全 | Windows2012系统下载大全 | Windows2008系统下载大全| CMS教程 | 网站地图 51运维网-专注Linux/Unix系统安全运维!
当前位置:51运维网 > 认证 > Java认证 > 正文

3D编程指南第一部分:快速进入移动JAVA 3D编程世界

时间:2015-06-12 00:05 来源:网络整理 作者:51ou.com 阅读:

 

  D编程指南第一部分快速进入移动JAVA D编程世界

  下面你可以下载源程序和应用程序包的zip文件并且继续看该指南

  l         源代码(类和资源)

  l         应用程序包(JAR/JAD)

  l         关于Redikod的更多信息

  如此我们怎么装载这些强大的文件到我们的程序里呢?非常简单JSR 里有个名为Loader的类并且它正确的装载文件调用一个简单的方法就可以装载一个MG文件的所有引用这个方法叫做Loaderload有两个不同的参数列表一个是用String获得一个URL另一个是获得一个为加工的字节数组这里是如何使用它的例子

  ObjectD[] objects = Loaderload(fileMG);

  ObjectD[] objects = Loaderload(byteArray offset);

  装载方法总是返回一个ObjectD数组并且有它的一个非常好的原因最好的是Loader类能比MG文件装载更多基本上能保存ObjectD的所有子类然而你主要使用它来装载MG文件

  现在我创建一个简单的MG文件叫做map我要绘制它我将使用Loaderload方法装载该文件旧如你看见过的那样返回一个ObjectD数组我们不能使用ObjectD数组去绘制因此我们需要转换它使之成为我们能重画的场景在这个指南里我们将装载世界(world)结点世界结点是JSR 场面图表中最顶层的结点它控制所有种类的信息例如照相机照明设备背景和许多网眼我将讲诉场面图表和场面图表的JSR 的实施在这个系列后面的部分你现在只需要了解世界类能控制整个场面并且知道什么是我们想要的!查看这个方法它从一个MG文件中装载世界结点

  /** Loads our world */
    private void loadWorld()
    {
        try
        {
            // Loading the world is very simple Note that I like to use a
            // resfolder that I keep all files in If you normally just put your
            // resources in the project root then load it from the root
            ObjectD[] buffer = Loaderload(/res/mapMG);
           
            // Find the world node best to do it the safe way
            for(int i = ; i < bufferlength; i++)
            {
                if(buffer[i] instanceof World)
                {
                    world = (World)buffer[i];
                    break;
                }
            }
           
            // Clean objects
            buffer = null;
        }
        catch(Exception e)
        {
            // ERROR!
            Systemoutprintln(Loading error!);
            reportException(e);
        }
    }

  正如你所见的在我们用Loader类装载ObjectD数组后我们简单地审阅整个数组并找到世界结点这是查找世界结点最安全的方法在我们找到世界结点后我们将跳出循环并清空缓冲(它是不需要的因为当离开这个方法时他们会自动的得到清楚这是好的习惯)

  好的我们现在装载我们的世界结点我已经告诉过你它是场面图表的顶层结点并能控制所有场面信息在我告诉你它的绘制是如何简单之前先让我们提取照相机为了我们能在装载的世界中移动

  处理照相机

  我们有了我们的世界结点准备绘画并且现在我们需要一个照相机它能使我们围绕世界移动如果你记得我已经告诉过你世界结点能控制照相机信息因此我们应该从世界中提取照相机并操作它

  JSR 的一个照相机是用Camera类描述的这个类能很容易的用一些简单的平移和定位方法来操作我们D应用程序里的照相机在这个例子里我们将使用translate(float float float)和setOrientation(float float float float)方法第一个方法是在D空间里简单的移动照相机偏移量为xyz因此如果你想让照相机在X和Z轴方向上各移动个单位你可以这样做

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

  //Move camera   X  Y  Z
camtranslate(f f f);

  很简单的事!每个方法调用translate进一步调整照相机因此上面两个调用实际上转变照相机在X和Z轴都是个单位旋转也是一样的简单我会首先说明这个方法它操作像D API的所有旋转方法一样有个参数第一个是实际的旋转度数剩下的三个组成一个方向向量(xAxis yAxis zAxis)在周围旋转方向和方向向量在后面的丛书将会讲到现在仅仅需要知道这些

  //Rotate camera degrees around the X axis
camsetOrientation(f f f f);

  //Rotate camera degrees around the Y axis
camsetOrientation(f f f f);

  //Rotate camera degrees around the Z axis
camsetOrientation(f f f f);

  注意名为setOrientation的方法它实际意味着清除所有先前你做的旋转我假设你已经知道了怎么围绕一个坐标轴旋转在这里并不会提到关于这个主题的更多细节

  你现在知道如何移动和旋转照相机我将告诉你如何从世界中提取照相机

  /** Loads our camera */
    private void loadCamera()
    {
        // BAD!
        if(world == null)
            return;
       
        // Get the active camera from the world
        cam = worldgetActiveCamera();
       
        // Create a light
        Light l = new Light();
       
        // Make sure its AMBIENT
        lsetMode(LightAMBIENT);
       
        // We want a little higher intensity
        lsetIntensity(f);
       
        // Add it to our world
        worldaddChild(l);
    }

  是这么简单吗?是的就是这么简单我们使用getActiveCamera方法从世界中提取照相机我们将得到世界导出时的哪个照相机通过上面的方法我们得到了一个照相机我们可以把它移动成想要的效果然而这个方法还做了其他事它添加了一个灯光!我们将在后面的部分钻研灯光但在这里你只需知道如何在世界里添加一个灯光我创建一个环境光(如果你不知道环境光是光从所有方向照射所有表面)并添加它到世界里这个方法让我们得到了一个非常好的有光的世界我之前告诉过你世界结点可以控制所有种类的信息也包括灯光因此我们只需要将灯光添加入我们的世界JSR 将为我们处理那不是很容易吗?在我们阅读最后一个部分之前绘制让我们的照相机移动我已经告诉过你boolean数组键值控制我们的键信息因此我们要询问这个数组并是照相机运转首先我们需要一些变量来控制我们的照相机

  // Camera rotation
float camRot = f;
double camSine = f;
double camCosine = f;
   
// Head bobbing
float headDeg = f;

  我们将用上面的变量来控制照相机旋转的轨迹三角函数和顶点振动三角函数用于稍后的移动顶点振动是十分简单的它使照相机上下振动当我们在世界里行走时为了一种更自然的感觉好的我们需要怎么样做才能移动照相机呢?使用下面的方法

  private void moveCamera() {
        // Check controls
        if(key[LEFT])
        {
            camRot += f;
        }
        else if(key[RIGHT])
        {
            camRot = f;
        }
       
        // Set rotation
        camsetOrientation(camRot f f f);
       
        // Calculate trigonometry for camera movement
        double rads = MathtoRadians(camRot);
        camSine = Mathsin(rads);
        camCosine = s(rads);

  如你所见这部分方法是很简单的首先我们检查用户是否按下左或右键如果被按下我们仅仅是增加或减少camRot的值然后旋转照相机那是如此的简单余下的几行代码是有趣的当用户按下左或右时我们需要旋转顶点我们是围绕Y轴旋转的这就意味着方向响亮为f f f当我们旋转了照相机后我们要计算出新的Sine和Cosine角度这是为以后的移动而计算的现在我们看另一部分方法

  if(key[UP])
        {
            // Move forward
            camtranslate(f * (float)camSine f f * (float)camCosine);
           
            // Bob head
            headDeg += f;
           
            // A simple way to bob the camera as the user moves
            camtranslate(f (float)Mathsin(headDeg) / f f);
        }
        else if(key[DOWN])
        {
            // Move backward
            camtranslate(f * (float)camSine f f * (float)camCosine);
           
            // Bob head
            headDeg = f;
           
            // A simple way to bob the camera as the user moves
            camtranslate(f (float)Mathsin(headDeg) / f f);
        }

感谢您对【51运维网 http://www.51ou.com/】的支持,我们为您免费提供《3D编程指南第一部分:快速进入移动JAVA 3D编程世界》技术文章,《3D编程指南第一部分:快速进入移动JAVA 3D编程世界》详细使用和说明,有时《3D编程指南第一部分:快速进入移动JAVA 3D编程世界》可能不完善、敬请谅解!如果《3D编程指南第一部分:快速进入移动JAVA 3D编程世界》有错误请给我们留言,我们将尽快修复文章错误,如果您觉得本站不错,请分享给周围的朋友!谢谢!

顶一下
(0)
0%
踩一下
(0)
0%
推荐内容
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
验证码:点击我更换图片