Java3D 3DS FileLoader包下载:http://sourceforge.net/projects/java3dsloader
- import com.microcrowd.loader.java3d.max3ds.Loader3DS;
- import com.sun.j3d.loaders.Scene;
- 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.universe.SimpleUniverse;
- import java.awt.Color;
- import java.io.FileNotFoundException;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import javax.media.j3d.Alpha;
- import javax.media.j3d.BoundingSphere;
- import javax.media.j3d.BranchGroup;
- import javax.media.j3d.DirectionalLight;
- import javax.media.j3d.Transform3D;
- import javax.media.j3d.TransformGroup;
- import javax.vecmath.Color3f;
- import javax.vecmath.Point3d;
- import javax.vecmath.Vector3f;
- /**
- *
- * @author hadeslee
- */
- public class Simple3DSLd {
- public Simple3DSLd() {
- build();
- }
- private void build() {
- try {
- BranchGroup bg = loadBranchGroup();
- SimpleUniverse u = new SimpleUniverse();
- u.getViewingPlatform().setNominalViewingTransform();
- u.addBranchGraph(bg);
- } catch (FileNotFoundException ex) {
- Logger.getLogger(Simple3DSLd.class.getName()).log(Level.SEVERE, null, ex);
- }
- }
- private BranchGroup loadBranchGroup() throws FileNotFoundException {
- Loader3DS l3ds = new Loader3DS();
- Scene scene = l3ds.load("K:/sample.3ds");
- System.out.println("scene=" + scene);
- if (scene != null) {
- BranchGroup objRoot = new BranchGroup();
- BranchGroup bg = scene.getSceneGroup();
- TransformGroup objTrans = new TransformGroup();
- Transform3D trans = new Transform3D();
- trans.setScale(0.3f);
- objTrans.setTransform(trans);
- objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
- objTrans.addChild(bg);
- objRoot.addChild(objTrans);
- BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0,
- 0.0), 100.0);
- MouseRotate behavior = new MouseRotate();
- behavior.setTransformGroup(objTrans);
- objTrans.addChild(behavior);
- behavior.setSchedulingBounds(bounds);
- MouseTranslate tr = new MouseTranslate();
- tr.setTransformGroup(objTrans);
- objTrans.addChild(tr);
- tr.setSchedulingBounds(bounds);
- MouseWheelZoom tr1 = new MouseWheelZoom();
- tr1.setTransformGroup(objTrans);
- objTrans.addChild(tr1);
- tr1.setSchedulingBounds(bounds);
- Color3f light1Color = new Color3f(Color.RED);
- Vector3f light1Direction = new Vector3f(0f, 0f, -10f);
- DirectionalLight light1 = new DirectionalLight(light1Color,
- light1Direction);
- light1.setInfluencingBounds(bounds);
- objRoot.addChild(light1);
- return objRoot;
- }
- return null;
- }
- public static void main(String[] args) {
- new Simple3DSLd();
- }
- }
或者Jframe中
- import java.awt.BorderLayout;
- import java.awt.Color;
- import java.awt.Frame;
- import java.awt.GraphicsConfiguration;
- import java.awt.GraphicsDevice;
- import java.awt.GraphicsEnvironment;
- import java.awt.Rectangle;
- import java.awt.event.WindowAdapter;
- import java.awt.event.WindowEvent;
- import javax.media.j3d.BoundingSphere;
- import javax.media.j3d.BranchGroup;
- import javax.media.j3d.Canvas3D;
- import javax.media.j3d.DirectionalLight;
- import javax.media.j3d.GraphicsConfigTemplate3D;
- import javax.media.j3d.Locale;
- import javax.media.j3d.PhysicalBody;
- import javax.media.j3d.PhysicalEnvironment;
- import javax.media.j3d.Transform3D;
- import javax.media.j3d.TransformGroup;
- import javax.media.j3d.View;
- import javax.media.j3d.ViewPlatform;
- import javax.media.j3d.VirtualUniverse;
- import javax.vecmath.Color3f;
- import javax.vecmath.Point3d;
- import javax.vecmath.Vector3d;
- import javax.vecmath.Vector3f;
- import com.microcrowd.loader.java3d.max3ds.Loader3DS;
- import com.sun.j3d.loaders.Scene;
- 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.universe.SimpleUniverse;
- /**
- * @author
- *
- */
- public class AWTFrameDSM {
- private static final long serialVersionUID = 1L;
- /**
- * 测试方法
- */
- public static void main(String[] args) {
- AWTFrameDSM appwin = new AWTFrameDSM();
- appwin.initialize();
- }
- /**
- * This is the default constructor
- */
- public AWTFrameDSM() {
- }
- /**
- * 初始化Frame主窗口
- *
- * @return void
- */
- private void initialize() {
- // 实例化GraphicsConfiguration的方法1
- GraphicsConfigTemplate3D template = new GraphicsConfigTemplate3D();
- GraphicsEnvironment env = GraphicsEnvironment
- .getLocalGraphicsEnvironment();
- GraphicsDevice device = env.getDefaultScreenDevice();
- GraphicsConfiguration config = device.getBestConfiguration(template);
- // 实例化GraphicsConfiguration的方法2
- // GraphicsConfiguration config =
- // SimpleUniverse.getPreferredConfiguration();
- // 新建Frame窗口对象
- Frame dsframe = new Frame(config);
- // 若Frame对象的布局方式为绝对布局null,就无法显示3D虚拟场景
- dsframe.setLayout(new BorderLayout());
- dsframe.setTitle("3DS模型显示区");
- dsframe.setBounds(new Rectangle(0, 0, 433, 458));
- // 添加窗口监听器实现关闭窗口(Frame),关闭窗口时退出程序
- dsframe.addWindowListener(new WindowAdapter() {
- public void windowClosing(WindowEvent ev) {
- System.out.print("退出程序!");
- System.exit(0);
- }
- });
- // 新建3D场景绘制画布Canvas3D对象
- Canvas3D cv = new Canvas3D(config);
- // add the canvas to this frame. Since this is the only thing added to
- // the main frame we don't care about layout managers etc.
- dsframe.add(cv, BorderLayout.CENTER);
- // 使Frame对象可视化
- dsframe.setVisible(true);
- // 在Canvas3D画布上绘制3D场景
- creat3DObject(cv);
- }
- /**
- * 创建3D虚拟场景
- */
- private void creat3DObject(Canvas3D cv) {
- // 创建超结构(create superstructure)
- VirtualUniverse vu = new VirtualUniverse();
- Locale loc = new Locale(vu);
- // 创建视图分支(create view branch)
- BranchGroup bgView = createViewBranch(cv);
- bgView.compile();
- loc.addBranchGraph(bgView);
- BranchGroup bg = loadBranchGroup();
- bg.compile();
- loc.addBranchGraph(bg);
- }
- /**
- * 生成BranchGroup的私有方法,创建视图分支
- *
- * @param cv
- * Canvas3D画布对象
- */
- private BranchGroup createViewBranch(Canvas3D cv) {
- // 创建View组件对象
- View view = new View();
- // 设置投影方式
- view.setProjectionPolicy(View.PERSPECTIVE_PROJECTION);
- // 创建ViewPlatform叶节点
- ViewPlatform vp = new ViewPlatform();
- view.addCanvas3D(cv);
- view.attachViewPlatform(vp);
- view.setPhysicalBody(new PhysicalBody());
- // 设置View对象属性
- view.setPhysicalEnvironment(new PhysicalEnvironment());
- // 几何变换
- Transform3D trans = new Transform3D();
- // 观察者眼睛的位置
- Point3d eye = new Point3d(0, 0, 1 / Math.tan(Math.PI / 8));
- // 观察者方向指向的点
- Point3d center = new Point3d(0, 0, 0);
- // 垂直于观察者方向向上的方向
- Vector3d vup = new Vector3d(0, 1, 0);
- // 生成几何变换矩阵
- trans.lookAt(eye, center, vup);
- // 求矩阵的逆
- trans.invert();
- // 几何变换组点
- TransformGroup tg = new TransformGroup(trans);
- tg.addChild(vp);
- // 创建视图分支
- BranchGroup bgView = new BranchGroup();
- bgView.addChild(tg);
- return bgView;
- }
- /**
- * 加载3DS文件的场景内容分支
- */
- private BranchGroup loadBranchGroup() {
- Loader3DS l3ds = new Loader3DS();
- // The Scene interface is a set of methods used to extract Java 3D scene
- // graph information from a file loader utility.
- // The interface is used to give loaders of various file formats a
- // common public interface.
- Scene scene = null;
- try {
- scene = l3ds.load("K:/opengheadok.3DS");
- System.out.println("文件读取成功");
- } catch (Exception fileio) {
- System.out.println("文件读取失败,请检查文件是否存在");
- }
- System.out.println("scene=" + scene);
- if (scene != null) {
- BranchGroup bg = scene.getSceneGroup();
- // 创建场景图分支
- BranchGroup objRoot = new BranchGroup();
- // 几何变换
- Transform3D trans = new Transform3D();
- trans.setScale(0.3f);// 缩放变换
- // 几何变换组节点
- TransformGroup objTrans = new TransformGroup();
- objTrans.setTransform(trans);
- objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
- objTrans.addChild(bg);
- objRoot.addChild(objTrans);
- // 球体作用范围边界对象
- BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0,
- 0.0), 100.0);
- // 添加通过鼠标左键控制3D物体旋转的对象
- MouseRotate behavior = new MouseRotate();
- behavior.setTransformGroup(objTrans);
- objTrans.addChild(behavior);
- behavior.setSchedulingBounds(bounds);
- // 添加鼠标右键的拖拉运动控制3D物体(X,Y)平移
- MouseTranslate tr = new MouseTranslate();
- tr.setTransformGroup(objTrans);
- objTrans.addChild(tr);
- tr.setSchedulingBounds(bounds);
- // 添加鼠标滚轮控制3D物体沿Z轴
- MouseWheelZoom tr1 = new MouseWheelZoom();
- tr1.setTransformGroup(objTrans);
- objTrans.addChild(tr1);
- tr1.setSchedulingBounds(bounds);
- // 设置光源
- Color3f light1Color = new Color3f(Color.gray);
- Vector3f light1Direction = new Vector3f(0f, 0f, -10f);
- DirectionalLight light1 = new DirectionalLight(light1Color,
- light1Direction);
- light1.setInfluencingBounds(bounds);
- objRoot.addChild(light1);
- return objRoot;
- }
- return null;
- }
- }