Java3D實例應用-載入3ds 模型


3ds3dsmax建模軟件的衍生文件格式,做完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加載外部模型

View Code
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加載外部模型

View Code
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]

在線交談

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM