Java 3D 开发

 OPENGL、VRML、DIRECT3D、JAVA3D的比较 

 

Java3D建立在JAVA基础之上,JAVA语言的简单性使JAVA3D的推广有了可能。它实现了以下三维显示能够用到的功能:

  1. 生成简单或复杂的形体(也可以调用现有的三维形体);
  2. 使形体具有颜色、透明效果、贴图;
  3. 在三维环境中生成灯光、移动灯光;
  4. 具有行为的处理判断能力(键盘、鼠标、定时等);
  5. 生成雾、背景、声音;
  6. 使形体变形、移动、生成三维动画;
  7. 编写非常复杂的应用程序,用于各种领域如VR(虚拟现实)。

 

 

 

作为一名3D图形学习者,无论是游戏开发、科学计算,还是生物技术,还是虚拟现实(Virtual Reality)、仿真技术,Java 3D都是很优秀的选择。理由如下:
  
  1)基于Java技术,秉承了Java的一切优点,具有优秀的、丰富的UI(Swing、AWT)和Web发布能力(通过Java Plug-In)。
  
  2)作为第四代3D图形API,Java 3D简单易用,不需要多深厚的计算机(http://java.sun.com/products/java-media/3D/collateral/wp_mktg/wp_mktg.html )图形学功底和学习曲线,开发者便能开发出很专业的动画、仿真和交互。
  
  3)功能强大,高层次开发。因为Java 3D在底层借助于Open/GL、DirectX的强有力支持;在高层,开发者不再需要负责对象渲染、碰撞检查的编程任务,所以很不错。最新版本为1.3.1 Beta。(http://java.sun.com/products/java-media/3D/ )
  
  4) 基于场景图结构(Scene Graph Structure)。这种层次结构,无论是描述现实中的对象,还是计算机实现都栩栩如生。她(Java 3D)在这两者之间几乎达到了极致。Java思想的简单也正体现在此。善于将复杂问题简单化,比较人性化。
  
  5)学习资源丰富。大部分都是E的。  
  
  由于本人刚开始接触Java 3D。这方面的中文资料还是比较少的,所以只能看英文了,幸好英文资料有很多。中文也有一些。

 

 

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>利用Applet将Java3D实现三维图像在浏览器上展示程序</title> </head> <body> <h3>利用Applet将Java3D实现三维图像在浏览器上展示程序</h3> <applet alt="利用Applet将Java3D实现三维图像在浏览器上展示程序" code="com.java3d.applet.MyJava3dApplet.class" codebase="Applet" width="500" height="300" /> </body></html>

 

 

 

 

 

 

 

 重要网址 下载资料:http://www.oracle.com/technetwork/java/javase/download-142937.html

 

http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-client-419417.html#7372-jmf-2.1.1e-oth-JPR

 

 

我的世界 游戏

Java 3D 开发

 

 

 

 

==================

 

用到的 下载的工具:  Java3D 1.5.2.rar                JMF。exe

 

 

 

Java3 d 游戏开发程序运行的原理:

 

创建一个Canvas3D对象;

创建并定制一个 SimpleUniverse  对象,该对象引用前一步创建的Canvas3D对象;

构建内容子图

编译内容子图

将内容子图插入SimpleUniverse     的Locale中。

 

 

 

创建一个包含对象的数据结构     BranchGroup group = new BranchGroup();

 

生成坐标系:并将其 添加到 节点上:TransformGroup transGroup = new TransformGroup();          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);

 

 

添加平行光: 

 

给指定的bound设定光的范围界限:// 设置光源
         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);
        

 

 

 

设置外观

 

设置材料:

 

生成模型对象:

 

 

返回  BranchGroup group  ;              //   以上代码  放入到   方法中:public BranchGroup createSceneGraph(){  }   中

  

 

 

使用 // 创建3D场景绘制画布Canvas3D对象   Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());      add("center" , canvas  )

 

创建虚拟空间;         SimpleUniverse universe = new SimpleUniverse(canvas);

 

构建内容子图:         BranchGroup scene = createSceneGraph();

 

将子图内容 插入到  :SimpleUniverse  对象中,universe.addBranchGraph(scene);                 //以上代码 可以发放入到  构造方法中

 

 

 

 

 

 

=====================================

 

eclipse中配置Java3D过程    注意:这是转载他人的文章、

网址:http://www.cnblogs.com/duanzhichao/archive/2013/04/17/3026002.html

 

  1. 下载Java3D的。

Java 3D 开发

2.安装Java3D

3.启动Eclipse。 你可以创建一个Java3D的代码为您的新项目,或使用一个已经存在的项目。 

HelloUniverse.java有很多语法错误,因为它是指一些Java3D的非标准类。 我们需要告诉到哪里寻找这些类的项目。 

在Eclipse菜单,选择“ 项目” - >“属性”
Java 3D 开发

在弹出窗口中选择 Java Build Path,然后单击 Add Library ...“按钮。 
Java 3D 开发

在下一个窗口中,选择用户库 ,点击“ 下一步 ”按钮。 
Java 3D 开发

在下一个窗口中单击“ 用户库”...“按钮 
Java 3D 开发

在未来的点击新建...“按钮。 
Java 3D 开发

10. 在窗口,弹出新的库名称。 使用名称Java3DLib。 然后单击“ 确定 ”按钮。 
Java 3D 开发

11. 选择您刚才创建的库,然后单击“ 添加JAR文件...”按钮。 
Java 3D 开发

12. 在弹出浏览文件夹,你在第2步安装Java3D的文件选择。 (Jav​​a3D的jar文件的路径在我的机器是用Java3D - > 1.5.2 - >库 - >分机 - >)选择所有三个jar文件(j3dcore.jar,j3dutils.jar,和vecmath.jar的)。 所有三个jar文件,选择后单击“ 打开 ”按钮 
Java 3D 开发

13. 后加入的罐子在首选项窗口点击OK按钮。 
Java 3D 开发

14. 在弹出的窗口中单击 Finish按钮。 
Java 3D 开发

15. 在构建路径“窗口中选择回到您刚才添加的Java3DLib,展开它,并选择本机库的位置属性。 然后单击“编辑”按钮。 
Java 3D 开发

16. 在窗口弹出单击外部文件夹“按钮。 
Java 3D 开发

17. 在弹出的窗口中,浏览到Java3D的文件夹中的bin文件夹。 (在我的机器,这是在JAVA3D - > 1.5.2 - > bin)中选择的文件夹,然后点击确定 

18. 关闭Preferences窗口。 HelloUniverse现在应该编译没有任何语法错误。 当你运行程序,你应该看到一个旋转的彩色立方体。 

Java 3D 开发

上例的源代码:  UglyCube.java文件    可以运行

package package1;
import java.awt.GraphicsConfiguration;
import java.applet.Applet;
import java.awt.BorderLayout;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;

public class UglyCube extends Applet 
{
private SimpleUniverse universe ;

public UglyCube() 
{}   

public void init() 
{      
     //canvas to draw on, ask SimpleUniverse what config to use     
     Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());     
     setLayout(new BorderLayout());      
     add("Center", canvas);          

     //create top of our scene graph      
     BranchGroup scene = new BranchGroup();              

     //create universe, and attach our geometry to it.      
     SimpleUniverse u = new SimpleUniverse(canvas);      
     u.getViewingPlatform().setNominalViewingTransform();             

     // Create the bounding leaf node
     BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);

     // Create the transform node
     TransformGroup transformGroup = new TransformGroup();  //可以旋转、放大、缩小 坐标系  
     transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
     transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);  //参数实现移动或旋转

     // Create the drag behavior node      控制鼠标 左键
     MouseRotate behavior = new MouseRotate();
     behavior.setTransformGroup(transformGroup);
     transformGroup.addChild(behavior);
     behavior.setSchedulingBounds(bounds);

     // Create the zoom behavior node  控制鼠标 中键

     MouseZoom behavior2 = new MouseZoom();
     behavior2.setTransformGroup(transformGroup);
     transformGroup.addChild(behavior2);
     behavior2.setSchedulingBounds(bounds);

     // Create the zoom behavior node       控制鼠标 右键

     MouseTranslate behavior3 = new MouseTranslate();
     behavior3.setTransformGroup(transformGroup);
     transformGroup.addChild(behavior3);
     behavior3.setSchedulingBounds(bounds);

     transformGroup.addChild(new ColorCube(0.4));
  
     scene.addChild(transformGroup);    
     u.addBranchGraph(scene);
}    
  
  
// The following allows UglyCube to be run as an application    
// as well as an applet    
public static void main(String[] args) 
{        
     new MainFrame(new UglyCube(), 256, 256);   
}
}

 
 
=============================================
显示静态的3d球
代码:

package package1;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
public class hello_ball {
    
