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

 

 

我的世界 游戏

 

 

 

 

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

 

用到的 下载的工具:  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的。


2.安装Java3D

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

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

在Eclipse菜单,选择“ 项目” - >“属性”

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

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

在下一个窗口中单击“ 用户库”...“按钮 

在未来的点击新建...“按钮。 

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

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

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

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

14. 在弹出的窗口中单击 Finish按钮。 

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

16. 在窗口弹出单击外部文件夹“按钮。 

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

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

上例的源代码:   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

 

 

我的世界 游戏

 

 

 

 

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

 

用到的 下载的工具:  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的。


2.安装Java3D

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

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

在Eclipse菜单,选择“ 项目” - >“属性”

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

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

在下一个窗口中单击“ 用户库”...“按钮 

在未来的点击新建...“按钮。 

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

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

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

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

14. 在弹出的窗口中单击 Finish按钮。 

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

16. 在窗口弹出单击外部文件夹“按钮。 

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

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

上例的源代码:   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
 
 
 
 

猜你喜欢

转载自blog.csdn.net/u012278016/article/details/80104368