packagecom.zzl.j3d.viewer;importjava.applet.Applet;importjava.awt.BorderLayout;importjava.awt.GraphicsConfiguration;importjava.net.URL;importjavax.media.j3d.Appearance;importjavax.media.j3d.BoundingSphere;importjavax.media.j3d.BranchGroup;importjavax.media.j3d.Canvas3D;importjavax.media.j3d.Group;importjavax.media.j3d.Texture;importjavax.media.j3d.TextureAttributes;importjavax.media.j3d.Transform3D;importjavax.media.j3d.TransformGroup;importjavax.vecmath.Point3d;importjavax.vecmath.Vector3d;importjavax.vecmath.Vector3f;importcom.sun.j3d.loaders.Scene;importcom.sun.j3d.utils.applet.MainFrame;importcom.sun.j3d.utils.behaviors.vp.OrbitBehavior;importcom.sun.j3d.utils.geometry.Box;importcom.sun.j3d.utils.geometry.Primitive;importcom.sun.j3d.utils.image.TextureLoader;importcom.sun.j3d.utils.universe.SimpleUniverse;importcom.sun.j3d.utils.universe.ViewingPlatform;importcom.zzl.j3d.loader.J3DLoader;publicclassMainextendsApplet{privateSimpleUniverse universe ;privateCanvas3D canvas;privateBoundingSphere bounds=newBoundingSphere(newPoint3d(0.0,0.0,0.0),1000.0);
TransformGroup objTransG=null;publicvoidMain()
{}publicvoidsetupView()
{/**Add some view related things to view branch side of scene graph*///add mouse interaction to the ViewingPlatformOrbitBehavior orbit=newOrbitBehavior(canvas, OrbitBehavior.REVERSE_ALL|OrbitBehavior.STOP_ZOOM);
orbit.setSchedulingBounds(bounds);
ViewingPlatform viewingPlatform=universe.getViewingPlatform();//This will move the ViewPlatform back a bit so the//objects in the scene can be viewed.viewingPlatform.setNominalViewingTransform();
viewingPlatform.setViewPlatformBehavior(orbit);
}publicvoidinit()
{
setLayout(newBorderLayout());
GraphicsConfiguration gc=SimpleUniverse.getPreferredConfiguration();
canvas=newCanvas3D(gc);
add("Center",canvas);//Create a simple scene and attach it to the virtual universeuniverse=newSimpleUniverse(canvas);//定义观察点,可用鼠标进行缩放、旋转setupView();
J3DLoader loader=newJ3DLoader();//定义场景的根结点BranchGroup objRoot=newBranchGroup();//载入人物模型Scene scene=loader.loadObj("Liit.obj");//定义载入位置Transform3D pos1=newTransform3D();
pos1.setTranslation(newVector3f(0f,0.0f,0f));//因为此处所采用的模型载入时是平行于y=0面的,所以要绕x轴旋转90度pos1.rotX(-1.57);
objTransG=newTransformGroup();
objTransG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objTransG.setTransform(pos1);
objTransG.addChild(scene.getSceneGroup());
objRoot.addChild(objTransG);//载入纹理URL texImage=loader.loadTexture("resource/flooring.jpg");//画了一个大矩形,作为地板Group group=this.createSceneBackGround(texImage);
objRoot.addChild(group);
universe.addBranchGraph(objRoot);
}publicvoiddestroy()
{
universe.removeAllLocales();
}/***@paramargs*/publicstaticvoidmain(String[] args) {newMainFrame(newMain(),256,256);
}publicGroup createSceneBackGround(URL texImage)
{returncreateGeometry(Texture.MULTI_LEVEL_POINT ,-1.1f, texImage);
}publicGroup createGeometry(intfilter,floaty, URL texImage)
{
Group topNode=newGroup();
Appearance appearance=newAppearance();
TextureLoader tex=newTextureLoader(texImage, TextureLoader.GENERATE_MIPMAP ,this);
Texture texture=tex.getTexture();
texture.setMinFilter(filter);
appearance.setTexture(texture);
TextureAttributes texAttr=newTextureAttributes();
texAttr.setTextureMode(TextureAttributes.MODULATE);
appearance.setTextureAttributes(texAttr);//TODO lightTransform3D pos2=newTransform3D();
pos2.setTranslation(newVector3f(0f,y,0f));
objTransG=newTransformGroup();
objTransG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objTransG.setTransform(pos2);
Box box=newBox(6f,0.1f,8f,Primitive.GENERATE_NORMALS|Primitive.GENERATE_TEXTURE_COORDS,appearance);
objTransG.addChild(box);
topNode.addChild(objTransG);returntopNode;
}
}