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

  • Post author:
  • Post category:java


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.0

    ,

    0.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(

    0

    ,

    0

    ,

    433

    ,

    458

    ));

  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(

    0

    ,

    0

    ,

    1

    / Math.tan(Math.PI /

    8

    ));

  126. // 观察者方向指向的点
  127. Point3d center =

    new

    Point3d(

    0

    ,

    0

    ,

    0

    );

  128. // 垂直于观察者方向向上的方向
  129. Vector3d vup =

    new

    Vector3d(

    0

    ,

    1

    ,

    0

    );

  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.0

    ,

    0.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. }