 public hello_ball(){
 
  // 创建一个虚拟空间
     SimpleUniverse universe = new SimpleUniverse();
     // 创建一个用来包含对象的数据结构
     BranchGroup group = new BranchGroup();
    
     // 创建一个球并把它加入到group中
     Sphere sphere = new Sphere(0.5f); // 小球的半径为0.5米
     group.addChild(sphere);
    
     Color3f light1Color = new Color3f(1.8f, 0.1f, 0.1f);
     // 设置光线的颜色
     BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
     // 设置光线的作用范围
     Vector3f light1Direction = new Vector3f(4.0f, -7.0f, -12.0f);
     // 设置光线的方向
     DirectionalLight light1= new DirectionalLight(light1Color, light1Direction);
     // 指定颜色和方向,产生单向光源
     light1.setInfluencingBounds(bounds);
     // 把光线的作用范围加入光源中
     group.addChild(light1);
     // 将光源加入group组,安放观察点
     universe.getViewingPlatform().setNominalViewingTransform();
     // 把group加入到虚拟空间中
     universe.addBranchGraph(group);
}
 public static void main(String[] args) {
  // TODO 自动生成的方法存根
           new hello_ball();
 }

}

 
 
 ==============================================================
 
在eclipse里读取图像文件时,图像文件路径必须和.classpath,.project同级
 
在用myeclipse时运行java3D程序时,须将java3D安装文件中lib\ext下的三个文件j3dcore.jar、j3dutils.jar、vecmath.jar添加到要使用的项目中。具体添加方法如下:

 右击该工程,选择“Build Path”——>"Configure Build Path",在"libraries"里选择“Add External JARs”,选择上述三个文件所在的路径,添加三个文件。这样就将java3D的插件成功嵌入到了myeclipse中。

 
==================================================================
 
自己写的 3d  点  ,生成6个点  ,点显示太小了
 
代码如下:
 

package package1;
import java.applet.Applet;
import java.awt.BorderLayout;
import com.sun.j3d.utils.applet.MainFrame;
import javax.media.j3d.*;
import javax.vecmath.*;

 

import com.sun.j3d.utils.universe.SimpleUniverse;


public class Point1 extends Applet{
public BranchGroup createSceneGraph()
{
 BranchGroup objRoot=new BranchGroup();
 
 Color3f bgColor = new Color3f(1.0f,1.0f,1.0f);
 BoundingSphere bounds=new  BoundingSphere(new Point3d(0.0,0.0,0.0),100); //定义背景的有效范围

 Background bg= new Background(bgColor);
 bg.setApplicationBounds(bounds);
 objRoot.addChild(bg);
 
 
 float vert[]=
  {
    0.8f,0.8f,0.0f,  -0.8f,0.8f,0.0f,
    0.5f,0.0f,0.0f,  -0.5f,0.0f,0.0f,
    -0.8f,-0.8f,0.0f, 0.8f,-0.8f,0.0f,
    
  };
 
 
 float color[]=
  {
    0.0f,0.5f,1.0f,  0.5f,0.0f,1.0f,
    0.0f,0.8f,0.2f,  1.0f,0.0f,0.3f,
    0.0f,1.0f,0.3f,   0.3f,0.8f,0.0f,
    0.0f,1.0f,0.5f,
  };
 
 
 Shape3D shape=new Shape3D();   //定义形体
 
 int vCount=6;
 PointArray point=new PointArray(vCount,PointArray.COORDINATES|PointArray.COLOR_3);       //定义形体的几何参数

point.setCoordinates(0, vert);
 point.setColor(0, color);

 shape.setGeometry(point);
 
 objRoot.addChild(shape);
 
 objRoot.compile();
 
 return objRoot;
}


public Point1()
{
 setLayout(new BorderLayout());
 // Canvas3D c=new Canvas3D(null);
 Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
 
 add("Center",c);
 BranchGroup scene=createSceneGraph();
 SimpleUniverse u=new SimpleUniverse(c);
 u.getViewingPlatform().setNominalViewingTransform();
 u.addBranchGraph(scene);
}
 
public static void main(String[] args)
{
 new MainFrame(new Point1(),400,300);
}
}

 

 ===================================================================

好一点的点程序:

 

package package1;
import java.applet.Applet;
import java.awt.BorderLayout;
import com.sun.j3d.utils.applet.MainFrame;
import javax.media.j3d.*;
import javax.vecmath.*;

 

import com.sun.j3d.utils.universe.SimpleUniverse;


public class Point1 extends Applet{
public BranchGroup createSceneGraph()
{
 BranchGroup objRoot=new BranchGroup();
 
 Color3f bgColor = new Color3f(1.0f,1.0f,1.0f);
 BoundingSphere bounds=new  BoundingSphere(new Point3d(0.0,0.0,0.0),100); //定义背景的有效范围

 Background bg= new Background(bgColor);
 bg.setApplicationBounds(bounds);
 objRoot.addChild(bg);
 
 
 float vert[]=
  {
    0.8f,0.8f,0.0f,  -0.8f,0.8f,0.0f,
    0.5f,0.0f,0.0f,  -0.5f,0.0f,0.0f,
    -0.8f,-0.8f,0.0f, 0.8f,-0.8f,0.0f,
    
  };
 
 
 float color[]=
  {
    0.0f,0.5f,1.0f,  0.5f,0.0f,1.0f,
    0.0f,0.8f,0.2f,  1.0f,0.0f,0.3f,
    0.0f,1.0f,0.3f,   0.3f,0.8f,0.0f,
 
  };
 
 
 Shape3D shape=new Shape3D();   //定义形体
 
 int vCount=6;
 PointArray point=new PointArray(vCount,PointArray.COORDINATES|PointArray.COLOR_3);       //定义形体的几何参数

point.setCoordinates(0, vert);
 point.setColor(0, color); 
PointAttributes pa = new PointAttributes();//用于定义点特征的pa对象 
pa.setPointSize(10.0f);
pa.setPointAntialiasingEnable(true);//加了这一行显示为圆形,不加为正方形

Appearance ap = new Appearance();//用于定义形体材质的ap对象
ap.setPointAttributes(pa);

 shape.setGeometry(point);
 shape.setAppearance(ap);
 
 objRoot.addChild(shape);
 
 objRoot.compile();
 
 return objRoot;
}


public Point1()
{
 setLayout(new BorderLayout());
 // Canvas3D c=new Canvas3D(null);
 Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
 
 add("Center",c);
 BranchGroup scene=createSceneGraph();
 SimpleUniverse u=new SimpleUniverse(c);
 u.getViewingPlatform().setNominalViewingTransform();
 u.addBranchGraph(scene);
}
 
public static void main(String[] args)
{
 new MainFrame(new Point1(),400,300);
}
}

 

 ======================================================

 

 
 
 
 
======================================================
载入OBJ模型 ,部分失败了
Main.java
 

package package1;
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.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("t_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;
    }
}

 
 
 
 
J3DLoader.java代码:
 

package package1;

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

 
 
=============================================================
 
载入OBJ人体模型,测试成功、人体以 y周 不停旋转。
 
第一个文件代码:
 

package package1;

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.Vector3f;

import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.SimpleUniverse;

public class JavaModelObjLoaderApp extends Applet{

    /**
     * 
     */
    private static final long serialVersionUID = 5841679659336190804L;

    
    public BranchGroup createSceneGraph(){
        // 创建场景图分支
        BranchGroup group = new BranchGroup();
        
        // 几何变换组节点
        TransformGroup transGroup = new TransformGroup();
        // 几何变换
        Transform3D trans3d = new Transform3D();
        // 缩放变换
        trans3d.setScale(0.8);
        //将几何变换节点对象添加到节点组
        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 ObjFileReader("resource/Liit.obj"));
        //将模型添加到变换组节点
        transGroup.addChild(objTrans);
      //设置几何变化,绕Y轴中心旋转
        Transform3D yAxis = new Transform3D();
        Alpha rotationAlpha = new Alpha(-1,Alpha.INCREASING_ENABLE,
                0,0,
                4000,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 JavaModelObjLoaderApp(){
        
        setLayout(new BorderLayout());
        // 创建3D场景绘制画布Canvas3D对象
       // Canvas3D canvas = new Canvas3D(null);
        Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());

        add("Center",canvas);
        BranchGroup scene = createSceneGraph();
        
        SimpleUniverse universe = new SimpleUniverse(canvas);
        universe.getViewingPlatform().setNominalViewingTransform();
        universe.addBranchGraph(scene);
    }
    
    
    public static void main(String[] args) {
        new MainFrame(new JavaModelObjLoaderApp(), 360,360); 
    }
}

 
第二个文件代码:、
 

package package1;

import javax.media.j3d.BranchGroup;
import com.sun.j3d.loaders.Scene;
import com.sun.j3d.loaders.objectfile.ObjectFile;


public class ObjFileReader extends BranchGroup{

    private double creaseAngle = 60.0;
    
    /**
     * 
     * 读取ObjModel文件
     * 
     * @param filePath    obj文件路径
     * 
     */
    public ObjFileReader(String filePath){
        BranchGroup branchGroup = new BranchGroup();
        int flags = ObjectFile.RESIZE;
        ObjectFile objFile = new ObjectFile(flags, (float)(creaseAngle*Math.PI)/180);
        Scene scenen = null;
        try {
            scenen = objFile.load(filePath);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("OBJ模型加载失败" + e.getMessage());
        }
        branchGroup.addChild(scenen.getSceneGroup());
        this.addChild(branchGroup);
    }
    
}

 
 
=======================
载入多个OBJ图像人体模型,失败了,需要改进。
 

package package1;

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;

public class JavaModelObjLoaderApp extends Applet{
  private static final long serialVersionUID = 3645520149291184985L;


     public BranchGroup createSceneGraph(){
         // 创建场景图分支
         BranchGroup group = new BranchGroup();
         
         // 几何变换组节点
         TransformGroup transGroup = new TransformGroup();
         // 几何变换
         Transform3D trans3d = new Transform3D();
         // 缩放变换
         trans3d.setScale(0.8);
         //将几何变换节点对象添加到节点组
         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);
         
         BranchGroup branchGroup1 = new ObjFileReader("resource/Liit.obj");
         BranchGroup branchGroup2 = new ObjFileReader("resource/Liit.obj");
         
         group.addChild(createObject(branchGroup1,bound, -1.3f, 0.0f, 0.0f,3000));
         group.addChild(createObject(branchGroup2,bound, 1.3f, 0.0f, 0.0f ,4000));
         
         group.compile();
         
         return group;
     }
     /**
      * 
      * Description:  创建模型行为  绕Y轴旋转
      * @param group       模型结点
      * @param bound       模型作用范围边界
      * @param xpos       模型展示左边X轴位置
      * @param ypos       模型展示左边y轴位置
      * @param zpos   模型展示左边z轴位置
      * @param time   模型转动速度
      * @return
      */
     private TransformGroup createObject(BranchGroup group,BoundingSphere bound, float xpos, float ypos,float zpos, int time){
         Transform3D trans3d = new Transform3D();
         trans3d.setTranslation(new Vector3f(xpos, ypos, zpos));
         TransformGroup objTrans = new TransformGroup(trans3d);
         TransformGroup sgroup = new TransformGroup();
         sgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
         sgroup.addChild(group);
         
         //设置几何变化,绕Y轴中心旋转
         Transform3D yAxis = new Transform3D();
         Alpha rotationAlpha = new Alpha(-1,Alpha.INCREASING_ENABLE,
                 0,0,
                 time,0,0,
                 0,0,0);
         RotationInterpolator rotator = new RotationInterpolator(rotationAlpha, sgroup,yAxis,0.0f,(float)Math.PI*2.0f);
         rotator.setSchedulingBounds(bound);
         objTrans.addChild(rotator);
         objTrans.addChild(sgroup);
         return objTrans;
     }
     
     public void JavaModelObjLoaderApp(){
         
         setLayout(new BorderLayout());
         // 创建3D场景绘制画布Canvas3D对象
       //  Canvas3D canvas = new Canvas3D(null);
         Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
         add("Center",canvas);
         BranchGroup scene = createSceneGraph();
         SimpleUniverse universe = new SimpleUniverse(canvas);
         //设定用户视角
         Point3d userPosition = new Point3d(0,3,6);
         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 JavaModelObjLoaderApp(), 350,210); 
     }

 }

         
         
         
        

 ===========================================================
 
有趣的火柴杆  程序代码,失败了
 
 

package package1;

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;

import javax.media.j3d.*;
import javax.vecmath.*;

import com.sun.j3d.utils.behaviors.mouse.*;

import com.sun.j3d.utils.behaviors.picking.*;


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.Vector3f;

 


public class myStick extends Applet {

  Primitive box;
  PositionPathInterpolator p3,p5,p6,p8,p9,p10;
  RotationInterpolator  r5,r6,r9;
  Alpha aPos3,aPos5,aPos6,aPos8,aPos9,aPos10,aRot5,aRot6,aRot9;
 
  Appearance ap0,ap1,ap2;
  float knot[]= {0f,1f};
 
  Point3f pos[]=
   {
      new Point3f(0f ,  0f , 0f ),
      new Point3f(-0.25f ,  -0.25f , 0f ),
   };
 
 
  Point3f pos2[]=
  {
     new Point3f(0f ,  0f , 0f ),
     new Point3f(0.25f ,  -0.25f , 0f ),
  };

 
 Point3f pos3[]=
  {
     new Point3f(0f ,  0f , 0f ),
     new Point3f(0f ,  -0.5f , 0.5f ),
  };

 
 Point3f pos4[]=
  {
     new Point3f(0f ,  0f , 0f ),
     new Point3f(0.5f ,  -0.5f , -0.5f ),
  };

