3ds是3dsmax建模軟件的衍生文件格式,做完max場景文件后可導出生3ds格式,可與其它建模軟件兼容,也可用於渲染.
相關文檔
Java3D 創建三維幾何模型:[ http://www.cnblogs.com/dennisit/archive/2013/05/06/3063042.html ]
Java3D 加載外部Obj模型:[ http://www.cnblogs.com/dennisit/archive/2013/05/07/3065126.html ]
3ds模型加載時用到第三方jar包 Java3dloader包
Java3dloader包下載地址: http://sourceforge.net/projects/java3dsloader/
實例一: 加載3ds文件到場景
效果圖如下:
讀取3ds模型加載到場景
package com.java3d.dennist.loader; import javax.media.j3d.BranchGroup; import com.microcrowd.loader.java3d.max3ds.Loader3DS; import com.sun.j3d.loaders.Scene; /** * * * @version : 1.1 * * @author : 蘇若年 <a href="mailto:DennisIT@163.com">發送郵件</a> * * @since : 1.0 創建時間: 2013-5-7 下午02:44:02 * * TODO : * */ public class ThreeDSFileReader extends BranchGroup{ /** * * 讀取ObjModel文件 * * @param filePath 3ds文件路徑 * */ public ThreeDSFileReader(String filePath){ BranchGroup branchGroup = new BranchGroup(); Loader3DS l3ds = new Loader3DS(); Scene scene = null; try { scene = l3ds.load(filePath); } catch (Exception e) { e.printStackTrace(); System.out.println("3DS模型加載失敗" + e.getMessage()); } branchGroup.addChild(scene.getSceneGroup()); this.addChild(branchGroup); } }
加載模型到場景
package com.java3d.dennist.loader; import java.applet.Applet; import java.awt.BorderLayout; import javax.media.j3d.Alpha; import javax.media.j3d.Background; import javax.media.j3d.BoundingSphere; import javax.media.j3d.BranchGroup; import javax.media.j3d.Canvas3D; import javax.media.j3d.DirectionalLight; import javax.media.j3d.RotationInterpolator; import javax.media.j3d.Transform3D; import javax.media.j3d.TransformGroup; import javax.vecmath.Color3f; import javax.vecmath.Point3d; import javax.vecmath.Vector3d; import javax.vecmath.Vector3f; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.universe.SimpleUniverse; import com.sun.j3d.utils.universe.ViewingPlatform; /** * * com.java3d.dennist.loaderJavaModel3dsLoaderApp.java * * @version : 1.1 * * @author : 蘇若年 <a href="mailto:DennisIT@163.com">發送郵件</a> * * @since : 1.0 創建時間: 2013-5-7 下午02:57:32 * * TODO : * */ public class JavaModel3dsLoaderApp extends Applet{ public BranchGroup createSceneGraph(){ // 創建場景圖分支 BranchGroup group = new BranchGroup(); // 幾何變換組節點 TransformGroup transGroup = new TransformGroup(); // 幾何變換 Transform3D trans3d = new Transform3D(); // 縮放變換 trans3d.setScale(0.7); //將幾何變換節點對象添加到節點組 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 = new Background(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 = new DirectionalLight(lightColor, lightDirection); light.setInfluencingBounds(bound); //將光源添加到場景 group.addChild(light); //幾何變換組節點 - 加載外部模型 TransformGroup objTrans = new TransformGroup(); objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); //加載Obj格式的模型文件 objTrans.addChild(new ThreeDSFileReader("F:/rexue.3ds")); //將模型添加到變換組節點 transGroup.addChild(objTrans); //設置幾何變化,繞Y軸中心旋轉 Transform3D yAxis = new Transform3D(); Alpha rotationAlpha = new Alpha(-1,Alpha.INCREASING_ENABLE, 0,0, 6000,0,0, 0,0,0); RotationInterpolator rotator = new RotationInterpolator(rotationAlpha, objTrans,yAxis,0.0f,(float)Math.PI*2.0f); rotator.setSchedulingBounds(bound); objTrans.addChild(rotator); group.compile(); return group; } public JavaModel3dsLoaderApp(){ setLayout(new BorderLayout()); // 創建3D場景繪制畫布Canvas3D對象 Canvas3D canvas = new Canvas3D(null); add("Center",canvas); BranchGroup scene = createSceneGraph(); SimpleUniverse universe = new SimpleUniverse(canvas); //設定用戶視角 Point3d userPosition = new Point3d(0,18,18); initUserPosition(universe,userPosition); //universe.getViewingPlatform().setNominalViewingTransform(); universe.addBranchGraph(scene); } //初始化用戶視角 private void initUserPosition(SimpleUniverse universe,Point3d userPosition){ ViewingPlatform vp = universe.getViewingPlatform(); TransformGroup steerTG = vp.getViewPlatformTransform(); Transform3D t3d = new Transform3D(); steerTG.getTransform(t3d); t3d.lookAt(userPosition, new Point3d(0,0,0), new Vector3d(0,1,0)); t3d.invert(); steerTG.setTransform(t3d); } public static void main(String[] args) { new MainFrame(new JavaModel3dsLoaderApp(), 340,340); } }
上面實例實現的效果是,模型繞Y軸旋轉,下面實例中我們實現鼠標觸控模型三維空間任意旋轉變換.
實例二 : 實現鼠標觸控模型三維空間任意旋轉
效果圖:
實例代碼:
package com.java3d.dennist.loader; import java.applet.Applet; import java.awt.BorderLayout; import javax.media.j3d.Alpha; import javax.media.j3d.Background; import javax.media.j3d.BoundingSphere; import javax.media.j3d.BranchGroup; import javax.media.j3d.Canvas3D; import javax.media.j3d.DirectionalLight; import javax.media.j3d.RotationInterpolator; import javax.media.j3d.Transform3D; import javax.media.j3d.TransformGroup; import javax.vecmath.Color3f; import javax.vecmath.Point3d; import javax.vecmath.Vector3d; import javax.vecmath.Vector3f; import com.sun.j3d.utils.applet.MainFrame; 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 com.sun.j3d.utils.universe.ViewingPlatform; /** * * com.java3d.dennist.loaderJavaModel3dsLoaderApp.java * * @version : 1.1 * * @author : 蘇若年 <a href="mailto:DennisIT@163.com">發送郵件</a> * * @since : 1.0 創建時間: 2013-5-7 下午02:57:32 * * TODO : * */ public class JavaModel3dsLoaderApp extends Applet{ public BranchGroup createSceneGraph(){ // 創建場景圖分支 BranchGroup group = new BranchGroup(); // 幾何變換組節點 TransformGroup transGroup = new TransformGroup(); // 幾何變換 Transform3D trans3d = new Transform3D(); // 縮放變換 trans3d.setScale(0.9); //將幾何變換節點對象添加到節點組 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 = new Background(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 = new DirectionalLight(lightColor, lightDirection); light.setInfluencingBounds(bound); //將光源添加到場景 group.addChild(light); //幾何變換組節點 - 加載外部模型 TransformGroup objTrans = new TransformGroup(); objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); //加載Obj格式的模型文件 objTrans.addChild(new ThreeDSFileReader("F:/rexue.3ds")); //將模型添加到變換組節點 transGroup.addChild(objTrans); // 添加通過鼠標左鍵控制3D物體旋轉的對象 MouseRotate behavior = new MouseRotate(); behavior.setTransformGroup(objTrans); objTrans.addChild(behavior); behavior.setSchedulingBounds(bound); // 添加鼠標右鍵的拖拉運動控制3D物體(X,Y)平移 MouseTranslate tr = new MouseTranslate(); tr.setTransformGroup(objTrans); objTrans.addChild(tr); tr.setSchedulingBounds(bound); // 添加鼠標滾輪控制3D物體沿Z軸 MouseWheelZoom tr1 = new MouseWheelZoom(); tr1.setTransformGroup(objTrans); objTrans.addChild(tr1); tr1.setSchedulingBounds(bound); group.compile(); return group; } public JavaModel3dsLoaderApp(){ setLayout(new BorderLayout()); // 創建3D場景繪制畫布Canvas3D對象 Canvas3D canvas = new Canvas3D(null); add("Center",canvas); BranchGroup scene = createSceneGraph(); SimpleUniverse universe = new SimpleUniverse(canvas); //設定用戶視角 Point3d userPosition = new Point3d(0,10,18); initUserPosition(universe,userPosition); //universe.getViewingPlatform().setNominalViewingTransform(); universe.addBranchGraph(scene); } //初始化用戶視角 private void initUserPosition(SimpleUniverse universe,Point3d userPosition){ ViewingPlatform vp = universe.getViewingPlatform(); TransformGroup steerTG = vp.getViewPlatformTransform(); Transform3D t3d = new Transform3D(); steerTG.getTransform(t3d); t3d.lookAt(userPosition, new Point3d(0,0,0), new Vector3d(0,1,0)); t3d.invert(); steerTG.setTransform(t3d); } public static void main(String[] args) { new MainFrame(new JavaModel3dsLoaderApp(), 340,340); } }
附錄:
附錄一: 不依賴Applet實現Java3D加載外部模型

package com.java3d.dennist.study; import com.java3d.dennist.loader.ThreeDSFileReader; 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 javax.media.j3d.Background; 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; /** * * * @version : 1.1 * * @author : 蘇若年 <a href="mailto:DennisIT@163.com">發送郵件</a> * * @since : 1.0 創建時間: 2013-5-6 下午04:54:04 * * TODO : Java3D技術 加載3ds模型 * */ public class Java3dsLoader { public Java3dsLoader(){ build(); } private void build() { try { BranchGroup bg = createSceneGraph(); SimpleUniverse u = new SimpleUniverse(); u.getViewingPlatform().setNominalViewingTransform(); u.addBranchGraph(bg); } catch (Exception e) { e.printStackTrace(); } } public BranchGroup createSceneGraph(){ // 創建場景圖分支 BranchGroup group = new BranchGroup(); // 幾何變換組節點 TransformGroup transGroup = new TransformGroup(); // 幾何變換 Transform3D trans3d = new Transform3D(); // 縮放變換 trans3d.setScale(0.7); //將幾何變換節點對象添加到節點組 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 = new Background(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 = new DirectionalLight(lightColor, lightDirection); light.setInfluencingBounds(bound); //將光源添加到場景 group.addChild(light); //幾何變換組節點 - 加載外部模型 TransformGroup objTrans = new TransformGroup(); objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); //加載Obj格式的模型文件 objTrans.addChild(new ThreeDSFileReader("F:/rexue.3ds")); //將模型添加到變換組節點 transGroup.addChild(objTrans); // 添加通過鼠標左鍵控制3D物體旋轉的對象 MouseRotate behavior = new MouseRotate(); behavior.setTransformGroup(objTrans); objTrans.addChild(behavior); behavior.setSchedulingBounds(bound); // 添加鼠標右鍵的拖拉運動控制3D物體(X,Y)平移 MouseTranslate tr = new MouseTranslate(); tr.setTransformGroup(objTrans); objTrans.addChild(tr); tr.setSchedulingBounds(bound); // 添加鼠標滾輪控制3D物體沿Z軸 MouseWheelZoom tr1 = new MouseWheelZoom(); tr1.setTransformGroup(objTrans); objTrans.addChild(tr1); tr1.setSchedulingBounds(bound); group.compile(); return group; } public static void main(String[] args) { new Java3dsLoader(); } }
附錄二: 基於swing實現Java3D加載外部模型

package com.java3d.dennist.study; 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.Background; 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.java3d.dennist.loader.ThreeDSFileReader; 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; /** * * @version : 1.1 * * @author : 蘇若年 <a href="mailto:DennisIT@163.com">發送郵件</a> * * @since : 1.0 創建時間: 2013-5-6 下午05:09:47 * * TODO : 基於Swing實現Java3D 模型加載 * */ public class JFrame3dsLoader { private static final long serialVersionUID = 1L; /** * 測試方法 */ public static void main(String[] args) { JFrame3dsLoader appwin = new JFrame3dsLoader(); appwin.initialize(); } /** * This is the default constructor */ public JFrame3dsLoader() { } /** * 初始化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); // 新建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); 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 = createSceneGraph(); 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; } public BranchGroup createSceneGraph(){ // 創建場景圖分支 BranchGroup group = new BranchGroup(); // 幾何變換組節點 TransformGroup transGroup = new TransformGroup(); // 幾何變換 Transform3D trans3d = new Transform3D(); // 縮放變換 trans3d.setScale(0.7); //將幾何變換節點對象添加到節點組 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 = new Background(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 = new DirectionalLight(lightColor, lightDirection); light.setInfluencingBounds(bound); //將光源添加到場景 group.addChild(light); //幾何變換組節點 - 加載外部模型 TransformGroup objTrans = new TransformGroup(); objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); //加載Obj格式的模型文件 objTrans.addChild(new ThreeDSFileReader("F:/rexue.3ds")); //將模型添加到變換組節點 transGroup.addChild(objTrans); // 添加通過鼠標左鍵控制3D物體旋轉的對象 MouseRotate behavior = new MouseRotate(); behavior.setTransformGroup(objTrans); objTrans.addChild(behavior); behavior.setSchedulingBounds(bound); // 添加鼠標右鍵的拖拉運動控制3D物體(X,Y)平移 MouseTranslate tr = new MouseTranslate(); tr.setTransformGroup(objTrans); objTrans.addChild(tr); tr.setSchedulingBounds(bound); // 添加鼠標滾輪控制3D物體沿Z軸 MouseWheelZoom tr1 = new MouseWheelZoom(); tr1.setTransformGroup(objTrans); objTrans.addChild(tr1); tr1.setSchedulingBounds(bound); group.compile(); return group; } }
轉載請注明出處:[http://www.cnblogs.com/dennisit/archive/2013/05/07/3065479.html]