Natural

 

我的java3d学习(一)——显示obj模型

我的java3d学习(一)——显示obj模型

最近被3d漫游所吸引,所以尝试学习一下java3d。

类关系图:

最近对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.00.00.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(), 256256);
    }

    
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;
    }
}




posted on 2009-11-07 12:51 此号已被删 阅读(4210) 评论(2)  编辑  收藏 所属分类: JAVA3D学习笔记

评论

# re: 我的java3d学习(一)——显示obj模型 2014-11-19 00:32 刘鹏森

为什么我载入之后,模型变黑呀  回复  更多评论   

# re: 我的java3d学习(一)——显示obj模型 2016-04-06 14:47 佳文

@刘鹏森
我的也是变黑了  回复  更多评论   


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


网站导航:
 

导航

统计

常用链接

留言簿(8)

随笔分类(83)

随笔档案(78)

文章档案(2)

相册

收藏夹(7)

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