`
wangleide414
  • 浏览: 606627 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

JAVA 3D 实时 旋转

 
阅读更多

下面我们给出实现JAVA 3D 实时旋转的代码,根据SOCKET接受到的数据进行旋转,SOCKET接受到的数据是三个旋转后的角度,然后3D图形根据这三个角度来实时的更新,如果有不懂的可以问我。

 

//3d 显示图像的代码

package com.neuera.service;

 

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

import com.sun.j3d.utils.geometry.*;

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

import java.applet.Applet;

import java.awt.BorderLayout;

import java.awt.Frame;

import java.awt.GraphicsConfiguration;

import java.io.IOException;

 

import javax.media.j3d.*;

import javax.vecmath.*;

 

/**

 *  根据事件来旋转立方体

 *  事件是每秒执行一次

 */

public class Java3DExample extends Applet{

 

public  BranchGroup scene;//场景

public RotationInterpolator rotatorX;//旋转X

public RotationInterpolator rotatorY;//旋转Y

public RotationInterpolator rotatorZ;//旋转Z

public static Frame frame;//窗口

public BranchGroup objRoot;//旋转根节点

public SimpleUniverse simpleU;//显示

public Alpha rotationAlpha;

/**

* 构造函数

*/

public Java3DExample(){

this.init();

}

/**

* 初始化

*/

    public void init() {

    setLayout(new BorderLayout());

GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();

Canvas3D canvas3D = new Canvas3D(config);

add("Center", canvas3D);

try {

scene = createSceneGraph();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

// SimpleUniverse is a Convenience Utility class

simpleU = new SimpleUniverse(canvas3D);

simpleU.getViewingPlatform().setNominalViewingTransform();

simpleU.addBranchGraph(scene);

    }

 

    public BranchGroup createSceneGraph() throws InterruptedException {

// Create the root of the branch graph

objRoot = new BranchGroup();

objRoot.setCapability(BranchGroup.ALLOW_DETACH);

TransformGroup objRotate = new TransformGroup();

objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);

objRoot.addChild(objRotate);

ColorCube cube=new ColorCube(0.4);

objRotate.addChild(cube);

objRoot.addChild(new Axis());

/*****行为定义******/

TimeBehavior b=new TimeBehavior();

b.setObjRoot(objRoot);

        BoundingSphere movingBounds = new BoundingSphere(new Point3d(0.0, 0.0,0.0), 100.0);

        b.setSchedulingBounds(movingBounds);

        objRoot.addChild(b);

 

objRoot.compile();

return objRoot;

}

 

    /**

     * 主函数,显示窗口

     * @param args

     * @throws Exception 

     * @throws IOException 

     */

    public static void main(String[] args) throws IOException, Exception {

    Java3DExample.frame = new MainFrame(new Java3DExample(),512,512);

    new SocketServer().service();

    }

}

 

 

// Behavior

 

 

package com.neuera.service;

 

import java.util.Enumeration;

import javax.media.j3d.Behavior;

import javax.media.j3d.BranchGroup;

import javax.media.j3d.Transform3D;

import javax.media.j3d.TransformGroup;

import javax.media.j3d.WakeupOnElapsedTime;

import javax.vecmath.Matrix3d;

 

public class TimeBehavior extends Behavior {

 

public BranchGroup objRoot;

 

public BranchGroup getObjRoot() {

return objRoot;

}

 

public void setObjRoot(BranchGroup objRoot) {

this.objRoot = objRoot;

}

 

public static int temp = 0;

 

public static double angleX;// X轴方向的角度

public static double angleY;// Y轴方向的角度

public static double angleZ;// Z轴方向的角度

 

/**

* 初始化

*/

@Override

public void initialize() {

this.wakeupOn(new WakeupOnElapsedTime(100));// 添加事件,每秒一次

}

 

@Override

public void processStimulus(Enumeration arg0) {

this.wakeupOn(new WakeupOnElapsedTime(500));

 

System.out.println("收到数据");

Matrix3d m1 = new Matrix3d();//x 方向

Matrix3d m2 = new Matrix3d();//y 方向

Matrix3d m3 = new Matrix3d();//z 方向

m1.rotX(Math.toRadians(angleX));// 绕X轴旋转45度。

m2.rotY(Math.toRadians(angleY));// 绕y轴旋转45度。

m3.rotZ(Math.toRadians(angleZ));// 绕z轴旋转45度。

//

m2.mul(m3);

m1.mul(m2);

Transform3D transform = new Transform3D();

transform.setRotation(m1);

 

TransformGroup a = (TransformGroup) objRoot.getChild(0);

// objRotate.setTransform(axis);

a.setTransform(transform);

}

 

}



//socket 接受数据


package com.neuera.service;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.*;
import java.util.concurrent.*;
public class SocketServer {
private final int port = 8888;// 服务器端的端口号
private ServerSocket serverSocket;
private ExecutorService executorService;// 线程池
private final int POOL_SIZE = 10;// 单个CPU线程池大小

public SocketServer() throws IOException {
serverSocket = new ServerSocket(port);
// Runtime的availableProcessor()方法返回当前系统的CPU数目.
executorService = Executors.newFixedThreadPool(Runtime.getRuntime()
.availableProcessors() * POOL_SIZE);
System.out.println("服务器已经启动。。。。。");
}

public void service() throws Exception {
while (true) {
Socket socket = null;
// Socket socket1=new Socket("192.168.0.200",162);
try {
// 接收客户连接,只要客户进行了连接,就会触发accept();从而建立

连接
socket = serverSocket.accept();
executorService.execute(new Handler(socket));

} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception {
new SocketServer().service();
}
}

class Handler implements Runnable{
private Socket socket;
private BufferedReader br; // 得到客户端的输入来的数据
private InputStream dataIn;
private PrintWriter pw; // 可以传送给客户端的Writer
public Handler(Socket socket) throws IOException {
this.socket = socket;
this.br = getReader(socket);
this.dataIn=socket.getInputStream();
this.pw = getWriter(socket);
}

private PrintWriter getWriter(Socket socket) throws IOException {
OutputStream socketOut = socket.getOutputStream();
return new PrintWriter(socketOut, true);
}

private BufferedReader getReader(Socket socket) throws IOException {
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}

//接受客户端的链接
public void run() {
try {
System.out.println("New connection accepted "+ 

socket.getInetAddress() + ":" + socket.getPort());
String msg = null;
while ((msg = br.readLine()) != null) {
//发来的数据
System.out.println(msg);
String angles[]=msg.split(",");
TimeBehavior.angleX=-Double.parseDouble(angles[0]);
TimeBehavior.angleY=Double.parseDouble(angles[2]);
TimeBehavior.angleZ=-Double.parseDouble(angles[1]);
System.out.println(TimeBehavior.angleX);
System.out.println(TimeBehavior.angleY);
System.out.println(TimeBehavior.angleZ);
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("结束了");
}
}
}

//坐标轴

package com.neuera.service;

import javax.media.j3d.Geometry;
import javax.media.j3d.GeometryArray;
import javax.media.j3d.IndexedLineArray;
import javax.media.j3d.Shape3D;
import javax.vecmath.Point3f;

public class Axis extends Shape3D {

// //////////////////////////////////////////
//
// create axis visual object
//
public Axis() {

this.setGeometry(createGeometry());

}

private Geometry createGeometry() {
// create line for X axis
IndexedLineArray axisLines = new IndexedLineArray(18,
GeometryArray.COORDINATES, 30);

axisLines.setCoordinate(0, new Point3f(-1.0f, 0.0f, 0.0f));
axisLines.setCoordinate(1, new Point3f(1.0f, 0.0f, 0.0f));
axisLines.setCoordinate(2, new Point3f(0.9f, 0.1f, 0.1f));
axisLines.setCoordinate(3, new Point3f(0.9f, -0.1f, 0.1f));
axisLines.setCoordinate(4, new Point3f(0.9f, 0.1f, -0.1f));
axisLines.setCoordinate(5, new Point3f(0.9f, -0.1f, -0.1f));
axisLines.setCoordinate(6, new Point3f(0.0f, -1.0f, 0.0f));
axisLines.setCoordinate(7, new Point3f(0.0f, 1.0f, 0.0f));
axisLines.setCoordinate(8, new Point3f(0.1f, 0.9f, 0.1f));
axisLines.setCoordinate(9, new Point3f(-0.1f, 0.9f, 0.1f));
axisLines.setCoordinate(10, new Point3f(0.1f, 0.9f, -0.1f));
axisLines.setCoordinate(11, new Point3f(-0.1f, 0.9f, -0.1f));
axisLines.setCoordinate(12, new Point3f(0.0f, 0.0f, -1.0f));
axisLines.setCoordinate(13, new Point3f(0.0f, 0.0f, 1.0f));
axisLines.setCoordinate(14, new Point3f(0.1f, 0.1f, 0.9f));
axisLines.setCoordinate(15, new Point3f(-0.1f, 0.1f, 0.9f));
axisLines.setCoordinate(16, new Point3f(0.1f, -0.1f, 0.9f));
axisLines.setCoordinate(17, new Point3f(-0.1f, -0.1f, 0.9f));

axisLines.setCoordinateIndex(0, 0);
axisLines.setCoordinateIndex(1, 1);
axisLines.setCoordinateIndex(2, 2);
axisLines.setCoordinateIndex(3, 1);
axisLines.setCoordinateIndex(4, 3);
axisLines.setCoordinateIndex(5, 1);
axisLines.setCoordinateIndex(6, 4);
axisLines.setCoordinateIndex(7, 1);
axisLines.setCoordinateIndex(8, 5);
axisLines.setCoordinateIndex(9, 1);
axisLines.setCoordinateIndex(10, 6);
axisLines.setCoordinateIndex(11, 7);
axisLines.setCoordinateIndex(12, 8);
axisLines.setCoordinateIndex(13, 7);
axisLines.setCoordinateIndex(14, 9);
axisLines.setCoordinateIndex(15, 7);
axisLines.setCoordinateIndex(16, 10);
axisLines.setCoordinateIndex(17, 7);
axisLines.setCoordinateIndex(18, 11);
axisLines.setCoordinateIndex(19, 7);
axisLines.setCoordinateIndex(20, 12);
axisLines.setCoordinateIndex(21, 13);
axisLines.setCoordinateIndex(22, 14);
axisLines.setCoordinateIndex(23, 13);
axisLines.setCoordinateIndex(24, 15);
axisLines.setCoordinateIndex(25, 13);
axisLines.setCoordinateIndex(26, 16);
axisLines.setCoordinateIndex(27, 13);
axisLines.setCoordinateIndex(28, 17);
axisLines.setCoordinateIndex(29, 13);

return axisLines;

} // end of Axis createGeometry()

} // end of class Axis

分享到:
评论

相关推荐

    Tra.rar_Java3d图形旋转_java 3d_画图_画图 java_画图 旋转

    3. **3D旋转**:Java 3D提供了旋转操作,允许用户以任意轴和角度旋转3D对象。这通常通过`Transform3D`类来实现,该类可以对坐标系统进行旋转、平移和缩放操作。通过设置`Transform3D`的旋转参数,可以改变对象的显示...

    java3d旋转

    这个“java3d旋转”主题涉及了在Java3D环境中实现对象旋转的核心概念和技术。Java3D通过使用OpenGL底层图形库提供了丰富的功能,使开发者能够构建具有深度、透视和真实感的3D场景。 在Java3D中,旋转可以通过`...

    一个的图片3d旋转方法

    "一个图片3D旋转方法" 根据给定的文件信息,我们可以总结出以下几个知识点: 1. 图像翻转动画效果的实现:通过继承Animation类,重写initialize和applyTransformation方法可以实现图片的3D旋转动画效果。 在...

    JAVA3D官方实例

    JAVA3D,全称为Java 3D API,是Oracle公司推出的一种基于Java语言的三维图形编程接口。这个技术为开发者提供了强大的工具,用于创建复杂的、交互式的三维图形应用程序。JAVA3D官方实例对于初学者来说是一份宝贵的...

    Java 3D_java_java3d源码_

    3. **显示三维文字线程**:在Java 3D中,为了实现动态效果,可能会创建单独的线程来处理文字的更新、动画或旋转等效果。多线程允许程序在不阻塞用户界面的情况下进行复杂计算。 4. **从HTML文件中得到显示信息**:...

    java3d下载

    在Java3D中,你可以创建3D对象,如立方体、球体,然后对它们进行旋转、平移和缩放等操作,还可以添加光照、纹理和动画效果,实现逼真的视觉体验。 Java3D 1.3版本是该技术的一个早期版本,它引入了许多基础的3D图形...

    Java 3D 开发包

    这个开发包包含多个版本,如java3d-1_3-windows-i586-directx-sdk.exe、java3d-1_5_1-windows-i586.exe和java3d-1.5.0.exe,分别对应不同的更新和优化,适应不同开发者的需求。 1. **Java 3D API**: Java 3D API...

    Java3D的三个jar库

    Java3D是Oracle公司开发的一个开源三维图形编程库,它为Java程序员提供了一种在Java平台上构建三维图形应用的能力。这个技术基于OpenGL,允许开发者创建复杂的3D场景,并且能够与用户进行交互。在Java3D中,我们通常...

    java3D动画制作教程

    3. **应用变换**:通过`TransformGroup`或`Transform3D`来对物体进行旋转、平移和缩放,控制它们在空间中的位置和姿态。 4. **添加光照效果**:设置光源来影响场景的外观,包括点光源、平行光和聚光灯等。 5. **...

    JAVA3D教程,java3d

    Java3D是一个强大的Java库,用于在二维屏幕上创建和展示三维图形。它是Java平台上的一个扩展,使得开发者能够构建复杂的3D应用,如游戏、模拟器、科学可视化工具等。这个教程显然旨在帮助学习者掌握Java3D的核心概念...

    java3d jar包下载.rar

    Java3D是一个基于Java语言的三维图形编程库,它为开发者提供了一种高效、平台无关的方式来创建和操纵复杂的3D场景。这个“java3d jar包下载.rar”压缩包包含了运行和开发Java3D应用程序所需的类库文件。下面将详细...

    3D球状旋转旋转tag

    在实际开发中,可能需要用到Java或Kotlin(Android的主要开发语言)以及相关的3D图形库,如Android的OpenGL ES API或者其他第三方库。通过这种方式,开发者可以创建出富有创新性和吸引力的用户界面,提升用户体验。

    计算机图形学期末大作业,Java3D制作

    运用计算机图形学知识通过java3D设计制作了一个用户界面。该用户界面实现了对二维图形的绘制,三维模型的平移,旋转,放缩等基本操作...实现功能有:2D绘图、画板、3D旋转、平移、缩放、漫游、通过键盘与鼠标进行交互。

    JAVA3D.zip

    Java3D是一个基于Java平台的三维图形编程库,它提供了丰富的API来帮助开发者创建复杂的3D场景和应用程序。Java3D是Sun Microsystems开发的,并且是Java Foundation Classes (JFC)的一部分,旨在为Java应用程序提供...

    java3d 简单实例 旋转的圆锥

    java3d 简单例子 圆锥体 可以旋转,可用鼠标调节大小

    java3d作业带有动画

    Java3D是一个强大的三维图形库,它允许程序员创建和展示复杂的3D场景,包括对象的旋转、缩放以及交互功能。在这个"java3d作业带有动画"中,我们可以推测这是一份使用Java3D实现的项目,包含了声音、动画和图片元素,...

    java3D_jar

    Java3D是一个基于Java平台的三维图形编程库,它为开发者提供了一套强大的API来创建和展示复杂的3D场景。这个“java3D_jar”压缩包包含了运行和开发Java3D应用程序所需的必要组件,包括类库和其他资源。在Java世界里...

    java3D官方教程

    Java3D是Oracle公司开发的一种基于Java平台的三维图形编程库,它允许开发者创建复杂的3D场景,并在Java应用程序或Web应用中展示。这个官方教程是针对Java3D的详细学习资源,以英文PDF格式呈现,共分为7个章节,涵盖...

    JAVA3D安装教程

    JAVA3D 安装教程 JAVA3D 是一个 Java 库,允许开发者创建交互式 3D 图形应用程序。以下是 JAVA3D 安装教程的详细介绍: 安装 JAVA3D 首先,需要下载 JAVA3D 的库文件,并将其安装在您的计算机上。在 Windows 系统...

    Java3D魔方代码

    这通常涉及到对特定面进行旋转变换,这可以通过应用旋转矩阵或者使用Java3D提供的Transform3D类来实现。Transform3D允许我们执行平移、旋转和缩放操作,然后将这些变换应用到相应的3D对象上。 代码中的解释对于初学...

Global site tag (gtag.js) - Google Analytics