用Java3D 3DS FileLoader读取.3DS文件的方法

 

Java3D 3DS FileLoader包下载:http://sourceforge.net/projects/java3dsloader

 

 

  1. import com.microcrowd.loader.java3d.max3ds.Loader3DS;  
  2. import com.sun.j3d.loaders.Scene;  
  3. import com.sun.j3d.utils.behaviors.mouse.MouseRotate;  
  4. import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;  
  5. import com.sun.j3d.utils.behaviors.mouse.MouseWheelZoom;  
  6. import com.sun.j3d.utils.universe.SimpleUniverse;  
  7. import java.awt.Color;  
  8. import java.io.FileNotFoundException;  
  9. import java.util.logging.Level;  
  10. import java.util.logging.Logger;  
  11. import javax.media.j3d.Alpha;  
  12. import javax.media.j3d.BoundingSphere;  
  13. import javax.media.j3d.BranchGroup;  
  14. import javax.media.j3d.DirectionalLight;  
  15. import javax.media.j3d.Transform3D;  
  16. import javax.media.j3d.TransformGroup;  
  17. import javax.vecmath.Color3f;  
  18. import javax.vecmath.Point3d;  
  19. import javax.vecmath.Vector3f;  
  20. /** 
  21.  
  22. * @author hadeslee 
  23. */  
  24. public class Simple3DSLd {  
  25.     public Simple3DSLd() {  
  26.         build();  
  27.     }  
  28.     private void build() {  
  29.         try {  
  30.             BranchGroup bg = loadBranchGroup();  
  31.             SimpleUniverse u = new SimpleUniverse();  
  32.             u.getViewingPlatform().setNominalViewingTransform();  
  33.             u.addBranchGraph(bg);  
  34.         } catch (FileNotFoundException ex) {  
  35.             Logger.getLogger(Simple3DSLd.class.getName()).log(Level.SEVERE, null, ex);  
  36.         }  
  37.     }  
  38.     private BranchGroup loadBranchGroup() throws FileNotFoundException {  
  39.         Loader3DS l3ds = new Loader3DS();  
  40.         Scene scene = l3ds.load("K:/sample.3ds");  
  41.         System.out.println("scene=" + scene);  
  42.         if (scene != null) {  
  43.             BranchGroup objRoot = new BranchGroup();  
  44.             BranchGroup bg = scene.getSceneGroup();  
  45.             TransformGroup objTrans = new TransformGroup();  
  46.             Transform3D trans = new Transform3D();  
  47.             trans.setScale(0.3f);  
  48.             objTrans.setTransform(trans);  
  49.             objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);  
  50.             objTrans.addChild(bg);  
  51.             objRoot.addChild(objTrans);  
  52.             BoundingSphere bounds = new BoundingSphere(new Point3d(0.00.0,  
  53.                     0.0), 100.0);  
  54.             MouseRotate behavior = new MouseRotate();  
  55.             behavior.setTransformGroup(objTrans);  
  56.             objTrans.addChild(behavior);  
  57.             behavior.setSchedulingBounds(bounds);  
  58.             MouseTranslate tr = new MouseTranslate();  
  59.             tr.setTransformGroup(objTrans);  
  60.             objTrans.addChild(tr);  
  61.             tr.setSchedulingBounds(bounds);  
  62.             MouseWheelZoom tr1 = new MouseWheelZoom();  
  63.             tr1.setTransformGroup(objTrans);  
  64.             objTrans.addChild(tr1);  
  65.             tr1.setSchedulingBounds(bounds);  
  66.             Color3f light1Color = new Color3f(Color.RED);  
  67.             Vector3f light1Direction = new Vector3f(0f, 0f, -10f);  
  68.             DirectionalLight light1 = new DirectionalLight(light1Color,  
  69.                     light1Direction);  
  70.             light1.setInfluencingBounds(bounds);  
  71.             objRoot.addChild(light1);  
  72.             return objRoot;  
  73.         }  
  74.         return null;  
  75.     }  
  76.     public static void main(String[] args) {  
  77.         new Simple3DSLd();  
  78.     }  
  79. }  

 