 Point3f pos5[]=
  {
     new Point3f(0f ,  0f , 0f ),
     new Point3f(0f ,  -0.5f , -30f ),
  };

 
 
 
  public BranchGroup createSceneGraph(Canvas3D c){
   
   BranchGroup objRoot = new BranchGroup();
   
   BoundingSphere bound= new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
   
   ap0 =new Appearance();
   Material mat0 = new Material();
   mat0.setDiffuseColor(new Color3f( 1f , 0f ,0f ));
   ap0.setMaterial(mat0);
   
   
   ap1 =new Appearance();
   Material mat1 = new Material();
   mat1.setDiffuseColor(new Color3f( 1f , .6f ,.4f ));
   ap1.setMaterial(mat1);
   
   ap2 =new Appearance();
   Material mat2 = new Material();
   mat2.setDiffuseColor(new Color3f( 1f , 0.8f ,0.6f ));
   ap2.setMaterial(mat2);
   
   
    Color3f bgColor = new Color3f(1.0f,1.0f,1.0f);
         Background bg = new Background(bgColor);
         bg.setApplicationBounds(bound);
         objRoot.addChild(bg);
   
         Color3f DirectionalColor = new Color3f(1.f,1.f,1.f);
         Vector3f vec = new Vector3f(0.f,0.f,-1.0f);
         DirectionalLight light = new DirectionalLight(DirectionalColor, vec);
      light.setInfluencingBounds(bound);
      objRoot.addChild(light);
      
      
      Transform3D t = new Transform3D();
      t.setTranslation(new Vector3f(0f,-1.0f,0.f));
      TransformGroup g0 = new TransformGroup( t );
      box =new Box(1.5f, 0.1f, 1.2f, ap0);
      g0.addChild(box);
      
      
      t = new Transform3D();
      t.rotX(1.4);
      
      TransformGroup objG = new TransformGroup( t );
      objG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
      objG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
      objRoot.addChild(objG);
      
      
      SharedGroup shared = new SharedGroup();
      shared.addChild(stick());
      
      t = new Transform3D();
      TransformGroup g1 = new TransformGroup( t );
      g1.addChild(new Link(shared));
      
      t = new Transform3D();
      t.setTranslation(new Vector3f(0f,0f,0.5f));
      TransformGroup g2 = new TransformGroup( t );
      g2.addChild(new Link(shared));
   
   
      
      t = new Transform3D();
      t.setTranslation(new Vector3f(0f,0f,-0.5f));
      TransformGroup g3 = new TransformGroup( t );
      
      
      Transform3D tC = new Transform3D();
      TransformGroup gC = new TransformGroup(  );
      gC.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
             
      
             aPos3 = new Alpha(0,Alpha.INCREASING_ENABLE,
                    0,0,
                    1000,0,0,
                    0,0,0);

              p3 =new PositionPathInterpolator(aPos3,gC,tC,knot,pos3);
        p3.setSchedulingBounds(bound);
        p3.setEnable(false);
        gC.addChild(p3);
        gC.addChild(new Link(shared));
        g3.addChild(gC);
        
        
        
        t = new Transform3D();
       t.setTranslation(new Vector3f(-0.25f,0f,0.25f));
       Transform3D temp =new Transform3D();
       temp.rotY(1.57);
       t.mul(temp);
       
       TransformGroup g4 = new TransformGroup( t );
       g4.addChild(new Link(shared));
       
      
       
       t = new Transform3D();
       t.setTranslation(new Vector3f(-0.25f,0f,-0.25f));
        temp =new Transform3D();
       temp.rotY(1.57);
       t.mul(temp);
       
       TransformGroup g5 = new TransformGroup( t );
      // g4.addChild(new Link(shared));
       
       
       Transform3D tA = new  Transform3D();
       tA.rotX(-1.57);
       TransformGroup gA = new TransformGroup(  );
                gA.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
              
                aRot5 = new Alpha(0,Alpha.INCREASING_ENABLE,
                        0,0,
                        1000,0,0,
                        0,0,0);
                r5 = new RotationInterpolator(aRot5,gA,tA,0f,1.57f);
                r5.setSchedulingBounds(bound);
                r5.setEnable(false);
                gA.addChild(r5);
        gA.addChild(new Link(shared));

      
        
       
       Transform3D tB = new  Transform3D();
       TransformGroup gB = new TransformGroup(  );
                gB.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                aPos5 = new Alpha(0,Alpha.INCREASING_ENABLE,
                        0,0,
                        1000,0,0,
                        0,0,0);
                p5.setSchedulingBounds(bound);
                p5.setEnable(false);
               
                gB.addChild(p5);
                gB.addChild(gA);
                g5.addChild(gB);
            
                
                
                
                
                
       t = new Transform3D();
       t.setTranslation(new Vector3f(0.25f,0f,-0.25f));
        temp =new Transform3D();
       temp.rotY(1.57);
       t.mul(temp);
       TransformGroup g6 = new TransformGroup( t );

     
                
       
        
       tA = new  Transform3D();
       tA.rotX(-1.57);              
      gA = new TransformGroup(  );
                gA.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                aRot6 = new Alpha(0,Alpha.INCREASING_ENABLE,
                        0,0,
                        1000,0,0,
                        0,0,0);                               
                 r6 = new RotationInterpolator(aRot6,gA,tA,0f,1.57f);
                 r6.setSchedulingBounds(bound);
                 r6.setEnable(false);
                gA.addChild(r6);
                gA.addChild(new Link(shared));
               
        
        
        
        
             
       tB = new  Transform3D();
      // tA.rotX(-1.57);              
      gB = new TransformGroup(  );
                gB.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                aPos6 = new Alpha(0,Alpha.INCREASING_ENABLE,
                        0,0,
                        1000,0,0,
                        0,0,0);                               
                 p6 = new PositionPathInterpolator(aPos6,gB,tB,knot,pos);
                 p6.setSchedulingBounds(bound);
                 r6.setEnable(false);
                gB.addChild(p6);
                gB.addChild(gA);
                g6.addChild(gB);
        
        
                
                
               

                
       t = new Transform3D();
       t.setTranslation(new Vector3f(0.25f,0f,0.25f));
        temp =new Transform3D();
       temp.rotY(1.57);
       t.mul(temp);
       TransformGroup g7 = new TransformGroup( t );
                g7.addChild(new Link(shared));
                
                
                
     
                
                
                
                
       t = new Transform3D();
       t.setTranslation(new Vector3f(0f,0f,1.0f));
       TransformGroup g8 = new TransformGroup( t );
                
                
                
                
       
       
       
       
              
       tC = new  Transform3D();
      // tA.rotX(-1.57);              
      gC = new TransformGroup(  );
                gC.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                aPos8 = new Alpha(0,Alpha.INCREASING_ENABLE,
                        0,0,
                        1000,0,0,
                        0,0,0);                               
                 p8 = new PositionPathInterpolator(aPos8,gC,tC,knot,pos5);
                 p8.setSchedulingBounds(bound);
                 p8.setEnable(false);
                gC.addChild(p8);
                gC.addChild(new Link(shared));
                g8.addChild(gC);
        
        
       
       
       
       
       
       
       
      

       t = new Transform3D();
       t.setTranslation(new Vector3f(-0.25f,0f,0.75f));
        temp =new Transform3D();
       temp.rotY(1.57);
       t.mul(temp);
       TransformGroup g9 = new TransformGroup( t );
              
                
                
                
     
                
       
       
       
       
       
       
       
       
       
       tA = new  Transform3D();
       tA.rotX(-1.57);              
      gA = new TransformGroup(  );
                gA.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                aRot9 = new Alpha(0,Alpha.INCREASING_ENABLE,
                        0,0,
                        1000,0,0,
                        0,0,0);                               
                 r9 = new RotationInterpolator(aRot9,gA,tA,0f,1.57f);
                 r9.setSchedulingBounds(bound);
                 r9.setEnable(false);
                gA.addChild(r9);
                gA.addChild(new Link(shared));
               
        
       
       
       
       
       
                
                
                
                
                
                
       tB = new  Transform3D();
      // tA.rotX(-1.57);              
      gB = new TransformGroup(  );
                gB.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                aPos9 = new Alpha(0,Alpha.INCREASING_ENABLE,
                        0,0,
                        1000,0,0,
                        0,0,0);                               
                 p9 = new PositionPathInterpolator(aPos9,gB,tB,knot,pos2);
                 p9.setSchedulingBounds(bound);
                 p9.setEnable(false);
                gB.addChild(p9);
                gB.addChild(gA);
                g9.addChild(gB);
        
        
                
                
                
                
                
                
                
                
                
                
                
               


       t = new Transform3D();
       t.setTranslation(new Vector3f(0.25f,0f,0.75f));
        temp =new Transform3D();
       temp.rotY(1.57);
       t.mul(temp);
       TransformGroup g10 = new TransformGroup( t );
              
                
                
                
                
                
                
       
       
       
       
      

                
                
       tC = new  Transform3D();
      // tA.rotX(-1.57);              
      gC = new TransformGroup(  );
                gC.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                aPos10 = new Alpha(0,Alpha.INCREASING_ENABLE,
                        0,0,
                        1000,0,0,
                        0,0,0);                               
                 p10 = new PositionPathInterpolator(aPos10,gC,tC,knot,pos4);
                 p10.setSchedulingBounds(bound);
                 p10.setEnable(false);
                gC.addChild(p10);
                gC.addChild( new Link(shared));
                g10.addChild(gC);
        
        
       
                objG.addChild(g0);
                objG.addChild(g1);
                objG.addChild(g2);
                objG.addChild(g3);
                objG.addChild(g4);
                objG.addChild(g5);
                objG.addChild(g6);
                objG.addChild(g7);
                objG.addChild(g8);
                objG.addChild(g9);
                objG.addChild(g10);
                
                
                
                MouseRotate behavior =new MouseRotate();
                behavior.setTransformGroup(objG);
                behavior.setSchedulingBounds(bound);
                objRoot.addChild(behavior);
                
                
                
                MouseZoom behavior2 =new MouseZoom();
                behavior2.setTransformGroup(objG);
                behavior2.setSchedulingBounds(bound);
                objRoot.addChild(behavior2);
                
                
                
                MouseTranslate behavior3 =new MouseTranslate();
                behavior3.setTransformGroup(objG);
                behavior3.setSchedulingBounds(bound);
                objRoot.addChild(behavior3);
                
                
        PickStick p = new PickStick(c,objRoot,bound);
 
             objRoot.compile();
             return objRoot;
  
  
  
  }
 
 Group stick(){
  
  Group group = new Group();
  Transform3D t1 = new Transform3D();
     t1.setTranslation(new Vector3f(-0.25f,0f,0f));
     TransformGroup   g1 = new TransformGroup( t1 );
        g1.addChild(new Sphere(0.06f,ap1));
        
        
        
        
        TransformGroup   g2 = new TransformGroup(  );
        g2.addChild(new Box(0.25f,0.03f,0.03f,ap2));
        group.addChild(g1);
        group.addChild(g2);
        return group;
        
  
 }
  
  public myStick(){
   
    setLayout(new BorderLayout());
         
         Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());

         add("Center",c);
         Viewer viewer  = new Viewer(c);
         
         Vector3d viewpoint = new Vector3d(0.0,0.0,5.0);
         
         Transform3D  t = new  Transform3D();
         t.set(viewpoint);
         ViewingPlatform v = new ViewingPlatform();
         v.getViewPlatformTransform().setTransform(t);
         
         
         
         
         BranchGroup scene = createSceneGraph(c);
         
         SimpleUniverse u = new SimpleUniverse(v,viewer);
         
         u.getViewingPlatform();
         u.addBranchGraph(scene);
         
        
   
   
  }
  
  
 public static void main(String[] args) {
  // TODO 自动生成的方法存根
  new MainFrame(new myStick(), 400,300); 
 }

}

 
 
 
 
另一个文件:
 
 

package package1;

import package1.myStick;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;

import javax.media.j3d.*;
import javax.vecmath.*;

import com.sun.j3d.utils.behaviors.mouse.*;

import com.sun.j3d.utils.behaviors.picking.*;


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.Vector3f;

 

 

public class PickStick extends PickMouseBehavior{
 
 myStick mystick  = new myStick();
  public PickStick(Canvas3D canvas, BranchGroup root, Bounds bounds)
  {
   super(canvas, root ,bounds);
   this.setSchedulingBounds(bounds);
   root.addChild(this);
   
   
   
  }
  
  public void  updateScene(int xpos,int ypos)
  {
   Primitive pri;
   pri = (Primitive)pickScene.pickNode(pickScene.pickClosest(xpos, ypos, PickObject.USE_BOUNDS), PickObject.PRIMITIVE);
   
   if(pri == mystick.box)
   {
    mystick.p3.setEnable(true);
    mystick.p5.setEnable(true);
    mystick.p6.setEnable(true);
    mystick.p8.setEnable(true);
    mystick.p9.setEnable(true);
    mystick.p10.setEnable(true);
    mystick.r5.setEnable(true);
    mystick.r6.setEnable(true);
    mystick.r9.setEnable(true);
    
    long time = System.currentTimeMillis();
    mystick.aPos3.setStartTime(time);
    mystick.aPos5.setStartTime(time);
    mystick.aPos6.setStartTime(time);
    mystick.aPos8.setStartTime(time);
    mystick.aPos9.setStartTime(time);
    mystick.aPos10.setStartTime(time);
    mystick.aRot5.setStartTime(time);
    mystick.aRot6.setStartTime(time);
    mystick.aRot9.setStartTime(time);
    
    
   }
   
   
  }
  
  
  
}

 
 
 
 
=============================================================
载入OBJ模型后,移动模型,还没有来得及测试。参考一下文章。
 
 
============================================================
 
Java3D实例应用-载入3ds 模型
 
 
 
 
http://wangleide414.iteye.com/blog/1499781 Java3d 旋转 他人代码  基于  socket
 
 
 
 

 OPENGL、VRML、DIRECT3D、JAVA3D的比较 

 

