Java3D实例之创建空间几何模型的实现方法

Java3D,算是比较古老的技术,Java8中Oracle对JavaFX支持了Java3D. 相关资料参照Oracle官网 <JDK8目前还没有正式发布 Early Access版本下载地址 http://jdk8.java.net>
环境搭建Java3D开发环境,JDK下载见Oracle官网.安装后在安装目录下的lib文件中找到Java3D驱动包,添加的自己的项目中

Java3D实现简单几何空间图形说明:

实例应用:创建3D直线


代码如下:

package com.java3d.dennist.study;

import javax.media.j3d.Appearance;
import javax.media.j3d.LineArray;
import javax.media.j3d.LineAttributes;
import javax.media.j3d.Shape3D;

/**
 *
 *
 *  @version : 1.1
 * 
 *  @author  : 苏若年         <a href="mailto:DennisIT@163.com">发送邮件</a>
 *   
 *  @since   : 1.0      创建时间:    2013-5-6 下午02:57:47
 *    
 *  TODO     :
 *
 */
public class LineShape extends Shape3D{

// 直线的定点坐标
    private float vert[ ]={
.5f,0.5f,0.0f, -0.5f,0.5f,0.0f,
.3f,0.0f,0.0f, -0.3f,0.0f,0.0f,
                -0.5f,-0.5f,0.0f, 0.5f,-0.5f,0.0f};
    // 各定点的颜色
    private float color[ ]={
.0f,0.5f,1.0f,  0.0f,0.5f,1.0f,
.0f,0.8f,2.0f,  1.0f,0.0f,0.3f,
.0f,1.0f,0.3f,  0.3f,0.8f,0.0f};

public LineShape( ) {
        // 创建直线数组对象
        LineArray line=new LineArray(6,LineArray.COORDINATES|LineArray.COLOR_3);
        // 设置直线对象的坐标数组
        line.setCoordinates(0,vert);
        // 设置直线对象的颜色数组
        line.setColors(0,color);
        // 创建直线属性对象
        LineAttributes linea=new LineAttributes( );
        // 设置线宽
        linea.setLineWidth(10.0f);
        // 设置直线的渲染效果
        linea.setLineAntialiasingEnable(true);

Appearance app=new Appearance( ); 
        app.setLineAttributes(linea);
        this.setGeometry(line);
        this.setAppearance(app);
    }

}

将3d直线放置到场景中


代码如下:

package com.java3d.dennist.study;

import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.DirectionalLight;
import javax.media.j3d.Shape3D;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3f;

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

/**
 *
 *
 *  @version : 1.1
 * 
 *  @author  : 苏若年         <a href="mailto:DennisIT@163.com">发送邮件</a>
 *   
 *  @since   : 1.0      创建时间:    2013-5-6 下午02:50:08
 *    
 *  TODO     :
 *
 */
public class Line3DShape {

public Line3DShape(){

//构建空间 和物体

// 创建一个虚拟空间
        SimpleUniverse universe = new  SimpleUniverse();
        // 创建一个用来包含对象的数据结构
        BranchGroup group = new BranchGroup();
        // 创建直线形状对象把它加入到group中
        Shape3D shape=new LineShape();
        group.addChild(shape);

//灯光构造
        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) {
        new Line3DShape();
    }
}

运行效果:

其他形状

锥体: Cone cone=new Cone(.5f,1.0f,1,app)   //app即外观参数

球体: Sphere sphere=new Sphere(.5f,app);   //app即外观参数

圆柱体: Cylinder cylinder=new Cylinder(.5f,1.0f);

实例应用:Java3D实现空间椎体


代码如下:

package com.java3d.dennist.study;

import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.DirectionalLight;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3f;

import com.sun.j3d.utils.geometry.Cone;
import com.sun.j3d.utils.universe.SimpleUniverse;

/**
 *
 *
 *  @version : 1.1
 * 
 *  @author  : 苏若年         <a href="mailto:DennisIT@163.com">发送邮件</a>
 *   
 *  @since   : 1.0      创建时间:    2013-5-6 下午02:50:08
 *    
 *  TODO     : Java3D 各种三维形状展示
 *
 */
public class Java3DShape {

public Java3DShape(){

//构建空间 和物体

// 创建一个虚拟空间
        SimpleUniverse universe = new  SimpleUniverse();
        // 创建一个用来包含对象的数据结构
        BranchGroup group = new BranchGroup();
        // 创建一个椎体并把它加入到group中
          Cone cone=new Cone(.5f,1.0f,1,null) ;    //锥体
        group.addChild(cone);

//灯光构造

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) {
        new Java3DShape();
    }
}

效果图:

实例应用:Java3D实现空间球体


代码如下:

package com.java3d.dennist.study;

