JavaFX 3D部分介绍(1) 3D Shape



  众所周知,3D模块是JavaFX 8中非常重要的组成部分。而在JavaFX 8的目前版本中,JavaFX 3D的各种特性也在陆续添加中。下面,我来对JavaFX 8中现有的3D部分进行简单的介绍。


 3D Shapes

  JavaFX 3D Graphics目前提供了对3D Shape的创建。其中包括,内置定义的3D物体,和用户自定义的3D物体。

  内置的3D物体包括:boxes,cylindersspheres。其实还是很少的,如下图所示:

  


  其中,类的继承结构如下:

  

java.lang.Object
  javafx.scene.Node
     javafx.scene.shape.Shape3D
        javafx.scene.shape.MeshView
        javafx.scene.shape.Box
        javafx.scene.shape.Cylinder
        javafx.scene.shape.Sphere

  Box,Cylinder,Sphere都是继承与Shape3D,而且还是Node的子类。由此可见,3D的物体可以直接作为普通Node节点来使用。

  创建起来,也是非常的简单。

  

[java]  view plain copy
  1. Box myBox = new Box(width, height, depth);  
  2.   Cylinder myCylinder = new Cylinder(radius, height);  
  3.   Cylinder myCylinder2 = new Cylinder(radius, height, divisions);  
  4.   Sphere mySphere = new Sphere(radius);  
  5.   Sphere mySphere2 = new Sphere(radius, divisions);  

  下面,我们来看看用户定义的3D物体。

  用户定义3D物体,主要使用的是TriangleMeshTriangle mesh 在3D中是最常用和基础的mesh

 Triangle Mesh包含了Points的数组,纹理映射的数组以及由三角元素的mesh组成的面。(如果接触过OpenGL等的

编程的话,对这里应该是很容易理解的。)


  接下来,我们来看看如何创建一个TriangleMesh

  

  1.首先创建一个TriangleMesh的实例。

  

[java]  view plain copy
  1. mesh = new TriangleMesh();  


  2.定义描述Mesh顶点的数组

[java]  view plain copy
  1. float points[] = { ... };  
  2. mesh.getPoints().addAll(points);  


  3.描述每个定点的纹理坐标映射

[java]  view plain copy
  1. float texCoords[] = { ... };  
  2. mesh.getTexCoords().addAll(texCoords);  

  4.使用定点数组来创建各个三角形组成的面

[java]  view plain copy
  1. int faces[] = { … };  
  2. mesh.getFaces().addAll(faces);  
  

  5.定义每个面所属的光滑组(Smoothing group)

[java]  view plain copy
  1. int smoothingGroups[] = { … };  
  2. mesh.getFaceSmoothingGroups().addAll(smoothingGroups);  

   

  不论这个面是smooth还是faceted,Smoothing group都会调整上面的顶点的法线。如果,每个单独的面都有一个相同的Smoothing group,那么这个mesh将会变得非常的光滑,否则,则相反。


------------------------------------------------------------------------------------------------------

  有一段时间没有写博客了,工作的中心由android转为Unity3D了,所以最近一直在做Unity3D相关的。抽空看了下JavaFX 3D API,在这里就做一点简单的评价,JavaFX 3D API 没有Unity3D方便,但比Unity3D自由一些(例如可以自定义3D物体,自定义顶点数组,纹理映射等),没有OpenGL自由(封装过的必然缺陷),但比OpenGL方便简单些(不用写那么多看得头晕的GL函数),属于折中的情况。大家可以根据自己的情况来使用。

--------------------------------------------------------------------------------------

  众所周知,3D模块是JavaFX 8中非常重要的组成部分。而在JavaFX 8的目前版本中,JavaFX 3D的各种特性也在陆续添加中。下面,我来对JavaFX 8中现有的3D部分进行简单的介绍。


 3D Shapes

  JavaFX 3D Graphics目前提供了对3D Shape的创建。其中包括,内置定义的3D物体,和用户自定义的3D物体。

  内置的3D物体包括:boxes,cylindersspheres。其实还是很少的,如下图所示:

  


  其中,类的继承结构如下:

  

java.lang.Object
  javafx.scene.Node
     javafx.scene.shape.Shape3D
        javafx.scene.shape.MeshView
        javafx.scene.shape.Box
        javafx.scene.shape.Cylinder
        javafx.scene.shape.Sphere

  Box,Cylinder,Sphere都是继承与Shape3D,而且还是Node的子类。由此可见,3D的物体可以直接作为普通Node节点来使用。

  创建起来,也是非常的简单。

  

[java]  view plain copy
  1. Box myBox = new Box(width, height, depth);  
  2.   Cylinder myCylinder = new Cylinder(radius, height);  
  3.   Cylinder myCylinder2 = new Cylinder(radius, height, divisions);  
  4.   Sphere mySphere = new Sphere(radius);  
  5.   Sphere mySphere2 = new Sphere(radius, divisions);  

  下面,我们来看看用户定义的3D物体。

  用户定义3D物体,主要使用的是TriangleMeshTriangle mesh 在3D中是最常用和基础的mesh

 Triangle Mesh包含了Points的数组,纹理映射的数组以及由三角元素的mesh组成的面。(如果接触过OpenGL等的

编程的话,对这里应该是很容易理解的。)


  接下来,我们来看看如何创建一个TriangleMesh

  

  1.首先创建一个TriangleMesh的实例。

  

[java]  view plain copy
  1. mesh = new TriangleMesh();  


  2.定义描述Mesh顶点的数组

[java]  view plain copy
  1. float points[] = { ... };  
  2. mesh.getPoints().addAll(points);  


  3.描述每个定点的纹理坐标映射

[java]  view plain copy
  1. float texCoords[] = { ... };  
  2. mesh.getTexCoords().addAll(texCoords);  

  4.使用定点数组来创建各个三角形组成的面

[java]  view plain copy
  1. int faces[] = { … };  
  2. mesh.getFaces().addAll(faces);  
  

  5.定义每个面所属的光滑组(Smoothing group)

[java]  view plain copy
  1. int smoothingGroups[] = { … };  
  2. mesh.getFaceSmoothingGroups().addAll(smoothingGroups);  

   

  不论这个面是smooth还是faceted,Smoothing group都会调整上面的顶点的法线。如果,每个单独的面都有一个相同的Smoothing group,那么这个mesh将会变得非常的光滑,否则,则相反。


------------------------------------------------------------------------------------------------------

  有一段时间没有写博客了,工作的中心由android转为Unity3D了,所以最近一直在做Unity3D相关的。抽空看了下JavaFX 3D API,在这里就做一点简单的评价,JavaFX 3D API 没有Unity3D方便,但比Unity3D自由一些(例如可以自定义3D物体,自定义顶点数组,纹理映射等),没有OpenGL自由(封装过的必然缺陷),但比OpenGL方便简单些(不用写那么多看得头晕的GL函数),属于折中的情况。大家可以根据自己的情况来使用。

--------------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值