packagecom.java3d.dennist.loader;importjava.applet.Applet;importjava.awt.BorderLayout;importjavax.media.j3d.Alpha;importjavax.media.j3d.Background;importjavax.media.j3d.BoundingSphere;importjavax.media.j3d.BranchGroup;importjavax.media.j3d.Canvas3D;importjavax.media.j3d.DirectionalLight;importjavax.media.j3d.Group;importjavax.media.j3d.RotationInterpolator;importjavax.media.j3d.Transform3D;importjavax.media.j3d.TransformGroup;importjavax.vecmath.Color3f;importjavax.vecmath.Point3d;importjavax.vecmath.Vector3d;importjavax.vecmath.Vector3f;importcom.sun.j3d.utils.applet.MainFrame;importcom.sun.j3d.utils.universe.SimpleUniverse;importcom.sun.j3d.utils.universe.ViewingPlatform;
public class JavaModelObjMultiLoaderApp extendsApplet{
private static final long serialVersionUID = 3645520149291184985L;publicBranchGroup createSceneGraph(){//建立場景圖分支
BranchGroup group = newBranchGroup();//幾何變換組節點
TransformGroup transGroup = newTransformGroup();//幾何變換
Transform3D trans3d = newTransform3D();//縮放變換
trans3d.setScale(0.8);//将幾何變換節點對象添加到節點組
transGroup.setTransform(trans3d);//将幾何變化組添加到場景
group.addChild(transGroup);//球體作用範圍邊界對象
BoundingSphere bound= new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
Color3f bgColor= new Color3f(0.05f,0.05f,0.2f);
Background bg= newBackground(bgColor);
bg.setApplicationBounds(bound);
group.addChild(bg);//設定光源
Color3f lightColor = new Color3f(1.0f,1.0f,0.9f);
Vector3f lightDirection= new Vector3f(4.0f,-7.0f,-12.0f);//設定定向光的顔色和影響範圍
DirectionalLight light = newDirectionalLight(lightColor, lightDirection);
light.setInfluencingBounds(bound);//将光源添加到場景
group.addChild(light);
BranchGroup branchGroup1= new ObjFileReader("F:/guanyu.obj");
BranchGroup branchGroup2= new ObjFileReader("F:/guanyu.obj");
group.addChild(createObject(branchGroup1,bound,-1.3f, 0.0f, 0.0f,3000));
group.addChild(createObject(branchGroup2,bound,1.3f, 0.0f, 0.0f ,4000));
group.compile();returngroup;
}
private Group createObject(BranchGroup group,BoundingSphere bound, float xpos, float ypos,float zpos, inttime){
Transform3D trans3d= newTransform3D();
trans3d.setTranslation(newVector3f(xpos, ypos, zpos));
TransformGroup objTrans= newTransformGroup(trans3d);
TransformGroup sgroup= newTransformGroup();
sgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
sgroup.addChild(group);//設定幾何變化,繞Y軸中心旋轉
Transform3D yAxis = newTransform3D();
Alpha rotationAlpha= new Alpha(-1,Alpha.INCREASING_ENABLE,0,0,
time,0,0,0,0,0);
RotationInterpolator rotator= new RotationInterpolator(rotationAlpha, sgroup,yAxis,0.0f,(float)Math.PI*2.0f);
rotator.setSchedulingBounds(bound);
objTrans.addChild(rotator);
objTrans.addChild(sgroup);returnobjTrans;
}publicJavaModelObjMultiLoaderApp(){
setLayout(newBorderLayout());//建立3D場景繪制畫布Canvas3D對象
Canvas3D canvas = new Canvas3D(null);
add("Center",canvas);
BranchGroup scene=createSceneGraph();
SimpleUniverse universe= newSimpleUniverse(canvas);//設定使用者視角
Point3d userPosition = new Point3d(0,3,6);
initUserPosition(universe,userPosition);//universe.getViewingPlatform().setNominalViewingTransform();
universe.addBranchGraph(scene);
}//初始化使用者視角
private voidinitUserPosition(SimpleUniverse universe,Point3d userPosition){
ViewingPlatform vp=universe.getViewingPlatform();
TransformGroup steerTG=vp.getViewPlatformTransform();
Transform3D t3d= newTransform3D();
steerTG.getTransform(t3d);
t3d.lookAt(userPosition,new Point3d(0,0,0), new Vector3d(0,1,0));
t3d.invert();
steerTG.setTransform(t3d);
}public static voidmain(String[] args) {new MainFrame(new JavaModelObjMultiLoaderApp(), 350,210);
}
}