或者Jframe中

  1. import java.awt.BorderLayout;  
  2. import java.awt.Color;  
  3. import java.awt.Frame;  
  4. import java.awt.GraphicsConfiguration;  
  5. import java.awt.GraphicsDevice;  
  6. import java.awt.GraphicsEnvironment;  
  7. import java.awt.Rectangle;  
  8. import java.awt.event.WindowAdapter;  
  9. import java.awt.event.WindowEvent;  
  10. import javax.media.j3d.BoundingSphere;  
  11. import javax.media.j3d.BranchGroup;  
  12. import javax.media.j3d.Canvas3D;  
  13. import javax.media.j3d.DirectionalLight;  
  14. import javax.media.j3d.GraphicsConfigTemplate3D;  
  15. import javax.media.j3d.Locale;  
  16. import javax.media.j3d.PhysicalBody;  
  17. import javax.media.j3d.PhysicalEnvironment;  
  18. import javax.media.j3d.Transform3D;  
  19. import javax.media.j3d.TransformGroup;  
  20. import javax.media.j3d.View;  
  21. import javax.media.j3d.ViewPlatform;  
  22. import javax.media.j3d.VirtualUniverse;  
  23. import javax.vecmath.Color3f;  
  24. import javax.vecmath.Point3d;  
  25. import javax.vecmath.Vector3d;  
  26. import javax.vecmath.Vector3f;  
  27. import com.microcrowd.loader.java3d.max3ds.Loader3DS;  
  28. import com.sun.j3d.loaders.Scene;  
  29. import com.sun.j3d.utils.behaviors.mouse.MouseRotate;  
  30. import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;  
  31. import com.sun.j3d.utils.behaviors.mouse.MouseWheelZoom;  
  32. // import com.sun.j3d.utils.universe.SimpleUniverse;   
  33. /** 
  34. * @author  
  35.  
  36. */  
  37. public class AWTFrameDSM {  
  38.     private static final long serialVersionUID = 1L;  
  39.     /** 
  40.     * 测试方法 
  41.     */  
  42.     public static void main(String[] args) {  
  43.         AWTFrameDSM appwin = new AWTFrameDSM();  
  44.         appwin.initialize();  
  45.     }  
  46.     /** 
  47.     * This is the default constructor 
  48.     */  
  49.     public AWTFrameDSM() {  
  50.     }  
  51.     /** 
  52.     * 初始化Frame主窗口 
  53.     *  
  54.     * @return void 
  55.     */  
  56.     private void initialize() {  
  57.         // 实例化GraphicsConfiguration的方法1   
  58.         GraphicsConfigTemplate3D template = new GraphicsConfigTemplate3D();  
  59.         GraphicsEnvironment env = GraphicsEnvironment  
  60.                 .getLocalGraphicsEnvironment();  
  61.         GraphicsDevice device = env.getDefaultScreenDevice();  
  62.         GraphicsConfiguration config = device.getBestConfiguration(template);  
  63.         // 实例化GraphicsConfiguration的方法2   
  64.         // GraphicsConfiguration config =   
  65.         // SimpleUniverse.getPreferredConfiguration();   
  66.         // 新建Frame窗口对象   
  67.         Frame dsframe = new Frame(config);  
  68.         // 若Frame对象的布局方式为绝对布局null,就无法显示3D虚拟场景   
  69.         dsframe.setLayout(new BorderLayout());  
  70.         dsframe.setTitle("3DS模型显示区");  
  71.         dsframe.setBounds(new Rectangle(00433458));  
  72.         // 添加窗口监听器实现关闭窗口(Frame),关闭窗口时退出程序   
  73.         dsframe.addWindowListener(new WindowAdapter() {  
  74.             public void windowClosing(WindowEvent ev) {  
  75.                 System.out.print("退出程序!");  
  76.                 System.exit(0);  
  77.             }  
  78.         });  
  79.         // 新建3D场景绘制画布Canvas3D对象   
  80.         Canvas3D cv = new Canvas3D(config);  
  81.         // add the canvas to this frame. Since this is the only thing added to   
  82.         // the main frame we don't care about layout managers etc.   
  83.         dsframe.add(cv, BorderLayout.CENTER);  
  84.         // 使Frame对象可视化   
  85.         dsframe.setVisible(true);  
  86.         // 在Canvas3D画布上绘制3D场景   
  87.         creat3DObject(cv);  
  88.     }  
  89.     /** 
  90.     * 创建3D虚拟场景 
  91.     */  
  92.     private void creat3DObject(Canvas3D cv) {  
  93.         // 创建超结构(create superstructure)   
  94.         VirtualUniverse vu = new VirtualUniverse();  
  95.         Locale loc = new Locale(vu);  
  96.         // 创建视图分支(create view branch)   
  97.         BranchGroup bgView = createViewBranch(cv);  
  98.         bgView.compile();  
  99.         loc.addBranchGraph(bgView);  
  100.         BranchGroup bg = loadBranchGroup();  
  101.         bg.compile();  
  102.         loc.addBranchGraph(bg);  
  103.     }  
  104.     /** 
  105.     * 生成BranchGroup的私有方法,创建视图分支 
  106.     *  
  107.     * @param cv 
  108.     *            Canvas3D画布对象 
  109.     */  
  110.     private BranchGroup createViewBranch(Canvas3D cv) {  
  111.         // 创建View组件对象   
  112.         View view = new View();  
  113.         // 设置投影方式   
  114.         view.setProjectionPolicy(View.PERSPECTIVE_PROJECTION);  
  115.         // 创建ViewPlatform叶节点   
  116.         ViewPlatform vp = new ViewPlatform();  
  117.         view.addCanvas3D(cv);  
  118.         view.attachViewPlatform(vp);  
  119.         view.setPhysicalBody(new PhysicalBody());  
  120.         // 设置View对象属性   
  121.         view.setPhysicalEnvironment(new PhysicalEnvironment());  
  122.         // 几何变换   
  123.         Transform3D trans = new Transform3D();  
  124.         // 观察者眼睛的位置   
  125.         Point3d eye = new Point3d(001 / Math.tan(Math.PI / 8));  
  126.         // 观察者方向指向的点   
  127.         Point3d center = new Point3d(000);  
  128.         // 垂直于观察者方向向上的方向   
  129.         Vector3d vup = new Vector3d(010);  
  130.         // 生成几何变换矩阵   
  131.         trans.lookAt(eye, center, vup);  
  132.         // 求矩阵的逆   
  133.         trans.invert();  
  134.         // 几何变换组点   
  135.         TransformGroup tg = new TransformGroup(trans);  
  136.         tg.addChild(vp);  
  137.         // 创建视图分支   
  138.         BranchGroup bgView = new BranchGroup();  
  139.         bgView.addChild(tg);  
  140.         return bgView;  
  141.     }  
  142.     /** 
  143.     * 加载3DS文件的场景内容分支 
  144.     */  
  145.     private BranchGroup loadBranchGroup() {  
  146.         Loader3DS l3ds = new Loader3DS();  
  147.         // The Scene interface is a set of methods used to extract Java 3D scene   
  148.         // graph information from a file loader utility.   
  149.         // The interface is used to give loaders of various file formats a   
  150.         // common public interface.   
  151.         Scene scene = null;  
  152.         try {  
  153.             scene = l3ds.load("K:/opengheadok.3DS");  
  154.             System.out.println("文件读取成功");  
  155.         } catch (Exception fileio) {  
  156.             System.out.println("文件读取失败,请检查文件是否存在");  
  157.         }  
  158.         System.out.println("scene=" + scene);  
  159.         if (scene != null) {  
  160.             BranchGroup bg = scene.getSceneGroup();  
  161.             // 创建场景图分支   
  162.             BranchGroup objRoot = new BranchGroup();  
  163.             // 几何变换   
  164.             Transform3D trans = new Transform3D();  
  165.             trans.setScale(0.3f);// 缩放变换   
  166.             // 几何变换组节点   
  167.             TransformGroup objTrans = new TransformGroup();  
  168.             objTrans.setTransform(trans);  
  169.             objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);  
  170.             objTrans.addChild(bg);  
  171.             objRoot.addChild(objTrans);  
  172.             // 球体作用范围边界对象   
  173.             BoundingSphere bounds = new BoundingSphere(new Point3d(0.00.0,  
  174.                     0.0), 100.0);  
  175.             // 添加通过鼠标左键控制3D物体旋转的对象   
  176.             MouseRotate behavior = new MouseRotate();  
  177.             behavior.setTransformGroup(objTrans);  
  178.             objTrans.addChild(behavior);  
  179.             behavior.setSchedulingBounds(bounds);  
  180.             // 添加鼠标右键的拖拉运动控制3D物体(X,Y)平移   
  181.             MouseTranslate tr = new MouseTranslate();  
  182.             tr.setTransformGroup(objTrans);  
  183.             objTrans.addChild(tr);  
  184.             tr.setSchedulingBounds(bounds);  
  185.             // 添加鼠标滚轮控制3D物体沿Z轴   
  186.             MouseWheelZoom tr1 = new MouseWheelZoom();  
  187.             tr1.setTransformGroup(objTrans);  
  188.             objTrans.addChild(tr1);  
  189.             tr1.setSchedulingBounds(bounds);  
  190.             // 设置光源   
  191.             Color3f light1Color = new Color3f(Color.gray);  
  192.             Vector3f light1Direction = new Vector3f(0f, 0f, -10f);  
  193.             DirectionalLight light1 = new DirectionalLight(light1Color,  
  194.                     light1Direction);  
  195.             light1.setInfluencingBounds(bounds);  
  196.             objRoot.addChild(light1);  
  197.             return objRoot;  
  198.         }  
  199.         return null;  
  200.     }  
  201. }  

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值