天天看点

java3d_Java3D应用实例-加载Obj 三维模型

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);

}

}