📄 simplepick.java
字号:
//SimplePick.java
//演示如何使用点取技术
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.picking.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.awt.event.*;
import java.util.Enumeration;
public class SimplePick extends Applet {
// 创建外观
Appearance createAppearance() {
Appearance appear = new Appearance();
Material material = new Material();
appear.setMaterial(material);
return appear;
}
// 创建自己的回调类,用来改变灯的状态
public class MyCallbackClass extends Object implements PickingCallback{
DirectionalLight myLight;
boolean state;
public MyCallbackClass(DirectionalLight lightD){
this.myLight=lightD;
// 保存引用
this.state=false;
}
public void transformChanged(int type, TransformGroup tg) {
state=!state;
myLight.setEnable(state);
//改变该对象当前的状态
}
}
public BranchGroup createSceneGraph(Canvas3D canvas) {
BranchGroup objRoot = new BranchGroup();
// 创建根分支节点
TransformGroup objTG = null;
Transform3D transform = new Transform3D();
BoundingSphere bounds = new BoundingSphere();
//创建环境光
AmbientLight lightA = new AmbientLight();
lightA.setEnable(true);
lightA.setColor(new Color3f( 0.1f, 0.1f, 0.1f ));
lightA.setInfluencingBounds(bounds);
objRoot.addChild(lightA);
//创建平行光
DirectionalLight lightD = new DirectionalLight();
lightD.setDirection (new Vector3f(-1.0f,-1.0f,-1.0f));
lightD.setColor (new Color3f(0.0f,1.0f,1.0f));
lightD.setInfluencingBounds(bounds);
lightD.setCapability(DirectionalLight.ALLOW_STATE_WRITE );
lightD.setEnable(false);
// 允许该光源的状态动态改变
objRoot.addChild(lightD);
//创建点取旋转对象
PickRotateBehavior pickRotate = new PickRotateBehavior(objRoot, canvas, bounds);
objRoot.addChild(pickRotate);
//设置回调类
PickingCallback myCallback = new MyCallbackClass(lightD);
pickRotate.setupCallback(myCallback);
//创建点取平移对象
PickTranslateBehavior pickTranslate = new PickTranslateBehavior(objRoot, canvas, bounds);
objRoot.addChild(pickTranslate);
//创建点取缩放对象
PickZoomBehavior pickZoom = new PickZoomBehavior(objRoot, canvas, bounds);
objRoot.addChild(pickZoom);
// 分别创建三个支持点取的物体
transform.setTranslation(new Vector3f(-0.6f, 0.6f, -1.0f));
objTG = new TransformGroup(transform);
objTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
objTG.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
objTG.addChild(new ColorCube(0.3));
objRoot.addChild(objTG);
transform.setTranslation(new Vector3f(-0.6f, -0.6f, -1.0f));
objTG = new TransformGroup(transform);
objTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
objTG.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
objTG.addChild(new ColorCube(0.3));
objRoot.addChild(objTG);
transform.setTranslation(new Vector3f(0.6f, -0.6f, -1.0f));
objTG = new TransformGroup(transform);
objTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
objTG.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
objTG.addChild(new ColorCube(0.3));
objRoot.addChild(objTG);
// 创建一个不支持点取,但支持光照效果的物体
transform.setTranslation(new Vector3f( 0.6f, 0.6f, -1.0f));
objTG = new TransformGroup(transform);
Sphere ball=new Sphere(0.5f,Sphere.GENERATE_NORMALS,createAppearance());
objTG.addChild(ball);
objRoot.addChild(objTG);
objRoot.compile();
return objRoot;
}
public SimplePick() {
setLayout(new BorderLayout());
Canvas3D canvas3D = new Canvas3D(null);
add("Center", canvas3D);
SimpleUniverse simpleU = new SimpleUniverse(canvas3D);
BranchGroup scene = createSceneGraph(canvas3D);
simpleU.getViewingPlatform().setNominalViewingTransform();
simpleU.addBranchGraph(scene);
}
public static void main(String[] args) {
Frame frame = new MainFrame(new SimplePick(), 256, 256);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -