Java 版 (精华区)
发信人: bali (阿奔), 信区: Java
标 题: JAVA3D学习系列(14)---初始观察位置的设定
发信站: 紫 丁 香 (Fri Mar 24 11:04:45 2000), 转信
发信人: vrml (3d), 信区: Java
标 题: JAVA3D学习系列(14)--初始观察位置的给定
发信站: BBS 水木清华站 (Wed Apr 21 08:30:05 1999)
JAVA3D学习系列(14)---初始观察位置的设定
汕头大学机电系 张杰(jzhang@mailserv.stu.edu.cn)
一. 初始观察位置的给定
前面我们介绍的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.hit.edu.cn.[FROM: 202.118.243.89]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.353毫秒