Java 3D 开发
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
我的世界 游戏
==================
用到的 下载的工具: 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的文件选择。 (Java3D的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现在应该编译没有任何语法错误。 当你运行程序,你应该看到一个旋转的彩色立方体。
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);
}
}
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();
}
}
右击该工程,选择“Build Path”——>"Configure Build Path",在"libraries"里选择“Add External JARs”,选择上述三个文件所在的路径,添加三个文件。这样就将java3D的插件成功嵌入到了myeclipse中。
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);
}
}
======================================================
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;
}
}
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;
}
}
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);
}
}
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);
}
}
}
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
我的世界 游戏
==================
用到的 下载的工具: 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的文件选择。 (Java3D的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现在应该编译没有任何语法错误。 当你运行程序,你应该看到一个旋转的彩色立方体。
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);
}
}
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();
}
}
右击该工程,选择“Build Path”——>"Configure Build Path",在"libraries"里选择“Add External JARs”,选择上述三个文件所在的路径,添加三个文件。这样就将java3D的插件成功嵌入到了myeclipse中。
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);
}
}
======================================================
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;
}
}
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;
}
}
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);
}
}
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);
}
}
}