Java3D建立在JAVA基础之上,JAVA语言的简单性使JAVA3D的推广有了可能。它实现了以下三维显示能够用到的功能:

  1. 生成简单或复杂的形体(也可以调用现有的三维形体);
  2. 使形体具有颜色、透明效果、贴图;
  3. 在三维环境中生成灯光、移动灯光;
  4. 具有行为的处理判断能力(键盘、鼠标、定时等);
  5. 生成雾、背景、声音;
  6. 使形体变形、移动、生成三维动画;
  7. 编写非常复杂的应用程序,用于各种领域如VR(虚拟现实)。

 

 

 

作为一名3D图形学习者,无论是游戏开发、科学计算,还是生物技术,还是虚拟现实(Virtual Reality)、仿真技术,Java 3D都是很优秀的选择。理由如下:
  
  1)基于Java技术,秉承了Java的一切优点,具有优秀的、丰富的UI(Swing、AWT)和Web发布能力(通过Java Plug-In)。
  
  2)作为第四代3D图形API,Java 3D简单易用,不需要多深厚的计算机(http://java.sun.com/products/java-media/3D/collateral/wp_mktg/wp_mktg.html )图形学功底和学习曲线,开发者便能开发出很专业的动画、仿真和交互。
  
  3)功能强大,高层次开发。因为Java 3D在底层借助于Open/GL、DirectX的强有力支持;在高层,开发者不再需要负责对象渲染、碰撞检查的编程任务,所以很不错。最新版本为1.3.1 Beta。(http://java.sun.com/products/java-media/3D/ )
  
  4) 基于场景图结构(Scene Graph Structure)。这种层次结构,无论是描述现实中的对象,还是计算机实现都栩栩如生。她(Java 3D)在这两者之间几乎达到了极致。Java思想的简单也正体现在此。善于将复杂问题简单化,比较人性化。
  
  5)学习资源丰富。大部分都是E的。  
  
  由于本人刚开始接触Java 3D。这方面的中文资料还是比较少的,所以只能看英文了,幸好英文资料有很多。中文也有一些。

 

 

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>利用Applet将Java3D实现三维图像在浏览器上展示程序</title> </head> <body> <h3>利用Applet将Java3D实现三维图像在浏览器上展示程序</h3> <applet alt="利用Applet将Java3D实现三维图像在浏览器上展示程序" code="com.java3d.applet.MyJava3dApplet.class" codebase="Applet" width="500" height="300" /> </body></html>

 

 

 

 

 

 

 

 重要网址 下载资料:http://www.oracle.com/technetwork/java/javase/download-142937.html

 

http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-client-419417.html#7372-jmf-2.1.1e-oth-JPR

 

 

我的世界 游戏

Java 3D 开发

 

 

 

 

==================

 

用到的 下载的工具:  Java3D 1.5.2.rar                JMF。exe

 

 

 

Java3 d 游戏开发程序运行的原理:

 

创建一个Canvas3D对象;

创建并定制一个 SimpleUniverse  对象,该对象引用前一步创建的Canvas3D对象;

构建内容子图

编译内容子图

将内容子图插入SimpleUniverse     的Locale中。

 

 

 

创建一个包含对象的数据结构     BranchGroup group = new BranchGroup();

 

生成坐标系:并将其 添加到 节点上:TransformGroup transGroup = new TransformGroup();          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);

 

 

添加平行光: 

 

给指定的bound设定光的范围界限:// 设置光源
         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);
        

 

 

 

设置外观

 

设置材料:

 

生成模型对象:

 

 

返回  BranchGroup group  ;              //   以上代码  放入到   方法中:public BranchGroup createSceneGraph(){  }   中

  

 

 

使用 // 创建3D场景绘制画布Canvas3D对象   Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());      add("center" , canvas  )

 

创建虚拟空间;         SimpleUniverse universe = new SimpleUniverse(canvas);

 

构建内容子图:         BranchGroup scene = createSceneGraph();

 

将子图内容 插入到  :SimpleUniverse  对象中,universe.addBranchGraph(scene);                 //以上代码 可以发放入到  构造方法中

 

 

 

 

 

 

=====================================

 

eclipse中配置Java3D过程    注意:这是转载他人的文章、

网址:http://www.cnblogs.com/duanzhichao/archive/2013/04/17/3026002.html

 

  1. 下载Java3D的。

Java 3D 开发

2.安装Java3D

3.启动Eclipse。 你可以创建一个Java3D的代码为您的新项目,或使用一个已经存在的项目。 

HelloUniverse.java有很多语法错误,因为它是指一些Java3D的非标准类。 我们需要告诉到哪里寻找这些类的项目。 

在Eclipse菜单,选择“ 项目” - >“属性”
Java 3D 开发

在弹出窗口中选择 Java Build Path,然后单击 Add Library ...“按钮。 
Java 3D 开发

在下一个窗口中,选择用户库 ,点击“ 下一步 ”按钮。 
Java 3D 开发

在下一个窗口中单击“ 用户库”...“按钮 
Java 3D 开发

在未来的点击新建...“按钮。 
Java 3D 开发

10. 在窗口,弹出新的库名称。 使用名称Java3DLib。 然后单击“ 确定 ”按钮。 
Java 3D 开发

11. 选择您刚才创建的库,然后单击“ 添加JAR文件...”按钮。 
Java 3D 开发

12. 在弹出浏览文件夹,你在第2步安装Java3D的文件选择。 (Jav​​a3D的jar文件的路径在我的机器是用Java3D - > 1.5.2 - >库 - >分机 - >)选择所有三个jar文件(j3dcore.jar,j3dutils.jar,和vecmath.jar的)。 所有三个jar文件,选择后单击“ 打开 ”按钮 
Java 3D 开发

13. 后加入的罐子在首选项窗口点击OK按钮。 
Java 3D 开发

14. 在弹出的窗口中单击 Finish按钮。 
Java 3D 开发

15. 在构建路径“窗口中选择回到您刚才添加的Java3DLib,展开它,并选择本机库的位置属性。 然后单击“编辑”按钮。 
Java 3D 开发

16. 在窗口弹出单击外部文件夹“按钮。 
Java 3D 开发

17. 在弹出的窗口中,浏览到Java3D的文件夹中的bin文件夹。 (在我的机器,这是在JAVA3D - > 1.5.2 - > bin)中选择的文件夹,然后点击确定 

18. 关闭Preferences窗口。 HelloUniverse现在应该编译没有任何语法错误。 当你运行程序,你应该看到一个旋转的彩色立方体。 

Java 3D 开发

上例的源代码:  UglyCube.java文件    可以运行

package package1;
import java.awt.GraphicsConfiguration;
import java.applet.Applet;
import java.awt.BorderLayout;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;

public class UglyCube extends Applet 
{
private SimpleUniverse universe ;

public UglyCube() 
{}   

public void init() 
{      
     //canvas to draw on, ask SimpleUniverse what config to use     
     Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());     
     setLayout(new BorderLayout());      
     add("Center", canvas);          

     //create top of our scene graph      
     BranchGroup scene = new BranchGroup();              

     //create universe, and attach our geometry to it.      
     SimpleUniverse u = new SimpleUniverse(canvas);      
     u.getViewingPlatform().setNominalViewingTransform();             

     // Create the bounding leaf node
     BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);

     // Create the transform node
     TransformGroup transformGroup = new TransformGroup();  //可以旋转、放大、缩小 坐标系  
     transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
     transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);  //参数实现移动或旋转

     // Create the drag behavior node      控制鼠标 左键
     MouseRotate behavior = new MouseRotate();
     behavior.setTransformGroup(transformGroup);
     transformGroup.addChild(behavior);
     behavior.setSchedulingBounds(bounds);

     // Create the zoom behavior node  控制鼠标 中键

     MouseZoom behavior2 = new MouseZoom();
     behavior2.setTransformGroup(transformGroup);
     transformGroup.addChild(behavior2);
     behavior2.setSchedulingBounds(bounds);

     // Create the zoom behavior node       控制鼠标 右键

     MouseTranslate behavior3 = new MouseTranslate();
     behavior3.setTransformGroup(transformGroup);
     transformGroup.addChild(behavior3);
     behavior3.setSchedulingBounds(bounds);

     transformGroup.addChild(new ColorCube(0.4));
  
     scene.addChild(transformGroup);    
     u.addBranchGraph(scene);
}    
  
  
// The following allows UglyCube to be run as an application    
// as well as an applet    
public static void main(String[] args) 
{        
     new MainFrame(new UglyCube(), 256, 256);   
}
}

 
 
=============================================
显示静态的3d球
代码:

package package1;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
public class hello_ball {
    
