首页|行业资讯|企业名录|周边产品|数字城市|增强现实|工业仿真|解决方案|虚拟医疗|行业仿真|图形处理|军事战场
资讯首页
行业资讯 >> 专业文献>>正文
java3D 构建三维人体模型的方法
2010年9月4日    评论:    分享:

    来源:第三维度
    作者:陈 君 陈永强

    摘 要:本文针对网上三维物体显示的需要,介绍了开发工具java 3D 的特点。在深入分析3DS文件结构的基础上,通过读取3DS 建立的三维人体文件数据,根据人体模型数据的特点,使用散乱数据点三角剖分技术形成曲面三角面逼近建立了三维人体模型,并开发了一套基于java 3D 的三维人体展示系统。

    1.引言

    关于人体建模技术的研究始于20 世纪70 年代末。在目前研究领域中,常见的算法主要有曲面建模、基于物理特性建模和基于解剖学的分层建模方法[1]。曲面建模又称表面建模,这种建模方法的重点是由给出的离散数据点构成光滑过度曲面,使这些曲面通过或逼近这些离散点。为使三维人体动画仿真效果更佳, A.H.Barr 在1987 年提出了基于物理特性的建模思想,将人体的物理特性加入到其几何模型中,通过数值计算进行行为仿真。为了进一步体现人体生理结构的层次性,Chadwick et al.在1989 年提出了“人体分层表示法”的感念,在此基础上Thalmann et al.在1996 提出了一种更加高效的基于解剖学的分层建模算法来实现人体的建模与仿真。

    在研究java 3D 人体建模的过程中,本文用一种把java 3D 和人物造型软件Poser 结合起来的方便办法。在获取人体曲面数据阶段通过对三维图形软件导出的3DS 文件研究的基础上获得java 3D 建模所需的人体表面顶点数据,避免了使用现代自动测量工具所需耗费的财力物力,最终通过java 3D建立人体模型实现环境渲染和交互控制,为进一步的实现动态修改人体模型打下基础。

    2.Java 3D 简介

    Java 最大的特点在于它的平台无关性,在Windows 95/98,Windows NT,Solars,Unix 等平台上,都使用相同的代码,Java 实现了"Write once,Run anywhere"。Java 的平台无关性使其特别适合于互联网环境下编写应用程序。

    Java3D 是适用于网络环境的跨平台的三维图形开发工具包,是Java 2 JDK 的标准扩展的一组API(Application Programming Interface)[2],对底层的图形库OpenGL 和DirectX 进行了封装,更容易掌握,编程效率更高,保证高效的执行效率。

    Java3D 封装了大量的类,编写Java3D 程序时,大多情况下只需找到所需的类并加以应用。

    和其它Java 程序一样,利用Java3D 可以编写Application 程序和Applet 程序,用来生成三维场景的Applet 可以方便的从服务器传送到客户端,然后在客户端运行,具有优良的可传输性。相对于VRML,VRML 只是一种描述语言,只能支持简单的脚本控制场景与用户的交互行为。Java3D 则是Java 语言在三维应用的扩展,Java3D的功能和可编程性更强,Java3D 有丰富的Java 类库的支持,实现各种编程行为,这是VRML 难以达到的。

    3.人体曲面建模

    人体曲面建模有两个关键的步骤:人体曲面数据的获取和在这些数据的基础上的曲面建模方法的确定。在曲面数据获取方面本节主要分析了传统测量方法的缺陷并介绍了现代先进的自动测量方法;在曲面建模方法方面本节通过分析了NURBS曲面的优缺点,采用了较简单的曲面三角面逼近的三维人体建模方法。

    3.1 人体数据获取

    人体曲面数据的获取是建立三维人体模型的前提,也是一项基础性的工作。人体形状为复杂的曲面,要对其进行较为精确的测量并获得全面细致的人体数据是很困难的。为了建立统一的测量方法,常根据明显、固定、意测的特点,选取骨骼端点、突起点和肌肉沟槽等部位作为测量基准。传统的人体测量方法主要采用软尺、测高计、滑动计等手工工具,依据测量基准对人体进行测量,工具简单,方法简便,可以获得较细致的人体数据,但这种传统测量方法在精确性等方面存在很多的缺陷,随着服装CAD 技术的普及和深入,落后的人体测量技术已经成为一个制约因素。因此,国内外出现了很多先进的以现代光学为基础,融光电子学、计算机图像学、信息处理、计算机视觉等科学技术为一体的三维人体自动测量方法[3]。主要有光学图像法(干涉法、莫尔法、相位法等)和基于图像传感器的光电法。与传统的测量方法相比,三维人体自动测量方法主要特点是快速、准确、效率高等[4]。

    3.2 曲面三角面逼近的三维人体建模

    在三维人体建模中运用的最多的就是曲面建模,其中NURBS 曲线曲面由于最具一般性及其突出的优点,已经成为曲面建模的工业标准,被广泛用在人体曲面造型中[5]。但是NURBS 曲面建模的算法比较复杂,而且要考虑间隙差值运算、光滑拼接等问题,总的来说是一种很复杂的人体建模方法。而采用三角形作为基元面构成物体表面的算法相对简单,只是所需处理的数据量比较大,对计算机的内存容量和相应速度要求比较高。但是随着计算机技术的飞速发展,再加上java 3D 对三角小平面处理的优化,这一问题已经得到很好地解决。

    空间三角剖分是以平面三角剖分算法为基础,由平面点扩展到三维空间散乱数据点。空间三角剖分可分为对三维散乱数据投影域的剖分和在空间直接剖分两种[6]。然而当那些散乱的数据有一定规律的时候,或者经过我们的预处理,变的比较有规律的时候,比如三维人体的躯干、手臂和大小腿等部分,其基本形状为圆柱体,其上顶点分布比较有规律,我们就可以采用一种简单的空间数据点三角剖分方法,实现由二维轮廓线到三维人体的重构[7]。

    它的基本思想是:在人体表面作横向截面线,当截面线比较密集的时候,假设两条相邻的横向截面轮廓线如下图2,上轮廓线上的点列为P0,P1,…,Pm-1;下轮廓线上的点列为Q0,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:表示每个顶点的颜色,COLOR_3表示没有Alpha 信息,也就是指顶点数组包括没有透明度的颜色;当不指定COLOR_3 或者COLOR_4 顶点格式颜色时,则GeometryArray 对象中的每个顶点的颜色都是黑色;TEXTURE_ COORDINATE_3,表示每个顶点的3D 纹理坐标。indexCount:该参数是指从总的顶点数中选择出的顶点总数,允许顶点重复使用,允许indexCount 超过vertexCount 的值。

    用该类时,首先需要根据给定的的顶点的一维数组的序号,建立要用到的顶点的索引数组index,该数组是一个一维数组,每个元素保存选择出的一个顶点的元素序号。然后再用继承自IndexedGeometryArray 的方法setColorIndices(0,index)、setCoordinateIndices(0,index)分别设置颜色、坐标数组与索引数组之间的对应关系。

    对应本程序,以第4 部分小腿部分为例,定义floatvert[]数组存放由分析3DS 文件得出的顶点坐标,定义float normals[]数组存放顶点的法向量,定义int index[]数组存放用到的顶点编号。具体程序实现如下:

    IndexedTriangleStripArray line = new IndexedTriangle

    StripArray(vert.length,IndexedTriangleStripArray.COORDINATES|IndexedTriangleStripArray.NORMAS|IndexedTriangleStripArray.COLOR_3,index.length,count);

    4.2.3 对三维模型进行交互控制

    三维图形的几何变换矩阵可以用矩阵T3D表示,表示形式如下[11]:

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

    [a41 a42 a43]产生平移变换。

    Java 3D包含了Transform3D类来表示3D放射变换或投影变换。在场景图中,一个TransformGroup节点利用Transform3D对象来定义其变换,Transform3D在其内部保留了一个4*4的double型矩阵以表示其变换。本程序中,通过调用voidsetTranslation()方法建立平移变换,调用void setScale()方法建立缩放变换。并通过鼠标行为类MouseZoom、MouseRotate和MouseTranslate,实现鼠标对3D人体模型交互控制。

    4.2.3 最终显示结果

   

