关键词:Java3D,3D模型文件,加载显示
利用Java3D查看一个3D模型文件(如附件),模型文件可以展示一个3D的图案。运行程序后,可以任意角度的查看该文件。
运行效果如下:
源码如下:
package com.zakisoft.hw;
/*
* @(#)ConfigObjLoad.java 1.3 02/04/01 15:04:14
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any
* kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
* WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
* EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
* SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
* DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN
* OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
* FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that Software is not designed,licensed or intended
* for use in the design, construction, operation or maintenance of
* any nuclear facility.
*/
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.FileNotFoundException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;
import javax.media.j3d.Alpha;
import javax.media.j3d.AmbientLight;
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.Sensor;
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.loaders.IncorrectFormatException;
import com.sun.j3d.loaders.ParsingErrorException;
import com.sun.j3d.loaders.Scene;
import com.sun.j3d.loaders.objectfile.ObjectFile;
import com.sun.j3d.utils.behaviors.sensor.Mouse6DPointerBehavior;
import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;
import com.sun.j3d.utils.universe.ConfiguredUniverse;
import com.sun.j3d.utils.universe.ViewingPlatform;
public class ConfigObjLoad {
private boolean spin = false;
private boolean noTriangulate = false;
private boolean noStripify = false;
private double creaseAngle = 60.0;
private URL filename = null;
private ConfiguredUniverse u;
public BranchGroup createSceneGraph() {
// Create the root of the branch graph
BranchGroup objRoot = new BranchGroup();
// Create a Transformgroup to scale all objects so they
// appear in the scene.
TransformGroup objScale = new TransformGroup();
Transform3D t3d = new Transform3D();
t3d.setScale(0.7);
objScale.setTransform(t3d);
objRoot.addChild(objScale);
// Create the transform group node and initialize it to the
// identity. Enable the TRANSFORM_WRITE capability so that
// our behavior code can modify it at runtime. Add it to the
// root of the subgraph.
TransformGroup objTrans = new TransformGroup();
objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
objScale.addChild(objTrans);
int flags = ObjectFile.RESIZE;
if (!noTriangulate)
flags |= ObjectFile.TRIANGULATE;
if (!noStripify)
flags |= ObjectFile.STRIPIFY;
ObjectFile f = new ObjectFile(flags,
(float) (creaseAngle * Math.PI / 180.0));
Scene s = null;
try {
s = f.load(filename);
} catch (FileNotFoundException e) {
System.err.println(e);
System.exit(1);
} catch (ParsingErrorException e) {
System.err.println(e);
System.exit(1);
} catch (IncorrectFormatException e) {
System.err.println(e);
System.exit(1);
}
objTrans.addChild(s.getSceneGroup());
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),
100.0);
if (spin) {
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(bounds);
objTrans.addChild(rotator);
}
// Set up the background
Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
Background bgNode = new Background(bgColor);
bgNode.setApplicationBounds(bounds);
objRoot.addChild(bgNode);
// Set up the ambient light
Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
AmbientLight ambientLightNode = new AmbientLight(ambientColor);
ambientLightNode.setInfluencingBounds(bounds);
objRoot.addChild(ambientLightNode);
// Set up the directional lights
Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
Vector3f light1Direction = new Vector3f(1.0f, 1.0f, 1.0f);
Color3f light2Color = new Color3f(1.0f, 1.0f, 1.0f);
Vector3f light2Direction = new Vector3f(-1.0f, -1.0f, -1.0f);
DirectionalLight light1 = new DirectionalLight(light1Color,
light1Direction);
light1.setInfluencingBounds(bounds);
objRoot.addChild(light1);
DirectionalLight light2 = new DirectionalLight(light2Color,
light2Direction);
light2.setInfluencingBounds(bounds);
objRoot.addChild(light2);
return objRoot;
}
private void usage() {
System.out
.println("Usage: java ObjLoad [-s] [-n] [-t] [-c degrees] <.obj file>");
System.out.println(" -s Spin (no user interaction)");
System.out.println(" -n No triangulation");
System.out.println(" -t No stripification");
System.out
.println(" -c Set crease angle for normal generation (default is 60 without");
System.out
.println(" smoothing group info, otherwise 180 within smoothing groups)");
System.exit(0);
} // End of usage
public void init() {
if (filename == null) {
try {
filename = new URL("file:./geometry/galleon.obj");
} catch (MalformedURLException e) {
System.err.println(e);
System.exit(1);
}
}
// Get the config file URL from the j3d.configURL property or use the
// default config file "j3d1x1-window" in the current directory.
URL configURL = ConfiguredUniverse
.getConfigURL("file:./files/j3d1x1-window");
// Create a simple scene and attach it to the virtual universe
BranchGroup scene = createSceneGraph();
u = new ConfiguredUniverse(configURL);
// Get the ViewingPlatform.
ViewingPlatform viewingPlatform = u.getViewingPlatform();
// This will move the ViewPlatform back a bit so the objects in the
// scene can be viewed. This will only have an effect if the config
// file sets the window eyepoint policy to something other than
// RELATIVE_TO_COEXISTENCE, which is the default eyepoint policy
// applied by ConfiguredUniverse.
//
// The default view attach policy for ConfiguredUniverse applications
// is NOMINAL_SCREEN. This sets the view platform origin in the
// physical world to the center of coexistence, which allows eye
// positions expressed relative to coexistence to see the appropriate
// field of view automatically.
viewingPlatform.setNominalViewingTransform();
// Add a ViewPlatformBehavior if not specified in the config file.
if (!spin && viewingPlatform.getViewPlatformBehavior() == null) {
OrbitBehavior orbit = new OrbitBehavior(u.getCanvas(),
OrbitBehavior.REVERSE_ALL);
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0,
0.0), 100.0);
orbit.setSchedulingBounds(bounds);
viewingPlatform.setViewPlatformBehavior(orbit);
}
// See if there's a 6 degree of freedom mouse in the environment.
// We look for one named "mouse6d".
Map<?, ?> sensorMap = null;
sensorMap = u.getNamedSensors();
if (sensorMap != null) {
Sensor mouse6d = (Sensor) sensorMap.get("mouse6d");
if (mouse6d != null) {
Mouse6DPointerBehavior behavior = new Mouse6DPointerBehavior(
mouse6d, 1.0, true);
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,
0.0, 0.0), 100.0);
behavior.setSchedulingBounds(bounds);
scene.addChild(behavior);
scene.addChild(behavior.getEcho());
}
}
// Listen for a typed "q", "Q", or "Escape" key on each canvas to
// allow a convenient exit from full screen configurations.
Canvas3D[] canvases;
canvases = u.getViewer().getCanvas3Ds();
class QuitListener extends KeyAdapter {
public void keyTyped(KeyEvent e) {
char c = e.getKeyChar();
if (c == 'q' || c == 'Q' || c == 27)
System.exit(0);
}
}
QuitListener quitListener = new QuitListener();
for (int i = 0; i < canvases.length; i++)
canvases[i].addKeyListener(quitListener);
// Make the scenegraph live.
u.addBranchGraph(scene);
}
public ConfigObjLoad(String[] args) {
if (args.length != 0) {
for (int i = 0; i < args.length; i++) {
if (args[i].startsWith("-")) {
if (args[i].equals("-s")) {
spin = true;
} else if (args[i].equals("-n")) {
noTriangulate = true;
} else if (args[i].equals("-t")) {
noStripify = true;
} else if (args[i].equals("-c")) {
if (i < args.length - 1) {
creaseAngle = (new Double(args[++i])).doubleValue();
} else
usage();
} else {
usage();
}
} else {
try {
if ((args[i].indexOf("file:") == 0)
|| (args[i].indexOf("http") == 0)) {
filename = new URL(args[i]);
} else if (args[i].charAt(0) != '/') {
filename = new URL("file:./" + args[i]);
} else {
filename = new URL("file:" + args[i]);
}
} catch (MalformedURLException e) {
System.err.println(e);
System.exit(1);
}
}
}
}
init();
}
public static void main(String[] args) {
new ConfigObjLoad(args);
}
}
分享到:
相关推荐
java3D 加载技术基础。可用于复用,以及理解各种加载的基础原理和基础步骤,含各种函数的调用。
通过java3d加载obj模型,已经成功的测试过,都可以加载。
react-native-3d模型视图 一个React Native视图,用于在屏幕上或AR中显示.obj,.dae和.scn模型(仅具有A9或更高处理器的iOS设备)。 示例项目: : 入门$ yarn add react-native-3d-model-view 进而$ react-native ...
在Java_3D中载入外部3D模型文件.pdf
Java3d MS3D加载器(含源码,模型,加载器),可实现一些动画。
J3DIO Java 3D 输入输出或 J3DIO(比如“jeh-dee-oh”)是一个用于 3D 模型的文件 IO 系统。 这是一个个人项目,但我认为这个库可能对某人有用。安装单击下载适用于 Java 7 的最新版 J3DIO贡献随意。 如果您需要有关...
使用3D模型和3D对象。 在3D文档中设置目标相机。 添加节点层次结构并在3D场景的多个节点之间共享网格的几何数据。 创建3D网格并显示“几何变换”。 在3D模型中将所有多边形转换为三角形。 使用,和 。支持的3D文件...
本项目使用uniapp开发小程序+使用three.js加载3D可视化
本实例实现将3d文件pro 或其它格式的文件加载进applet中,可以使用鼠标控制模型的查看角度,进行旋转
Android 3D模型查看器 这是OpenGL ES 2.0的演示。 这是一个带有3D引擎的Android应用程序,可以加载Wavefront OBJ,STL,DAE和glTF文件。 该应用程序基于andresoviedo的项目,可以在找到该项目,其中包含加载和呈现...
Java class that reads and converts a wavefront .obj 3d model file to java object. The result object will contain all the necessary data for render of the 3d model with OpenGL ES on for example Android...
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
Java 3D手机游戏开发实例集锦,书中的实例源码,对学习java 3D游戏开发帮助较大。 Hello3D 最基础的MIDlet例子,用于测试开发环境 第3章 EventDemo 事件处理演示 MMAPIDemo 声音播放演示 RMSMIDlet ...
为了生成对象的3D模型,需要以不同角度拍摄几张图像并将其加载到应用程序中。 另外,对于物体的每个图像,以相同角度拍摄校准图像。 此校准图像用于提取八叉树模型生成算法用于计算3D模型的度量(角度和距离)。 下...
实现obj文件的加载和用鼠标旋转,可从多个角度查看用3d做的模型Java.zip
Android 3D模型查看器 这是OpenGL ES 2.0的演示。 它基本上是一个带有3D引擎的android应用程序,可以加载Wavefront OBJ,STL和DAE文件。 该应用程序的目的是学习和共享如何使用OpenGL语言进行绘制。 该应用程序不...
用于测试开发环境 第3章 EventDemo 事件处理演示 MMAPIDemo 声音播放演示...模型演示 第6章 M3GTransform 坐标变换演示 第7章 BackgroundDemo 背景类使用演示 BillBorad 电子公告牌演示 ...
在该项目中,开发者可以学习和掌握JAVA3D的基本概念、场景图的构建、三维模型的加载和渲染等关键技术。该源码文件包中的源代码包含了一个完整的网络三维应用的实现。开发者可以通过阅读和理解源代码,学习到如何利用...