 public hello_ball(){
 
  // 创建一个虚拟空间
     SimpleUniverse universe = new SimpleUniverse();
     // 创建一个用来包含对象的数据结构
     BranchGroup group = new BranchGroup();
    
     // 创建一个球并把它加入到group中
     Sphere sphere = new Sphere(0.5f); // 小球的半径为0.5米
     group.addChild(sphere);
    
     Color3f light1Color = new Color3f(1.8f, 0.1f, 0.1f);
     // 设置光线的颜色
     BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
     // 设置光线的作用范围
     Vector3f light1Direction = new Vector3f(4.0f, -7.0f, -12.0f);
     // 设置光线的方向
     DirectionalLight light1= new DirectionalLight(light1Color, light1Direction);
     // 指定颜色和方向,产生单向光源
     light1.setInfluencingBounds(bounds);
     // 把光线的作用范围加入光源中
     group.addChild(light1);
     // 将光源加入group组,安放观察点
     universe.getViewingPlatform().setNominalViewingTransform();
     // 把group加入到虚拟空间中
     universe.addBranchGraph(group);
}
 public static void main(String[] args) {
  // TODO 自动生成的方法存根
           new hello_ball();
 }

}

 
 
 ==============================================================
 
在eclipse里读取图像文件时,图像文件路径必须和.classpath,.project同级
 
在用myeclipse时运行java3D程序时,须将java3D安装文件中lib\ext下的三个文件j3dcore.jar、j3dutils.jar、vecmath.jar添加到要使用的项目中。具体添加方法如下:

 右击该工程,选择“Build Path”——>"Configure Build Path",在"libraries"里选择“Add External JARs”,选择上述三个文件所在的路径,添加三个文件。这样就将java3D的插件成功嵌入到了myeclipse中。

 
==================================================================
 
自己写的 3d  点  ,生成6个点  ,点显示太小了
 
代码如下:
 

package package1;
import java.applet.Applet;
import java.awt.BorderLayout;
import com.sun.j3d.utils.applet.MainFrame;
import javax.media.j3d.*;
import javax.vecmath.*;

 

import com.sun.j3d.utils.universe.SimpleUniverse;


public class Point1 extends Applet{
public BranchGroup createSceneGraph()
{
 BranchGroup objRoot=new BranchGroup();
 
 Color3f bgColor = new Color3f(1.0f,1.0f,1.0f);
 BoundingSphere bounds=new  BoundingSphere(new Point3d(0.0,0.0,0.0),100); //定义背景的有效范围

 Background bg= new Background(bgColor);
 bg.setApplicationBounds(bounds);
 objRoot.addChild(bg);
 
 
 float vert[]=
  {
    0.8f,0.8f,0.0f,  -0.8f,0.8f,0.0f,
    0.5f,0.0f,0.0f,  -0.5f,0.0f,0.0f,
    -0.8f,-0.8f,0.0f, 0.8f,-0.8f,0.0f,
    
  };
 
 
 float color[]=
  {
    0.0f,0.5f,1.0f,  0.5f,0.0f,1.0f,
    0.0f,0.8f,0.2f,  1.0f,0.0f,0.3f,
    0.0f,1.0f,0.3f,   0.3f,0.8f,0.0f,
    0.0f,1.0f,0.5f,
  };
 
 
 Shape3D shape=new Shape3D();   //定义形体
 
 int vCount=6;
 PointArray point=new PointArray(vCount,PointArray.COORDINATES|PointArray.COLOR_3);       //定义形体的几何参数

point.setCoordinates(0, vert);
 point.setColor(0, color);

 shape.setGeometry(point);
 
 objRoot.addChild(shape);
 
 objRoot.compile();
 
 return objRoot;
}


public Point1()
{
 setLayout(new BorderLayout());
 // Canvas3D c=new Canvas3D(null);
 Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
 
 add("Center",c);
 BranchGroup scene=createSceneGraph();
 SimpleUniverse u=new SimpleUniverse(c);
 u.getViewingPlatform().setNominalViewingTransform();
 u.addBranchGraph(scene);
}
 
public static void main(String[] args)
{
 new MainFrame(new Point1(),400,300);
}
}

 

 ===================================================================

好一点的点程序:

 

package package1;
import java.applet.Applet;
import java.awt.BorderLayout;
import com.sun.j3d.utils.applet.MainFrame;
import javax.media.j3d.*;
import javax.vecmath.*;

 

import com.sun.j3d.utils.universe.SimpleUniverse;


public class Point1 extends Applet{
public BranchGroup createSceneGraph()
{
 BranchGroup objRoot=new BranchGroup();
 
 Color3f bgColor = new Color3f(1.0f,1.0f,1.0f);
 BoundingSphere bounds=new  BoundingSphere(new Point3d(0.0,0.0,0.0),100); //定义背景的有效范围

 Background bg= new Background(bgColor);
 bg.setApplicationBounds(bounds);
 objRoot.addChild(bg);
 
 
 float vert[]=
  {
    0.8f,0.8f,0.0f,  -0.8f,0.8f,0.0f,
    0.5f,0.0f,0.0f,  -0.5f,0.0f,0.0f,
    -0.8f,-0.8f,0.0f, 0.8f,-0.8f,0.0f,
    
  };
 
 
 float color[]=
  {
    0.0f,0.5f,1.0f,  0.5f,0.0f,1.0f,
    0.0f,0.8f,0.2f,  1.0f,0.0f,0.3f,
    0.0f,1.0f,0.3f,   0.3f,0.8f,0.0f,
 
  };
 
 
 Shape3D shape=new Shape3D();   //定义形体
 
 int vCount=6;
 PointArray point=new PointArray(vCount,PointArray.COORDINATES|PointArray.COLOR_3);       //定义形体的几何参数

point.setCoordinates(0, vert);
 point.setColor(0, color); 
PointAttributes pa = new PointAttributes();//用于定义点特征的pa对象 
pa.setPointSize(10.0f);
pa.setPointAntialiasingEnable(true);//加了这一行显示为圆形,不加为正方形

Appearance ap = new Appearance();//用于定义形体材质的ap对象
ap.setPointAttributes(pa);

 shape.setGeometry(point);
 shape.setAppearance(ap);
 
 objRoot.addChild(shape);
 
 objRoot.compile();
 
 return objRoot;
}


public Point1()
{
 setLayout(new BorderLayout());
 // Canvas3D c=new Canvas3D(null);
 Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
 
 add("Center",c);
 BranchGroup scene=createSceneGraph();
 SimpleUniverse u=new SimpleUniverse(c);
 u.getViewingPlatform().setNominalViewingTransform();
 u.addBranchGraph(scene);
}
 
public static void main(String[] args)
{
 new MainFrame(new Point1(),400,300);
}
}

 

 ======================================================

 

 
 
 
 
======================================================
载入OBJ模型 ,部分失败了
Main.java
 

package package1;
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.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("t_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;
    }
}

 
 
 
 
J3DLoader.java代码:
 

package package1;

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

 
 
=============================================================
 
载入OBJ人体模型,测试成功、人体以 y周 不停旋转。
 
第一个文件代码:
 

package package1;

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.Vector3f;

import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.SimpleUniverse;

public class JavaModelObjLoaderApp extends Applet{

    /**
     * 
     */
    private static final long serialVersionUID = 5841679659336190804L;

    
    public BranchGroup createSceneGraph(){
        // 创建场景图分支
        BranchGroup group = new BranchGroup();
        
        // 几何变换组节点
        TransformGroup transGroup = new TransformGroup();
        // 几何变换
        Transform3D trans3d = new Transform3D();
        // 缩放变换
        trans3d.setScale(0.8);
        //将几何变换节点对象添加到节点组
        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 ObjFileReader("resource/Liit.obj"));
        //将模型添加到变换组节点
        transGroup.addChild(objTrans);
      //设置几何变化,绕Y轴中心旋转
        Transform3D yAxis = new Transform3D();
        Alpha rotationAlpha = new Alpha(-1,Alpha.INCREASING_ENABLE,
                0,0,
                4000,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 JavaModelObjLoaderApp(){
        
        setLayout(new BorderLayout());
        // 创建3D场景绘制画布Canvas3D对象
       // Canvas3D canvas = new Canvas3D(null);
        Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());

        add("Center",canvas);
        BranchGroup scene = createSceneGraph();
        
        SimpleUniverse universe = new SimpleUniverse(canvas);
        universe.getViewingPlatform().setNominalViewingTransform();
        universe.addBranchGraph(scene);
    }
    
    
    public static void main(String[] args) {
        new MainFrame(new JavaModelObjLoaderApp(), 360,360); 
    }
}

 
第二个文件代码:、
 

package package1;

import javax.media.j3d.BranchGroup;
import com.sun.j3d.loaders.Scene;
import com.sun.j3d.loaders.objectfile.ObjectFile;


public class ObjFileReader extends BranchGroup{

    private double creaseAngle = 60.0;
    
    /**
     * 
     * 读取ObjModel文件
     * 
     * @param filePath    obj文件路径
     * 
     */
    public ObjFileReader(String filePath){
        BranchGroup branchGroup = new BranchGroup();
        int flags = ObjectFile.RESIZE;
        ObjectFile objFile = new ObjectFile(flags, (float)(creaseAngle*Math.PI)/180);
        Scene scenen = null;
        try {
            scenen = objFile.load(filePath);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("OBJ模型加载失败" + e.getMessage());
        }
        branchGroup.addChild(scenen.getSceneGroup());
        this.addChild(branchGroup);
    }
    
}

 
 
=======================
载入多个OBJ图像人体模型,失败了,需要改进。
 

package package1;

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;

public class JavaModelObjLoaderApp extends Applet{
  private static final long serialVersionUID = 3645520149291184985L;


     public BranchGroup createSceneGraph(){
         // 创建场景图分支
         BranchGroup group = new BranchGroup();
         
         // 几何变换组节点
         TransformGroup transGroup = new TransformGroup();
         // 几何变换
         Transform3D trans3d = new Transform3D();
         // 缩放变换
         trans3d.setScale(0.8);
         //将几何变换节点对象添加到节点组
         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);
         
         BranchGroup branchGroup1 = new ObjFileReader("resource/Liit.obj");
         BranchGroup branchGroup2 = new ObjFileReader("resource/Liit.obj");
         
         group.addChild(createObject(branchGroup1,bound, -1.3f, 0.0f, 0.0f,3000));
         group.addChild(createObject(branchGroup2,bound, 1.3f, 0.0f, 0.0f ,4000));
         
         group.compile();
         
         return group;
     }
     /**
      * 
      * Description:  创建模型行为  绕Y轴旋转
      * @param group       模型结点
      * @param bound       模型作用范围边界
      * @param xpos       模型展示左边X轴位置
      * @param ypos       模型展示左边y轴位置
      * @param zpos   模型展示左边z轴位置
      * @param time   模型转动速度
      * @return
      */
     private TransformGroup createObject(BranchGroup group,BoundingSphere bound, float xpos, float ypos,float zpos, int time){
         Transform3D trans3d = new Transform3D();
         trans3d.setTranslation(new Vector3f(xpos, ypos, zpos));
         TransformGroup objTrans = new TransformGroup(trans3d);
         TransformGroup sgroup = new TransformGroup();
         sgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
         sgroup.addChild(group);
         
         //设置几何变化,绕Y轴中心旋转
         Transform3D yAxis = new Transform3D();
         Alpha rotationAlpha = new Alpha(-1,Alpha.INCREASING_ENABLE,
                 0,0,
                 time,0,0,
                 0,0,0);
         RotationInterpolator rotator = new RotationInterpolator(rotationAlpha, sgroup,yAxis,0.0f,(float)Math.PI*2.0f);
         rotator.setSchedulingBounds(bound);
         objTrans.addChild(rotator);
         objTrans.addChild(sgroup);
         return objTrans;
     }
     
     public void JavaModelObjLoaderApp(){
         
         setLayout(new BorderLayout());
         // 创建3D场景绘制画布Canvas3D对象
       //  Canvas3D canvas = new Canvas3D(null);
         Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
         add("Center",canvas);
         BranchGroup scene = createSceneGraph();
         SimpleUniverse universe = new SimpleUniverse(canvas);
         //设定用户视角
         Point3d userPosition = new Point3d(0,3,6);
         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 JavaModelObjLoaderApp(), 350,210); 
     }

 }

         
         
         
        

 ===========================================================
 
有趣的火柴杆  程序代码,失败了
 
 

package package1;

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;

import javax.media.j3d.*;
import javax.vecmath.*;

import com.sun.j3d.utils.behaviors.mouse.*;

import com.sun.j3d.utils.behaviors.picking.*;


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.Vector3f;

 


public class myStick extends Applet {

  Primitive box;
  PositionPathInterpolator p3,p5,p6,p8,p9,p10;
  RotationInterpolator  r5,r6,r9;
  Alpha aPos3,aPos5,aPos6,aPos8,aPos9,aPos10,aRot5,aRot6,aRot9;
 
  Appearance ap0,ap1,ap2;
  float knot[]= {0f,1f};
 
  Point3f pos[]=
   {
      new Point3f(0f ,  0f , 0f ),
      new Point3f(-0.25f ,  -0.25f , 0f ),
   };
 
 
  Point3f pos2[]=
  {
     new Point3f(0f ,  0f , 0f ),
     new Point3f(0.25f ,  -0.25f , 0f ),
  };

 
 Point3f pos3[]=
  {
     new Point3f(0f ,  0f , 0f ),
     new Point3f(0f ,  -0.5f , 0.5f ),
  };

 
 Point3f pos4[]=
  {
     new Point3f(0f ,  0f , 0f ),
     new Point3f(0.5f ,  -0.5f , -0.5f ),
  };

