您的位置:首页 > 编程语言 > Java开发

Java 3D 开发

2016-08-07 16:43 537 查看
OPENGL、VRML、DIRECT3D、JAVA3D的比较

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

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

下载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模型后,移动模型,还没有来得及测试。参考一下文章。

http://www.blogjava.net/Man/category/42651.html

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

Java3D实例应用-载入3ds 模型

http://www.tuicool.com/articles/rMbeqm

http://www.cnblogs.com/dennisit/archive/2013/05/07/3065126.html

http://wangleide414.iteye.com/blog/1499781 Java3d 旋转 他人代码 基于 socket

http://blog.csdn.net/pythonfx/article/details/7786852

http://www.blogjava.net/chensiyu04/category/31610.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: