在计算机中如何表示三维人体模型

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在计算机中如何表示三维人体模型

关于人体建模技术的研究始于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 可以方便的从服务器传送到客户端,然后在客户端运行,具有优良的可传输性。

支持简单的脚本控制场景与用户的交互行为。Java3D 则是Java 语言在三维应用的扩展,Java3D的功能和可编程性更强,Java3D 有丰富的Java 类库的支持,实现各种编程行为,这是VRML 难以达到的。

3.人体曲面建模

人体曲面建模有两个关键的步骤:人体曲面数据的获取和在这些数据的基础上的曲面建模方法的确定。在曲面数据获取方面本节主要分析了传统第1 期陈君:一种构建三维人体模型的方法37测量方法的缺陷并介绍了现代先进的自动测量方法;在曲面建模方法方面本节通过分析了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 相邻轮廓线间三角剖分

用最短对角线法实现轮廓线间三角面片连接的近似最优解。如图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 最短对角线法示意图4.Java 3D 人体模型实现在实现人体建模的过程中,为了更好的运用空间数据点的三角剖分方法,我们根据人体的生理形武汉科技学院学报2009 年38

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

4.1 人体源数据文件

在本课题的研究过程中,选择了一种非常简单方便的获取人体曲面数据的方法。通过研究分析Poser 软件导出的3DS 文件结构,获取有用的人体曲面顶点信息。Poser 是一款非常优秀的三维人体造型专用软件,它附带了很多标准的人体模型库,因此,可以将这些标准人体模型文件里的有用人体曲面坐标信息提取出来,以作为人体建模研究的数据。3DS 文件是基于“块”存储的,这些块描述了诸如场景、每个编辑窗口(Viewport)的状态、材质、网格等[9]。每个块都包含一个ID 和块长度的块头,如果对该块的信息不感兴趣的话,可以直接跳过该块读取下一个块。跟许多文件格式类似,为了读取的方便,3DS 文件中数据的存储方式是Intel 式的,也就是说是高位放在后面,低位放在前面。比如:网

相关文档
最新文档