package test;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Color;
import javax.media.j3d.Appearance;
import javax.media.j3d.Background;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.DirectionalLight;
import javax.media.j3d.Material;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3f;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
import com.sun.j3d.utils.behaviors.mouse.MouseWheelZoom;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.geometry.Cylinder;
import com.sun.j3d.utils.universe.SimpleUniverse;
public class Drag extends Applet {
private SimpleUniverse universe;
public Drag() {
}
public void init() {
//创建画布
Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
setLayout(new BorderLayout());
add("Center", canvas);
//设置场景对象
BranchGroup scene = createScene();
//创建虚拟宇宙根据画布
SimpleUniverse u = new SimpleUniverse(canvas);
//设置观察者位置
u.getViewingPlatform().setNominalViewingTransform();
//添加之前创建的场景
u.addBranchGraph(scene);
}
public BranchGroup createScene() {
//创建分支组合,可看作是创建场景
BranchGroup scene = new BranchGroup();
//创建空间范围
BoundingSphere bounds = new BoundingSphere(new Point3d(), Double.MAX_VALUE);
//设置背景
Color3f bgColor = new Color3f(0.0f,0.0f,0.0f);//黑色或Color.black
Background bg =new Background(bgColor);
bg.setApplicationBounds(bounds);
scene.addChild(bg);
//光照
Color3f lightColor = new Color3f(Color.gray);
Vector3f lightDirection = new Vector3f(0f, 0f, -10f);
DirectionalLight light = new DirectionalLight(lightColor, lightDirection);
light.setInfluencingBounds(bounds);
scene.addChild(light);
//创建变换组合对象
TransformGroup transformGroup = null;
Transform3D obj3D = new Transform3D();
obj3D.setTranslation(new Vector3f(-0.6f, 0.0f, -0.6f));//设置位置
transformGroup= new TransformGroup(obj3D);
transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
// 设置对象呈现方式
Appearance app = new Appearance();
Material material = new Material();
material.setEmissiveColor(new Color3f(Color.blue));
app.setMaterial(material);
// 添加立方体根据上面的呈现方式//
transformGroup.addChild(new Box(0.2f, 0.2f, 0.2f, app));
// 创建鼠标旋转(左键)
MouseRotate mr = new MouseRotate();
mr.setTransformGroup(transformGroup);
transformGroup.addChild(mr);
mr.setSchedulingBounds(bounds);
// 创建鼠标滚轮绽放
MouseWheelZoom mwz = new MouseWheelZoom();
mwz.setTransformGroup(transformGroup);
transformGroup.addChild(mwz);
mwz.setSchedulingBounds(bounds);
// 创建鼠标平移(右键)
MouseTranslate mt = new MouseTranslate();
mt.setTransformGroup(transformGroup);
transformGroup.addChild(mt);
mt.setSchedulingBounds(bounds);
// 添加到场景中
scene.addChild(transformGroup);
// 在另一个位置添加圆柱体
obj3D.setTranslation(new Vector3f(0.6f, 0.0f, -0.6f));
transformGroup= new TransformGroup(obj3D);
transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
// 添加圆柱体依然根据之前的呈现方式
transformGroup.addChild(new Cylinder(0.2f, 0.50f,app));
// 创建鼠标旋转
mr = new MouseRotate();
mr.setTransformGroup(transformGroup);
transformGroup.addChild(mr);
mr.setSchedulingBounds(bounds);
// 创建鼠标按滚轮绽放
MouseZoom mz = new MouseZoom();
mz.setTransformGroup(transformGroup);
transformGroup.addChild(mz);
mz.setSchedulingBounds(bounds);
scene.addChild(transformGroup);
// 添加彩色立方体若需要可随意添加
// transformGroup.addChild(new ColorCube(0.2));
scene.compile();
return scene;
}
public static void main(String[] args) {
new MainFrame(new Drag(), 500, 500);
}
}
说明:当按下左键移动时,两个图形同时旋转,按下右键移动时,只有立方体随之移动,滚动滚轮缩放时只有立方体随之缩放,当按下滚轮移动时,只有圆柱体随之缩放。