BBS水木清华站∶精华区

发信人: vrml (3d), 信区: Java        
标  题: JAVA3D学习系列(14)--初始观察位置的给定 
发信站: BBS 水木清华站 (Wed Apr 21 08:30:05 1999) 
 
   JAVA3D学习系列(14)---初始观察位置的设定 
 
 
 
 
    汕头大学机电系    张杰(jzhang@mailserv.stu.edu.cn) 
 
****************书名  VRML2.0交互式三维图形编程****** 
JAVA3D学习系列中的例题将有非常多的VRML程序与之相比较, 
介绍JAVA3D的顺序也和VRML2.0新书基本一致, 
欢迎购买VRML2.0新书。 
特殊购书方式: 
1。作者售书 
1。网上订购(email address: jzhang@mailserv.stu.edu.cn) 
2。可以先获书,后汇款(不满意可退书), 
   只需将通信地址及邮编告知作者,即可在最短的时间内得到书。 
3。书价为25元/本,免收邮购费用。 
4。书为16开本,正文161页。 
5. 购书可获盖有出版社财务章的收据。 
6. 如果需要书中所有的源程序,我可以email一个打包程序 
*************书名   VRML2.0交互式三维图形编程****** 
 
 
一. 初始观察位置的给定 
    前面我们介绍的JAVA3D程序,在没有进行比例变换前,观察点位于 
(0 , 0 , 2.41 ),这是由 
      setLayout(new BorderLayout()); 
      Canvas3D c = new MyCanvas3D(null); 
      add("Center",c); 
      BranchGroup scene = createSceneGraph(); 
      SimpleUniverse u = new SimpleUniverse(c); 
      u.getViewingPlatform().setNorminalViewingTransform(); 
多个语句确定的,在前面的第5讲已经对其作了简单介绍,大多数程序 
都利用这些语句定义场景图中的一个观察分支。 
    我们可以将JAVA3D所提供的java3d-utils-src.jar按照下面 
的方式解开: 
      jar xvf java3d-utils-src.jar 
就可以获得JAVA3D所有UTILITY的源程序,我们可以从其中的 
SimpleUniverse.java、ViewingPlatform.java 
程序了解JAVA3D是如何进行观察点初始位置的设置的。 
    语句中的u定义了一个SimpleUniverse类型的对象实例。 
getViewingPlatform()方法定义在ViewingPlatform.java中, 
利用它可以获得程序所需要的观察位置,而此方法又通过 
ViewingPlatform.java中的setNorminalViewingTransform() 
来做进一步的设置。 
    在没有用到setNorminalViewingTransform()之前, 
ViewingPlatform() 给出的缺省观察位置为坐标原点(0,0,0), 
而当我们用到setNorminalViewingTransform()时,由 
viewDistance我们得知这时的观察点的Z坐标移到了 
1/tan(math.PI/8),也即2.41。 
 
**************这时的观察视角为90°**************** 
 
    如果要使程序的观察点为一个可以很方便改动的点,我们就 
需要将程序改动,下面是我们将前面介绍的第4讲的程序 
SimpleCone.java,修改获得的新程序NewCone.java,两者的差别 
在于,SimpleCone.java的观察点位于(0,0,2.41), 
NewCone.java的观察点坐标位于(0, 0, 10)。我们可以根据需要 
设定初始的观察点的位置,这时只需要方便地将(0,0, 10)改为 
我们所需要的任何数值。初始观察位置改动同样用到了 
SimpleUniverse对象,只是将对象的观察点坐标变量作了修改。 
 
//NewCone.java 
 
import java.applet.Applet; 
import java.awt.BorderLayout; 
import com.sun.j3d.utils.applet.MainFrame; 
import com.sun.j3d.utils.geometry.Cone; 
import com.sun.j3d.utils.universe.*; 
import javax.media.j3d.*; 
import javax.vecmath.*; 
 
public class NewCone extends Applet{ 
 
  public BranchGroup createSceneGraph() { 
 
    BranchGroup objRoot = new BranchGroup(); 
 
    TransformGroup objTrans = new TransformGroup(); 
    objRoot.addChild(objTrans); 
     
    Appearance app = new Appearance(); 
    Material material = new Material(); 
    material.setEmissiveColor(new Color3f(1.0f,0.0f,0.0f)); 
    app.setMaterial(material); 
    Cone cone=new Cone(.5f,1.0f,1,app); 
    objTrans.addChild(cone); 
 
    objRoot.compile(); 
        return objRoot; 
    } 
 
    public NewCone() { 
       setLayout(new BorderLayout()); 
        Canvas3D c = new Canvas3D(null); 
        add("Center", c); 
          ViewPlatform        viewPlatform; 
          Viewer viewer = new Viewer(c); 
          Vector3d viewpoint = new Vector3d(0.0, 0.0, 10.0);    
                                                 //初始观察点位置 
       Transform3D t = new Transform3D(); 
       t.set(viewpoint); 
          ViewingPlatform v = new ViewingPlatform( ); 
          v.getViewPlatformTransform().setTransform(t); 
 
        BranchGroup scene = createSceneGraph(); 
       SimpleUniverse u =   new SimpleUniverse( v,   viewer); 
            
       u.getViewingPlatform(); 
       u.addBranchGraph(scene); 
     
    } 
 
    public static void main(String[] args) { 
        new MainFrame(new NewCone(), 256, 256); 
    } 

 
//end of NewCone.java 
 
-- 
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.192.158.172] 

BBS水木清华站∶精华区