import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.DirectionalLight;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3f;

import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.universe.SimpleUniverse;

/**
 *
 *
 *  @version : 1.1
 * 
 *  @author  : 苏若年         <a href="mailto:DennisIT@163.com">发送邮件</a>
 *   
 *  @since   : 1.0      创建时间:    2013-5-6 下午02:50:08
 *    
 *  TODO     : Java3D 各种三维形状展示
 *
 */
public class Java3DShape {

public Java3DShape(){

//构建空间 和物体

// 创建一个虚拟空间
        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) {
        new Java3DShape();
    }
}

效果图:

实例应用:Java3D实现空间圆柱体


代码如下:

package com.java3d.dennist.study;

import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.DirectionalLight;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3f;

import com.sun.j3d.utils.geometry.Cylinder;
import com.sun.j3d.utils.universe.SimpleUniverse;

/**
 *
 *
 *  @version : 1.1
 * 
 *  @author  : 苏若年         <a href="mailto:DennisIT@163.com">发送邮件</a>
 *   
 *  @since   : 1.0      创建时间:    2013-5-6 下午02:50:08
 *    
 *  TODO     : Java3D 各种三维形状展示
 *
 */
public class Java3DShape {

public Java3DShape(){

//构建空间 和物体

// 创建一个虚拟空间
        SimpleUniverse universe = new  SimpleUniverse();
        // 创建一个用来包含对象的数据结构
        BranchGroup group = new BranchGroup();
        // 创建一个圆柱形状并把它加入到group中
        Cylinder cylinder=new Cylinder(.5f,1.0f); //圆柱型
        group.addChild(cylinder);

//灯光构造

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) {
        new Java3DShape();
    }
}

效果图:

(0)

相关推荐

  • Java 23种设计模型详解

    设计模式(Design Patterns)                                   --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每

  • Java 高并发三:Java内存模型和线程安全详解

    网上很多资料在描述Java内存模型的时候,都会介绍有一个主存,然后每个工作线程有自己的工作内存.数据在主存中会有一份,在工作内存中也有一份.工作内存和主存之间会有各种原子操作去进行同步. 下图来源于这篇Blog 但是由于Java版本的不断演变,内存模型也进行了改变.本文只讲述Java内存模型的一些特性,无论是新的内存模型还是旧的内存模型,在明白了这些特性以后,看起来也会更加清晰. 1. 原子性 原子性是指一个操作是不可中断的.即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其它线程干扰

  • 浅析Java内存模型与垃圾回收

    1.Java内存模型 Java虚拟机在执行程序时把它管理的内存分为若干数据区域,这些数据区域分布情况如下图所示: 程序计数器:一块较小内存区域,指向当前所执行的字节码.如果线程正在执行一个Java方法,这个计数器记录正在执行的虚拟机字节码指令的地址,如果执行的是Native方法,这个计算器值为空. Java虚拟机栈:线程私有的,其生命周期和线程一致,每个方法执行时都会创建一个栈帧用于存储局部变量表.操作数栈.动态链接.方法出口等信息. 本地方法栈:与虚拟机栈功能类似,只不过虚拟机栈为虚拟机执行J

  • Java并发编程中的生产者与消费者模型简述

    概述 对于多线程程序来说,生产者和消费者模型是非常经典的模型.更加准确的说,应该叫"生产者-消费者-仓库模型".离开了仓库,生产者.消费者就缺少了共用的存储空间,也就不存在并非协作的问题了. 示例 定义一个场景.一个仓库只允许存放10件商品,生产者每次可以向其中放入一个商品,消费者可以每次从其中取出一个商品.同时,需要注意以下4点: 1.  同一时间内只能有一个生产者生产,生产方法需要加锁synchronized. 2.  同一时间内只能有一个消费者消费,消费方法需要加锁synchro

  • Java 高并发七:并发设计模型详解

    1. 什么是设计模式 在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题 ,所提出的解决方案.这个术语是由埃里希·伽玛(Erich Gamma)等人在1990年代从建筑设计领 域引入到计算机科学的. 著名的4人帮: Erich Gamma,Richard Helm, Ralph Johnson ,John Vlissides (Gof) <设计模式:可复用面向对象软件的基础>收录23种模式 2. 单例模式 单例对象的类必须保证只有一个实例存在.许

  • 浅谈Java利用表格模型创建表格 原创

    用来创建表格的 JTable 类并不负责存储表格中的数据,而是由表格模型负责存储.当利用 JTable 类直接创建表格时,只是将数据封装到了默认的表格模型中.接下来,我们来学习表格模型的使用方法. 利用表格模型创建表格 接口 TableModel 定义了一个表格模型,抽象类 AbstractTableModel 实现了 TableModel 接口的大部分方法,只有一下三个抽象方法没有实现. (1)public int getRowCount() (2)public int getColumnCo

  • java自定义线程模型处理方法分享

    看过我之前文章的园友可能知道我是做游戏开发,我的很多思路和出发点是按照游戏思路来处理的,所以和web的话可能会有冲突,不相符合. 来说说为啥我要自定义线程模型呢? 按照我做的mmorpg或者mmoarpg游戏划分,线程被划分为,主线程,全局同步线程,聊天线程,组队线程,地图线程,以及地图消息分发派送线程等: 一些列,都需要根据我的划分,以及数据流向做控制. 游戏服务器,主要要做的事情,肯定是接受玩家的 命令请求 -> 相应的操作 -> 返回结果: 在服务器端所有的消息都会注册到消息管理器里,然

  • Java3D实例之创建空间几何模型的实现方法

    Java3D,算是比较古老的技术,Java8中Oracle对JavaFX支持了Java3D. 相关资料参照Oracle官网 <JDK8目前还没有正式发布 Early Access版本下载地址 http://jdk8.java.net>环境搭建Java3D开发环境,JDK下载见Oracle官网.安装后在安装目录下的lib文件中找到Java3D驱动包,添加的自己的项目中Java3D实现简单几何空间图形说明: 实例应用:创建3D直线 复制代码 代码如下: package com.java3d.den

  • Java 创建线程的两个方法详解及实例

    Java 创建线程的两个方法 Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法: ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢?

  • Java 创建动态类和查看方法列表信息的实例

     Java 创建动态类和查看方法列表信息的实例 Sample code : import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.lang.reflect.Type; import java.util.ArrayList; import

  • JS创建事件的三种方法(实例代码)

    1.普通的定义方式 <input type="button" name="Button" value="确定" onclick="Sfont=prompt('请在文本框中输入红色','红色',' 提示框 '); if(Sfont=='红色'){ form1.style.fontFamily='黑体'; form1.style.color='red'; }" /> 这是最常见的一种定义方式,直接将JS事件定义在需要的

  • Spring Bean实例的创建及构造器的挑选

    一.举个栗子 public class BeanServiceImpl implements BeanService { } @Configuration public class ConfigurationBean { @Bean public BeanService beanService() { BeanServiceImpl beanService = new BeanServiceImpl(); System.out.println("beanService: " + bea

  • 在python中创建表格的两种方法实例

    目录 日常拉呱: 创建表格一般有两种方法: 一:通过导入xlwt创建 二:通过导入csv库来创建 1.写入数据 2.读取数据 总结 日常拉呱: 最近在学习爬虫模拟登陆各个软件,老师留有作业,模拟登录京东并爬取系列物品,可惜我还是个小白菜鸟,还是处于迷迷糊糊的状态,只能先了解一下边缘知识.爬取完数据,你是否在纠结这些数据放在哪呢?建一个表格或许会帮助到你! 创建表格一般有两种方法: 一:通过导入xlwt来创建,这种方法我比较喜欢,因为它够直观够容易理解,但是相对而言比较麻烦. 二:通过导入csv库

  • php模拟用户自动在qq空间发表文章的方法

    本文实例讲述了php模拟用户自动在qq空间发表文章的方法.分享给大家供大家参考.具体分析如下: 我们这里是一个简单的利用php来模拟登录后再到QQ空间发送文章的一个简单的程序,有需要的朋友可以参考,或改进可以给我意见,代码如下: 复制代码 代码如下: <?php //模拟get post请求函数 /* 函数说明: 功能:请求方式可以get,post,可以发送的cookie,保存的cookiefile文件 参数:$url-----请求url    $referer---来源url    $post

  • Spring框架花式创建Bean的n种方法(小结)

    常用的从容器中获取bean实例使用这样的方式: @Test public void test() { Persion p = (Persion) ioc.getBean("p1"); System.out.println(p); } 常用的在容器中配置组件使用这样的方式: <bean id="p1" class="com.gql.bean.Persion"> <property name="name" val

  • 用命令创建MySQL数据库(de1)的方法

    一.连接MYSQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1. 连接到本机上的MYSQL. 首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户 名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码. 如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是: mysql> 2.连接到远程主机上的MYSQL.假设远程主机的IP为

  • PHP创建单例后台进程的方法示例

    本文实例讲述了PHP创建单例后台进程的方法.分享给大家供大家参考,具体如下: 可以通过如下语句启动一个PHP后台进程: $command = " php script.php "; $pid = exec("nohup $command > /dev/null 2>&1 & echo $!"); nohup表示这个进程独立于创建的用户,可以以守护方式运行. 如果需要这个后台进程是单例运行的,那么可以通过下面的方法来记录/判断进程是否已运行

随机推荐