 Point3f pos5[]=
  {
     new Point3f(0f ,  0f , 0f ),
     new Point3f(0f ,  -0.5f , -30f ),
  };

 
 
 
  public BranchGroup createSceneGraph(Canvas3D c){
   
   BranchGroup objRoot = new BranchGroup();
   
   BoundingSphere bound= new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
   
   ap0 =new Appearance();
   Material mat0 = new Material();
   mat0.setDiffuseColor(new Color3f( 1f , 0f ,0f ));
   ap0.setMaterial(mat0);
   
   
   ap1 =new Appearance();
   Material mat1 = new Material();
   mat1.setDiffuseColor(new Color3f( 1f , .6f ,.4f ));
   ap1.setMaterial(mat1);
   
   ap2 =new Appearance();
   Material mat2 = new Material();
   mat2.setDiffuseColor(new Color3f( 1f , 0.8f ,0.6f ));
   ap2.setMaterial(mat2);
   
   
    Color3f bgColor = new Color3f(1.0f,1.0f,1.0f);
         Background bg = new Background(bgColor);
         bg.setApplicationBounds(bound);
         objRoot.addChild(bg);
   
         Color3f DirectionalColor = new Color3f(1.f,1.f,1.f);
         Vector3f vec = new Vector3f(0.f,0.f,-1.0f);
         DirectionalLight light = new DirectionalLight(DirectionalColor, vec);
      light.setInfluencingBounds(bound);
      objRoot.addChild(light);
      
      
      Transform3D t = new Transform3D();
      t.setTranslation(new Vector3f(0f,-1.0f,0.f));
      TransformGroup g0 = new TransformGroup( t );
      box =new Box(1.5f, 0.1f, 1.2f, ap0);
      g0.addChild(box);
      
      
      t = new Transform3D();
      t.rotX(1.4);
      
      TransformGroup objG = new TransformGroup( t );
      objG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
      objG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
      objRoot.addChild(objG);
      
      
      SharedGroup shared = new SharedGroup();
      shared.addChild(stick());
      
      t = new Transform3D();
      TransformGroup g1 = new TransformGroup( t );
      g1.addChild(new Link(shared));
      
      t = new Transform3D();
      t.setTranslation(new Vector3f(0f,0f,0.5f));
      TransformGroup g2 = new TransformGroup( t );
      g2.addChild(new Link(shared));
   
   
      
      t = new Transform3D();
      t.setTranslation(new Vector3f(0f,0f,-0.5f));
      TransformGroup g3 = new TransformGroup( t );
      
      
      Transform3D tC = new Transform3D();
      TransformGroup gC = new TransformGroup(  );
      gC.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
             
      
             aPos3 = new Alpha(0,Alpha.INCREASING_ENABLE,
                    0,0,
                    1000,0,0,
                    0,0,0);

              p3 =new PositionPathInterpolator(aPos3,gC,tC,knot,pos3);
        p3.setSchedulingBounds(bound);
        p3.setEnable(false);
        gC.addChild(p3);
        gC.addChild(new Link(shared));
        g3.addChild(gC);
        
        
        
        t = new Transform3D();
       t.setTranslation(new Vector3f(-0.25f,0f,0.25f));
       Transform3D temp =new Transform3D();
       temp.rotY(1.57);
       t.mul(temp);
       
       TransformGroup g4 = new TransformGroup( t );
       g4.addChild(new Link(shared));
       
      
       
       t = new Transform3D();
       t.setTranslation(new Vector3f(-0.25f,0f,-0.25f));
        temp =new Transform3D();
       temp.rotY(1.57);
       t.mul(temp);
       
       TransformGroup g5 = new TransformGroup( t );
      // g4.addChild(new Link(shared));
       
       
       Transform3D tA = new  Transform3D();
       tA.rotX(-1.57);
       TransformGroup gA = new TransformGroup(  );
                gA.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
              
                aRot5 = new Alpha(0,Alpha.INCREASING_ENABLE,
                        0,0,
                        1000,0,0,
                        0,0,0);
                r5 = new RotationInterpolator(aRot5,gA,tA,0f,1.57f);
                r5.setSchedulingBounds(bound);
                r5.setEnable(false);
                gA.addChild(r5);
        gA.addChild(new Link(shared));

      
        
       
       Transform3D tB = new  Transform3D();
       TransformGroup gB = new TransformGroup(  );
                gB.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                aPos5 = new Alpha(0,Alpha.INCREASING_ENABLE,
                        0,0,
                        1000,0,0,
                        0,0,0);
                p5.setSchedulingBounds(bound);
                p5.setEnable(false);
               
                gB.addChild(p5);
                gB.addChild(gA);
                g5.addChild(gB);
            
                
                
                
                
                
       t = new Transform3D();
       t.setTranslation(new Vector3f(0.25f,0f,-0.25f));
        temp =new Transform3D();
       temp.rotY(1.57);
       t.mul(temp);
       TransformGroup g6 = new TransformGroup( t );

     
                
       
        
       tA = new  Transform3D();
       tA.rotX(-1.57);              
      gA = new TransformGroup(  );
                gA.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                aRot6 = new Alpha(0,Alpha.INCREASING_ENABLE,
                        0,0,
                        1000,0,0,
                        0,0,0);                               
                 r6 = new RotationInterpolator(aRot6,gA,tA,0f,1.57f);
                 r6.setSchedulingBounds(bound);
                 r6.setEnable(false);
                gA.addChild(r6);
                gA.addChild(new Link(shared));
               
        
        
        
        
             
       tB = new  Transform3D();
      // tA.rotX(-1.57);              
      gB = new TransformGroup(  );
                gB.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                aPos6 = new Alpha(0,Alpha.INCREASING_ENABLE,
                        0,0,
                        1000,0,0,
                        0,0,0);                               
                 p6 = new PositionPathInterpolator(aPos6,gB,tB,knot,pos);
                 p6.setSchedulingBounds(bound);
                 r6.setEnable(false);
                gB.addChild(p6);
                gB.addChild(gA);
                g6.addChild(gB);
        
        
                
                
               

                
       t = new Transform3D();
       t.setTranslation(new Vector3f(0.25f,0f,0.25f));
        temp =new Transform3D();
       temp.rotY(1.57);
       t.mul(temp);
       TransformGroup g7 = new TransformGroup( t );
                g7.addChild(new Link(shared));
                
                
                
     
                
                
                
                
       t = new Transform3D();
       t.setTranslation(new Vector3f(0f,0f,1.0f));
       TransformGroup g8 = new TransformGroup( t );
                
                
                
                
       
       
       
       
              
       tC = new  Transform3D();
      // tA.rotX(-1.57);              
      gC = new TransformGroup(  );
                gC.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                aPos8 = new Alpha(0,Alpha.INCREASING_ENABLE,
                        0,0,
                        1000,0,0,
                        0,0,0);                               
                 p8 = new PositionPathInterpolator(aPos8,gC,tC,knot,pos5);
                 p8.setSchedulingBounds(bound);
                 p8.setEnable(false);
                gC.addChild(p8);
                gC.addChild(new Link(shared));
                g8.addChild(gC);
        
        
       
       
       
       
       
       
       
      

       t = new Transform3D();
       t.setTranslation(new Vector3f(-0.25f,0f,0.75f));
        temp =new Transform3D();
       temp.rotY(1.57);
       t.mul(temp);
       TransformGroup g9 = new TransformGroup( t );
              
                
                
                
     
                
       
       
       
       
       
       
       
       
       
       tA = new  Transform3D();
       tA.rotX(-1.57);              
      gA = new TransformGroup(  );
                gA.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                aRot9 = new Alpha(0,Alpha.INCREASING_ENABLE,
                        0,0,
                        1000,0,0,
                        0,0,0);                               
                 r9 = new RotationInterpolator(aRot9,gA,tA,0f,1.57f);
                 r9.setSchedulingBounds(bound);
                 r9.setEnable(false);
                gA.addChild(r9);
                gA.addChild(new Link(shared));
               
        
       
       
       
       
       
                
                
                
                
                
                
       tB = new  Transform3D();
      // tA.rotX(-1.57);              
      gB = new TransformGroup(  );
                gB.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                aPos9 = new Alpha(0,Alpha.INCREASING_ENABLE,
                        0,0,
                        1000,0,0,
                        0,0,0);                               
                 p9 = new PositionPathInterpolator(aPos9,gB,tB,knot,pos2);
                 p9.setSchedulingBounds(bound);
                 p9.setEnable(false);
                gB.addChild(p9);
                gB.addChild(gA);
                g9.addChild(gB);
        
        
                
                
                
                
                
                
                
                
                
                
                
               


       t = new Transform3D();
       t.setTranslation(new Vector3f(0.25f,0f,0.75f));
        temp =new Transform3D();
       temp.rotY(1.57);
       t.mul(temp);
       TransformGroup g10 = new TransformGroup( t );
              
                
                
                
                
                
                
       
       
       
       
      

                
                
       tC = new  Transform3D();
      // tA.rotX(-1.57);              
      gC = new TransformGroup(  );
                gC.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                aPos10 = new Alpha(0,Alpha.INCREASING_ENABLE,
                        0,0,
                        1000,0,0,
                        0,0,0);                               
                 p10 = new PositionPathInterpolator(aPos10,gC,tC,knot,pos4);
                 p10.setSchedulingBounds(bound);
                 p10.setEnable(false);
                gC.addChild(p10);
                gC.addChild( new Link(shared));
                g10.addChild(gC);
        
        
       
                objG.addChild(g0);
                objG.addChild(g1);
                objG.addChild(g2);
                objG.addChild(g3);
                objG.addChild(g4);
                objG.addChild(g5);
                objG.addChild(g6);
                objG.addChild(g7);
                objG.addChild(g8);
                objG.addChild(g9);
                objG.addChild(g10);
                
                
                
                MouseRotate behavior =new MouseRotate();
                behavior.setTransformGroup(objG);
                behavior.setSchedulingBounds(bound);
                objRoot.addChild(behavior);
                
                
                
                MouseZoom behavior2 =new MouseZoom();
                behavior2.setTransformGroup(objG);
                behavior2.setSchedulingBounds(bound);
                objRoot.addChild(behavior2);
                
                
                
                MouseTranslate behavior3 =new MouseTranslate();
                behavior3.setTransformGroup(objG);
                behavior3.setSchedulingBounds(bound);
                objRoot.addChild(behavior3);
                
                
        PickStick p = new PickStick(c,objRoot,bound);
 
             objRoot.compile();
             return objRoot;
  
  
  
  }
 
 Group stick(){
  
  Group group = new Group();
  Transform3D t1 = new Transform3D();
     t1.setTranslation(new Vector3f(-0.25f,0f,0f));
     TransformGroup   g1 = new TransformGroup( t1 );
        g1.addChild(new Sphere(0.06f,ap1));
        
        
        
        
        TransformGroup   g2 = new TransformGroup(  );
        g2.addChild(new Box(0.25f,0.03f,0.03f,ap2));
        group.addChild(g1);
        group.addChild(g2);
        return group;
        
  
 }
  
  public myStick(){
   
    setLayout(new BorderLayout());
         
         Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());

         add("Center",c);
         Viewer viewer  = new Viewer(c);
         
         Vector3d viewpoint = new Vector3d(0.0,0.0,5.0);
         
         Transform3D  t = new  Transform3D();
         t.set(viewpoint);
         ViewingPlatform v = new ViewingPlatform();
         v.getViewPlatformTransform().setTransform(t);
         
         
         
         
         BranchGroup scene = createSceneGraph(c);
         
         SimpleUniverse u = new SimpleUniverse(v,viewer);
         
         u.getViewingPlatform();
         u.addBranchGraph(scene);
         
        
   
   
  }
  
  
 public static void main(String[] args) {
  // TODO 自动生成的方法存根
  new MainFrame(new myStick(), 400,300); 
 }

}

 
 
 
 
另一个文件:
 
 

package package1;

import package1.myStick;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;

import javax.media.j3d.*;
import javax.vecmath.*;

import com.sun.j3d.utils.behaviors.mouse.*;

import com.sun.j3d.utils.behaviors.picking.*;


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.Vector3f;

 

 

public class PickStick extends PickMouseBehavior{
 
 myStick mystick  = new myStick();
  public PickStick(Canvas3D canvas, BranchGroup root, Bounds bounds)
  {
   super(canvas, root ,bounds);
   this.setSchedulingBounds(bounds);
   root.addChild(this);
   
   
   
  }
  
  public void  updateScene(int xpos,int ypos)
  {
   Primitive pri;
   pri = (Primitive)pickScene.pickNode(pickScene.pickClosest(xpos, ypos, PickObject.USE_BOUNDS), PickObject.PRIMITIVE);
   
   if(pri == mystick.box)
   {
    mystick.p3.setEnable(true);
    mystick.p5.setEnable(true);
    mystick.p6.setEnable(true);
    mystick.p8.setEnable(true);
    mystick.p9.setEnable(true);
    mystick.p10.setEnable(true);
    mystick.r5.setEnable(true);
    mystick.r6.setEnable(true);
    mystick.r9.setEnable(true);
    
    long time = System.currentTimeMillis();
    mystick.aPos3.setStartTime(time);
    mystick.aPos5.setStartTime(time);
    mystick.aPos6.setStartTime(time);
    mystick.aPos8.setStartTime(time);
    mystick.aPos9.setStartTime(time);
    mystick.aPos10.setStartTime(time);
    mystick.aRot5.setStartTime(time);
    mystick.aRot6.setStartTime(time);
    mystick.aRot9.setStartTime(time);
    
    
   }
   
   
  }
  
  
  
}

 
 
 
 
=============================================================
载入OBJ模型后,移动模型,还没有来得及测试。参考一下文章。
 
 
============================================================
 
Java3D实例应用-载入3ds 模型
 
 
 
 
http://wangleide414.iteye.com/blog/1499781 Java3d 旋转 他人代码  基于  socket