我的订单|我的收藏|我的商城|帮助中心|返回首页
虚拟现实新闻>VR>行业资讯>行业知识

java3D 构建三维人体模型的方法

文章来源:第三维度 作者:Jessica 发布时间:2010年10月11日 点击数: 字号:
0,Q1,…,Qn-1。点列均按逆时针方向排列。如果将上述点列分别依次用直线连接起来,则得到这两条轮廓线的多边形近似表示。每一个直线段P Pi i+1或QQi i+1称为轮廓线线段。如图2 所示,连接上轮廓线上一点与下轮廓线上一点的线段称为跨距。很显然,一条轮廓线线段,以及将该线段两端点与相邻轮廓线上的一点相连的两段跨距构成了一个三角面片,成为基本三角面。而该两段跨距则分别成为左跨距和右跨距。实现对所有数据点的三角剖分就是要用一系列的互相连接的基本三角面将所有相邻的二维轮廓线连接起来。H.Fuchs 指出[8],连接上、下两条轮廓线上各点所形成的众多基本三角面必须满足以下两个条件:

    (1)每一个轮廓线线段必须而且只能在一个基本三角面片中出现;(2)如果一个跨距在某一基本三角面中为左跨距,则该跨距是而且仅是另一个基本三角面片的右跨距。

图1 相邻轮廓线间三角剖分
图1 相邻轮廓线间三角剖分

    用最短对角线法实现轮廓线间三角面片连接的近似最优解。如图2 所示,设上轮廓线为P,下轮廓线为Q,不失一般性,设Q 上距Pi 点最近的点为Qj,则以跨距P Q i j为基础用最短对角线法来构造两轮廓线间的三角面片。如对角线P Q i j +1<P Q i +1 j,则连接Pi,Qj+1,形成三角面片QjPiQj+1,否则,连接Pi+1,Qj。这就是最短对角线方法的基本原理。

图2 最短对角线法示意图
图2 最短对角线法示意图

    4.Java 3D 人体模型实现

    在实现人体建模的过程中,为了更好的运用空间数据点的三角剖分方法,我们根据人体的生理形态特征,将人体分成头、颈、躯干等19 个部分。首先从3DS 文件中读取人体各个部件曲面的顶点信息以数组的形式存储起来, 应用IndexedTriangleArray 类实现数据点三角剖分,最后利用Java 3D 强大的三维显示和处理功能实现人体的显示和交互控制。

    4.1 人体源数据文件

    在本课题的研究过程中,选择了一种非常简单方便的获取人体曲面数据的方法。通过研究分析Poser 软件导出的3DS 文件结构,获取有用的人体曲面顶点信息。Poser 是一款非常优秀的三维人体造型专用软件,它附带了很多标准的人体模型库,因此,可以将这些标准人体模型文件里的有用人体曲面坐标信息提取出来,以作为人体建模研究的数据。

    3DS 文件是基于“块”存储的,这些块描述了诸如场景、每个编辑窗口(Viewport)的状态、材质、网格等[9]。每个块都包含一个 ID 和块长度的块头,如果对该块的信息不感兴趣的话,可以直接跳过该块读取下一个块。跟许多文件格式类似,为了读取的方便,3DS 文件中数据的存储方式是 Intel 式的,也就是说是高位放在后面,低位放在前面。比如:网格块的块头 ID,0x4000 在文件里是以00 40存放的,占用两个Byte。

    每1 个3DS 文件的开头都是由1 个根块构成,其 ID 是0x4d4d。根块内的块称为主块 ,主块共有2 种,分别为3D 主编辑块和关键帧块,前者的 ID为3D3D,后者的 ID 为B000。3D 主编辑块是编辑程序数据的开始,即物体形体数据定义的开始。主块后面是该主块所包括的子块。3D 主编辑块的子块包括材质列表块、物体块等。而物体块又包括了网格块、亮度信息块、相机参数块等。网格块包括顶点列表块、面信息块、位置信息块等。这几个层次的数据块结构定义了物体的拓扑信息。同样材质列表块则包含了材质的名称、环境光、散射光、反射光等物体的材质信息。3DS 主要文件结构如图3 所示:

图3 3DS 文件结构图
图3 3DS 文件结构图

    对3DS 文件结构了解后,下面介绍本论文三维人体建模所要用到的细节信息。0x4D4D:文件头,他的大小就是整个文件的大小。0x3D3D:3D 编辑块,描述了3D 对象的数据。本课题所需数据就是从这个块中获取。0x4000:该块是一个对象描述块,该块中就包含了顶点列表块0x4110。见表1:

表1 顶点列表块
表1 顶点列表块

    其中X、Y、Z 一直重复顶点数目次,这样就的到所有顶点。

    在本论文程序中,我们只需要提取人体曲面顶点信息,因此,我们可以忽略其他很多无关块的大量信息 ,这不会影响对所需信息的提取,这是因为3DS 文件块结构的格式可以让我们跳过很多块而不影响对其他块的信息的读取。

    4.2 编程步骤

    4.2.1 建立工程,导入所需包

    程序中用到的主要包介绍:Javax.media.j3d 该包是java 3D 的主要包,为java 3D API 提供核心的集合类。Javax.vecmath 该包含有对java 3D 很有用的对象类,这是一些关于向量,矩阵和其他数学对象的类。

    Com.sun.j3d.utils.universe,com.sun.j3d.utils. geometry尽管com.sun.j3d.*包并非java 3D 的核心包,但是这两个包却包含许多可以用来方便地构造基元、视图和java 3D 中其他对象的功能类。

    4.2.2 IndexedTriangleArray 类实现数据点三角剖分

    在本程序中,根据人体对称性将三维人体分为头、颈、胸、腹、上臂、下臂part1-part19 等19 个部分分别运用IndexedTriangleArray 类实现三维重构。IndexedTriangleArray 类的构造函数如下[10]:IndexedTriangleArray ( int vertexCount, intvertexFormat, int indexCount)。

    参数介绍:vertexCount: IndexedTriangleArray类的对象中包含的总的顶点数。vertexFormat: 表是这些顶点的格式, 是一个多选项。其中,COORDINATES:表示在该GeometryArray数组中包含顶点的坐标,并且该项是一个必选项;NORMALS: 表示包含每个顶点的法向量;COLOR_3 或COLOR_4:表示每个顶点的颜色

共3页 您在第2页 首页 上一页 1 2 3 下一页 尾页 跳转到页 本页共有3218个字符
  • 暂无资料
  • 暂无资料
  • 暂无资料
  • 暂无资料
  • 暂无资料