千里冰封
JAVA 浓香四溢
posts - 151,comments - 2801,trackbacks - 0
在SUN的J3D里面并没有提供对3DS格式的文件的导入。但是3DS格式的文件又很常见。为此,我们需要借用第三方的工具,来把3DS里面的模型导入到程序中。
我们用的是Loader3ds这个工具,可以点击这里下载

我们还是看一个简单的例子吧

/*
 * Test2.java
 *
 * Created on 2007-10-4, 15:28:14
 *
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 
*/

package test1;

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 Test2 {

    
public Test2() {
        build();
    }

    
private void build() {
        
try {
            BranchGroup bg 
= loadBranchGroup();
            SimpleUniverse u 
= new SimpleUniverse();
            u.getViewingPlatform().setNominalViewingTransform();
            u.addBranchGraph(bg);
        } 
catch (FileNotFoundException ex) {
            Logger.getLogger(Test2.
class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    
private BranchGroup loadBranchGroup() throws FileNotFoundException {
        Loader3DS dd 
= new Loader3DS();
        Scene scene 
= dd.load("01.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.00.00.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 Test2();
    }
}

我们从一个3DS文件里面导出了一个场景 ,当然也可以导出更多其它的东西。01.3ds大家可以替换成自己的文件,还有一点要注意的就是,因为3Ds MAX的一些设置和J3D里面不一定一样,所以你导入进来以后,可能会什么都看不到,所以最好是设置为鼠标可以控制大小和位置的,这样就可以自己去找到我们导入的模型,然后根据我们找到的位置,在程序里面再给它定好位。
还有可以导入其它格式的第三方的库,大家都可以去研究一下,以丰富J3D的素材。





尽管千里冰封
依然拥有晴空

你我共同品味JAVA的浓香.
posted on 2007-10-25 16:15 千里冰封 阅读(2580) 评论(0)  编辑  收藏 所属分类: JAVA扩展

只有注册用户登录后才能发表评论。


网站导航: