java3d显示obj文件

类关系图:

最近对3d漫游感兴趣,尝试学习一下。Java3D入门资料收藏夹里有详细介绍,此处不再啰嗦了。

在网上下了个人物模型,写了个类载入效果如下:


模型下载链接:
http://www.blogjava.net/Files/Man/csMANmodule.part2.rar
http://www.blogjava.net/Files/Man/csMANmodule.part1.rar
纹理链接:
http://www.blogjava.net/images/blogjava_net/Man/42654/t_flooring.jpg

源代码:
main类
package com.zzl.j3d.viewer;

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import java.net.URL;

import javax.media.j3d.Appearance;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.Group;
import javax.media.j3d.Texture;
import javax.media.j3d.TextureAttributes;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3d;
import javax.vecmath.Vector3f;

import com.sun.j3d.loaders.Scene;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;
import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.geometry.Primitive;
import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.universe.SimpleUniverse;
import com.sun.j3d.utils.universe.ViewingPlatform;
import com.zzl.j3d.loader.J3DLoader;

public  class Main  extends Applet{
    
     private SimpleUniverse universe ; 
     private Canvas3D canvas; 
     private BoundingSphere bounds =  new BoundingSphere( new Point3d(0.0, 0.0, 0.0), 1000.0);
    TransformGroup objTransG =  null;
    
     public  void Main()
    {}
    
     public  void setupView()
    {
         /**  Add some view related things to view branch side of scene graph  */ 
         //  add mouse interaction to the ViewingPlatform    
        OrbitBehavior orbit =  new OrbitBehavior(canvas, OrbitBehavior.REVERSE_ALL|OrbitBehavior.STOP_ZOOM); 
        orbit.setSchedulingBounds(bounds);    
        ViewingPlatform viewingPlatform = universe.getViewingPlatform();   
         //  This will move the ViewPlatform back a bit so the       
        
//  objects in the scene can be viewed.     
        viewingPlatform.setNominalViewingTransform();     
        viewingPlatform.setViewPlatformBehavior(orbit);    
    } 
    
     public  void init()
    {
        setLayout( new BorderLayout());
        GraphicsConfiguration gc = SimpleUniverse.getPreferredConfiguration();
        canvas =  new Canvas3D(gc);
        add("Center",canvas);
        
         //  Create a simple scene and attach it to the virtual universe
        universe =  new SimpleUniverse(canvas);    
        
         //  定义观察点,可用鼠标进行缩放、旋转
        setupView();
        
        J3DLoader loader =  new J3DLoader();
         //  定义场景的根结点
        BranchGroup objRoot =  new BranchGroup();
        
         //  载入人物模型
        Scene scene = loader.loadObj("Liit.obj");
        
         //  定义载入位置
        Transform3D pos1 =  new Transform3D();
        pos1.setTranslation( new Vector3f(0f,0.0f,0f)); 
         //  因为此处所采用的模型载入时是平行于y=0面的,所以要绕x轴旋转90度
        pos1.rotX(-1.57);
        objTransG =  new TransformGroup();
        objTransG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        objTransG.setTransform(pos1);

        objTransG.addChild(scene.getSceneGroup());
        
        objRoot.addChild(objTransG);
        
         //  载入纹理
        URL texImage = loader.loadTexture("resource/flooring.jpg");
         //  画了一个大矩形,作为地板
        Group group =  this.createSceneBackGround(texImage);
        objRoot.addChild(group);
        universe.addBranchGraph(objRoot);
    }
    
     public  void destroy() 
    {    
        universe.removeAllLocales();    
    } 
    
     /**
     * 
@param  args
     
*/
     public  static  void main(String[] args) {
         new MainFrame( new Main(), 256, 256);
    }

     public Group createSceneBackGround(URL texImage)
    {
         return createGeometry(Texture.MULTI_LEVEL_POINT , -1.1f, texImage);
    }
    
     public Group createGeometry( int filter,  float y, URL texImage)
    {
        Group topNode =  new Group();
        Appearance appearance =  new Appearance(); 
        TextureLoader tex =  new TextureLoader(texImage, TextureLoader.GENERATE_MIPMAP ,  this);
        Texture texture = tex.getTexture();
        
        texture.setMinFilter(filter);
        appearance.setTexture(texture);   
        TextureAttributes texAttr =  new TextureAttributes();  
        texAttr.setTextureMode(TextureAttributes.MODULATE);  
        appearance.setTextureAttributes(texAttr); 
        
         // TODO light
        Transform3D pos2 =  new Transform3D();
        pos2.setTranslation( new Vector3f(0f,y,0f));   
        objTransG =  new TransformGroup(); 
        objTransG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        objTransG.setTransform(pos2);
        
        
        Box box =  new Box(6f,0.1f,8f,Primitive.GENERATE_NORMALS|Primitive.GENERATE_TEXTURE_COORDS,appearance);
        objTransG.addChild(box);
        topNode.addChild(objTransG);
         return topNode;
    }
}


模型、纹理载入类:
package com.zzl.j3d.loader;

import java.io.File;
import java.io.FileNotFoundException;
import java.net.MalformedURLException;
import java.net.URL;

import com.sun.j3d.loaders.IncorrectFormatException;
import com.sun.j3d.loaders.ParsingErrorException;
import com.sun.j3d.loaders.Scene;
import com.sun.j3d.loaders.objectfile.ObjectFile;

public  class J3DLoader {

     private  static java.net.URL texImage =  null
    
     /**
     * 载入obj模型
     * 
@param  arg0 String 模型文件名
     * 
@return  Scene
     
*/
     public Scene loadObj(String arg0)
    {
         int flags = ObjectFile.RESIZE;
        ObjectFile f =  new ObjectFile(flags,( float)(49.0 * Math.PI / 180.0));
         //  创建场景叶节点
        Scene s =  null;
         try {
            s = f.load(arg0);
        }  catch (FileNotFoundException e) {
             //  TODO Auto-generated catch block
            e.printStackTrace();
        }  catch (IncorrectFormatException e) {
             //  TODO Auto-generated catch block
            e.printStackTrace();
        }  catch (ParsingErrorException e) {
             //  TODO Auto-generated catch block
            e.printStackTrace();
        }
         return s;
    }
    
     /**
     * 载入纹理图片
     * 
@param  args String 图片文件名
     * 
@return  URL
     
*/
     public URL loadTexture(String args)
    {
        File f =  new File(args);
         try {
            texImage = f.toURL();
        }  catch (MalformedURLException e) {
            e.printStackTrace();
        }
         return texImage;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值