图4 最终效果
图4 最终效果

    5.结论

    应用本文方法开发出的三维人体展示系统,既利用了Poser 建立人体模型方便快捷的特点,又利用了java 3D 容易实现渲染和交互的特点,避免了各自的缺陷,使真实感人体人体建模能更轻松。在本文的基础上可以进一步进行NURBS 曲面拟合,实现面向真实人体着装的需要,输入服装用的人体尺寸,修改相应的主要造型特征与尺寸,得到特定用户所需的个性化人体模型。在服装CAD 领域有着良好的前景和广阔的发展空间。
   

标签:java三维人体
上一篇:Virtools进阶教程:动力学控制动态链制作
下一篇:基于HLA虚拟现实仿真解决方案
网友评论:java3D 构建三维人体模型的方法
评论
留名: 验证码:
您可能还需要关注一下内容:
·Java3D应用于现代远程教育的关键技术
·基于VRML—JAVA的机器人运动仿真研究
·面向体育训练的三维人体运动仿真与视频分析
·Java3D应用于现代远程教育的关键技术
·Java3D实现浮动小球游戏
·Java3D入门教程3:与Java平台技术结合
·Java3D入门教程2:新的观察模式
·java3D入门教程1:场景图结构
·X3D和Java的虚拟现实人体运动仿真研究
·java3D 构建三维人体模型的方法
☏ 推荐产品

Ladybug5全景
商家:力方国际

ProJet®
商家:力方国际

ProJet®
商家:视科创新

Premium1.5
商家:视科创新

巴可HDX主动立体投
商家:德浩科视

巴可HDF-W26投
商家:德浩科视

巴可30000流明2
商家:德浩科视

巴可4万流明2K投影
商家:德浩科视
☞ 外设导航
☏ 企业名录
【广州】中科院广州电子技术有限公司
【北京】第二空间(北京)科技有限公司
【北京】幻维世界(北京)网络科技有限公司
【厦门】厦门惠拓动漫科技有限公司
【厦门】厦门幻眼信息科技有限公司
【深圳】深圳南方百捷文化传播有限公司
【北京】北京思源科安信息技术有限公司
【上海】上海殊未信息科技有限公司
【北京】北京赢康科技开发有限公司
【武汉】武汉科码软件有限公司
友情链接 关于本站 咨询策划 行业推广 广告服务 免责声明 网站建设 联系我们 融资计划
北京第三维度科技有限公司 版权所有 京ICP备09001338
2008-2016 Beijing The third dimension Inc. All Rights Reserved.
Tel:010-57255801 Mob:13371637112(24小时)
Email:d3dweb@163.com  QQ:496466882
扫一扫 第三维度
官方微信号