综合资料网logo
首页 >> 类别 >> java开发 >> 正文

基于Java 3D的虚拟漫游技术研究

字体:大 字体:中 字体:小 飞扬的资料库 更新于:2011-11-28 阅读次数:24  
相关标签:
  • Java 3D(1)
  • 虚拟漫游(1)
  • 视点坐标(1)
  • 网络环境(1)

  •   摘 要:探讨在当前网络环境下可满足网络可视化要求的虚拟漫游技术,剖析虚拟漫游控制技术即视点变换情况,给出一种科学有效的视点变换关系,保存当前的视点坐标和方位,利用键盘来控制漫游方向和行进。结合Java 3D的代码可传输特性,基于Java 3D构建了可满足网络可视化要求的虚拟建筑物漫游,效果较好。
      关键词: Java 3D; 虚拟漫游; 视点坐标; 网络环境
     基于Java 3D的虚拟漫游技术研究
      基于Java 3D的虚拟漫游技术研究
      本文主要研究了在虚拟漫游中视点的变换关系,并基于Java 3D构建了可满足网络可视化要求的建筑物虚拟漫游;但对于碰撞检测方面并没有进行深入的研究,最后的效果不是非常理想,有待进一步的改进。
      
      Investigation of Virtual Ramble Technology Based on Java 3D
      LIN Lü-ping, WANG Ru
      (Xi’an University of Architecture & Technology, Xi’an 710055, China)
      Abstract: The virtual ramble technology which can meet the request of the network visualiztion under the current network environment is discussed. The virtual ramble control technology (variation of view point) is analyzed. A variation relation of view point which is scientific and effective is given. The virtual ramble which can meet the request of network visualization based on Java 3D is built by preserving the current eye coordinate and azimuth, utilizing the keyset to control the ramble direction and movement, and combining the code transmission charicteristic of Java 3D.
      Keywords: Java 3D; virtual ramble; eye coordinate; network visalization
      
      虚拟漫游技术是虚拟现实(virtual reality)技术的重要组成部分,在各个领域,尤其是旅游、航天航空、医学、建筑等行业有着巨大的发展空间[1]。传统的编程工具如OpenGL和DirectX,能够有效的进行三维开发,从而实现虚拟漫游,但是,随着Internet的快速发展,B/S(Browse/Server)系统拥有传统的C/S(Client/Server)系统所没有的巨大优势,在B/S系统中,如果采用OpenGL等传统的编程工具,只能在Web服务器端生成图像,然后再一幅幅地传给客户端显示,在当前的Internet传输能力下,是不可能满足网络可视化要求的。而Java 3D却可以很好地解决Internet传输能力所带来的问题,因为它具有代码可传输性,这使得用来生成复杂三维图像的程序可以方便地从服务器端传送到客户端,然后在客户端本地运行,进而生成三维图像。因为传输的不是图像本身,而是控制图像生成的程序和数据,所以大大缩减了网络传输的数据量[2]。
      1 Java 3D
      Java 3D是SUN公司继Java的火爆成功后,于1997年推出的面向网络的交互式三维图形应用程序接口(API)[3]。Java 3D有纯粹的面向对象结构,其基本数据结构(场景图)是一些具有方向性的不对称图形组成的树状结构[4],涵盖了整个视景和立体空间的完整描述[5];Java 3D封装了流行的3D开发工具OpenGL和DirectX,提高了编写三维图形程序的层次——编程时不需要考虑光照、着色、碰撞检查等复杂的图形学问题;Java 3D来自于Java,所以它拥有了一切Java所拥有的优点,比如一次编写,就可以跨平台运行,而且还可以充分借用Java的各种功能,如交互式用户接口、图像处理、字体、绘制二维图形等;并且,Java 3D能并行着色,能自动利用硬件的加速功能来快速生成图像,还能对场景进行预编译以提高效率[6]。
      2 视点变化
      虚拟漫游的实质与现实中的漫游一样,物体在三维世界中是不变的,通过改变观察者的视点,以及视角,来获得不同的感官效果,从而实现漫游[7]。
      Java 3D虚拟空间的坐标系统是右手坐标系的。x轴的正方向是水平向右,y轴的正方向是垂直向上,z轴正方向指向观察者[8]。在实现虚拟漫游的时候,物体与所处虚拟空间坐标系的相对位置关系是不变的,改变的是观察者的位置[9]。
      在现实世界中,人观察事物有前进、后退、左走、右走等行为,相应的,观察者在世界坐标系中的坐标也发生改变,当观察者改变视线的方向和角度时,所看到的景物也不一样,虚拟世界中的漫游也采用同样的道理[10]。这里可以模拟向前走和向左走的行为。构造一个这样的坐标系,如图1所示,正南方向为z轴正方向,正东方向为x轴正方向,O为原点,再标志2个点A和D,其中,OA垂直于OD;设定OA为视线的方向,则OD即为向左走时的方向。由点A做一条直线垂直于x轴并交于点B,另做一条直线垂直于z轴并交于点C;同理过D做x轴、z轴的垂线,垂足分别为E,F。可以发现,|OB|即为向前走时在x轴移动的距离,|OC|即为向前走时在z轴移动的距离;|OE|即为向左走时在x轴移动的距离,|OF|即为向左走时在z轴移动的距离。
      图1 视点的坐标位置
      如图1所示,视线与z轴负方向的角度θ在[0,90°]中,当观察者从点O向前移动到点A,即观察者的坐标从点O移动到点A时,相当于观察者先从点O沿x轴负方向移动到点B,再由点B沿z轴负方向移动到点A。其中|OB|=|OA|sin θ,|OC|=|OA|cos θ。假定观察者的原始坐标为(x1,z1),向前移动s,到达新的坐标点(x2,z2);则可以得到如下公式:
      
      x2=x1-ssin θ,z2=z1-scos θ
      
      当观察者从点O向左移动到点D,由于OD垂直于OA,所以∠DOE=θ。由此可知|OE|=|OD|cos θ,|OF|=|OD|sin θ。假定观察者的原始坐标为(x1,z1),向左移动s,到达新的坐标点(x2,z2);则可以得到如下公式:
      
      x2=x1-scos θ,z2=z1+ssin θ
      
      同样的,θ在其他3个象限中时,当观察者从坐标(x1,z1)向前移动s到坐标(x2,z2),均可以得出以下公式:
      
      x2=x1-ssin θ (1)
      z2=z1-scos θ (2)
      
      当观察者从坐标(x1,z1)向左移动s到坐标(x2,z2),均可以得出以下公式:
      
      
      x2=x1-scos θ (3)
      z2=z1+ssin θ (4)
      
      同理可推出,当观察者由坐标(x1,z1)向后移动s到坐标点(x2,z2)时,两个坐标点之间的关系如下:
      
      x2=x1+ssin θ (5)
      z2=z1+scos θ (6)
      
      当观察者由坐标(x1,z1)向右移动s到坐标点(x2,z2)时,两个坐标点之间的关系如下:
      
      x2=x1+scos θ (7)
      z2=z1-ssin θ (8)
      
      当观察者的坐标发生改变时,相应的,视点的坐标也在改变,而且变化的方向与距离跟观察者移动的方向与距离一致。
      3 建筑物漫游
      利用上述的视点变换公式并结合Java 3D的知识,可以得出以下算法:
      private TransformGroup targetTG; /*声明一个TransformGroup对象*/
      private double angle = 0.0; /*水平方向的角度*/
      private double[]people={0.0,0.0,0.0}; /*观察者的坐标位置*/
      private double[]point={0.0,0.0,0.0}; /*观察目标的坐标位置*/
      Transform3D t=new Transform3D(); /*新建一个Transform3D对象*/
      If(press up key){
    上一页12下一页


    我来说两句
    用户名: 密码: 匿名发表
    验证码: