呂 珍,謝 倩,祝雙武,蘭振華
(1.西安工程大學(xué) 紡織與材料學(xué)院,陜西 西安 710048; 2.西安工程大學(xué) 服裝與藝術(shù)設(shè)計(jì)學(xué)院,陜西 西安 710048; 3.河南省體育彩票管理中心 技術(shù)開(kāi)發(fā)部,河南 鄭州 450003)
目前,基于二維拓?fù)淇臻g的服裝CAD技術(shù)已很普遍且基本成熟并趨于穩(wěn)定.相對(duì)于二維服裝CAD而言,三維服裝CAD具有立體、直觀、易操作可提供真實(shí)的試衣效果等諸多優(yōu)點(diǎn).進(jìn)入21世紀(jì)以來(lái),三維建模技術(shù)飛速發(fā)展,例如袁銘等人提出的一種古建筑三維建模方法[1]為從現(xiàn)實(shí)世界獲取數(shù)據(jù)并進(jìn)一步在計(jì)算機(jī)世界進(jìn)行加工建模提供了依據(jù);古文物藝術(shù)造型的數(shù)字化與虛擬展示[2]、定制化人像產(chǎn)品[3]、皮影人物造型[4]等三維模型的研究均為虛擬三維人體模型的進(jìn)一步發(fā)展奠定了基礎(chǔ).在織物的三維著裝效果展示方面,有的學(xué)者在幾何造型的基礎(chǔ)上,以明暗處理和紋理映射技術(shù)來(lái)實(shí)現(xiàn)三維著裝效果的真實(shí)感;部分學(xué)者在采用光照紋理進(jìn)一步實(shí)現(xiàn)三維著裝效果的真實(shí)感的描繪上進(jìn)行了有益的探索.從產(chǎn)生的圖像方面分析,能夠較真實(shí)地反映二維圖像的三維著裝效果[5],但是紋理重復(fù)的均勻性依賴于構(gòu)造服裝模型的數(shù)據(jù),其稀疏不均也會(huì)造成紋理分布不勻.
在利用人臺(tái)進(jìn)行三維服裝展示時(shí),人臺(tái)、衣殼曲面的生成是建模的過(guò)程,也是三維服裝真實(shí)感效果和紋理映射的基礎(chǔ),建模過(guò)程為:獲得原始數(shù)據(jù)點(diǎn)并進(jìn)行預(yù)處理→對(duì)數(shù)據(jù)插入,提高精度→構(gòu)造三維模型點(diǎn)云→用Bezier曲面法填充模型[6].
開(kāi)發(fā)三維服裝CAD系統(tǒng)最基礎(chǔ)的工作是建立三維人體及服裝模型,而人體和服裝形狀為復(fù)雜的曲面,要對(duì)其進(jìn)行較為精確的測(cè)量且獲得全面細(xì)致的數(shù)據(jù)很困難.目前對(duì)于人體模型的獲取方法如:王萍等人采用非接觸式三維人體測(cè)量?jī)x獲取人體數(shù)據(jù),并用Excel和Spss軟件對(duì)數(shù)據(jù)進(jìn)行分析[7];劉浩翰等人獲得人體的三維數(shù)據(jù)并利用NURBS進(jìn)行人體幾何造型[8].人體模型的獲取方法通常有兩種:一種是通過(guò)采用三維坐標(biāo)測(cè)量?jī)x(或同類其他設(shè)備)測(cè)得人體三維數(shù)據(jù)為依據(jù),并利用Bezier曲面或B樣條曲面進(jìn)行人體的擬合;另一種是以大量測(cè)得的人體三維數(shù)據(jù)為依據(jù),利用三角面片對(duì)人體曲面進(jìn)行重構(gòu)[9-10].
本文在分析眾多前人研究的基礎(chǔ)上,找到了一種獲取別人測(cè)量數(shù)據(jù)的簡(jiǎn)易方法.鑒于3D MAX優(yōu)秀的三維制圖功能且有眾多三維人體模型資源,故可將此類標(biāo)準(zhǔn)人體模型文件內(nèi)的有用人體曲面坐標(biāo)信息提取出來(lái),并利用三角面片對(duì)人體曲面進(jìn)行重構(gòu).
OpenGL (開(kāi)放性圖形庫(kù),Open Graphic Library),是美國(guó)高級(jí)圖形和高性能計(jì)算機(jī)系統(tǒng)公司SGI所開(kāi)發(fā)的三維圖形標(biāo)準(zhǔn)庫(kù),具有繪制三維圖形的各項(xiàng)功能.以其為基礎(chǔ)開(kāi)發(fā)的應(yīng)用程序可以方便地在各個(gè)平臺(tái)間移植,特別是在三維圖形的功能上非常優(yōu)秀[11-12].然而OpenGL的專長(zhǎng)并不是建模,因?yàn)镺penGL并沒(méi)有提供建立三維模型的高級(jí)命令,它是通過(guò)基本的幾何圖元點(diǎn)、線及多邊形建立三維立體模型.相比而言,利用3D Studio MAX建立三維立體模型則非常容易,但建立的模型缺乏編程性和可控制性,而這正是OpenGL的優(yōu)勢(shì)所在.基于此種情況,用3D Studio MAX建立三維立體模型導(dǎo)出為3DS文件,然后將3DS文件導(dǎo)入用Delphi搭建的CAD軟件平臺(tái),可得到任何三維立體模型.
根據(jù)3DS文件格式,利用計(jì)算機(jī)編程,從3DS文件中提取有用的人體曲面的頂點(diǎn)信息,用于接下來(lái)的三維人體曲面建模.
3DS文件結(jié)構(gòu)由“塊”組成,塊中又有子塊[13].每個(gè)塊是一個(gè)層次結(jié)構(gòu),3DS文件有一個(gè)主塊,ID是0x4D4D,這個(gè)塊是3DS文件的開(kāi)始(可以用它來(lái)鑒定該文件是否為一個(gè)3DS文件),在開(kāi)始?jí)K后面是主要塊,主體內(nèi)容為塊數(shù)據(jù)信息.每個(gè)3DS文件都包括一個(gè)塊ID是“0x4D4D”的基本塊.基本塊是在3DS文件中必須存在的,也可用于檢測(cè)一個(gè)文件是不是3DS文件,它由ID為“0x3D3D”的編輯塊和ID為“0XB000”的關(guān)鍵幀塊組成.3DS主要的幾個(gè)塊的ID及信息,如表1所示.
表1 3DS模型文件中幾個(gè)主要的塊ID及信息
本文首先把所需塊的ID定義為常量以便后續(xù)使用.
const
M3DMAGIC=$4D4D; //文件的開(kāi)始
MDATA=$3D3D; //所有目標(biāo)信息
KFDATA=$B000; //繪制框架,為MDATA定義
MAT-ENTRY=$AFFF; //材質(zhì)信息開(kāi)始
NAMED-OBJECT=$4000; //目標(biāo)的相關(guān)數(shù)據(jù)(點(diǎn)、面…)
//對(duì)于MAT-ENTRY的定義
MAT-NAME=$A000; //材質(zhì)名稱
MAT-AMBIENT=$A010; //環(huán)境反射
MAT-DIFFUSE=$A020; //漫反射
MAT-SPECULAR=$A030; //鏡面反射
MAT-SHININESS=$A040; //光源設(shè)定
MAT-TEXMAP=$A200; //紋理信息
MAT-MAPNAME=$A300; //材質(zhì)紋理文件名
N-TRI-OBJECT=$4100; //對(duì)于每個(gè)目標(biāo)的定義
POINT-ARRAY=$4110; //對(duì)象中定點(diǎn)信息
FACE-ARRAY=$4120; //對(duì)象中三角面信息
MSH-MAT-GROUP=$4130; //與三角面相關(guān)的材質(zhì)信息
TEX-VERTS=$4140; //紋理坐標(biāo)
基于以上所分析的3DS文件的結(jié)構(gòu),本文根據(jù)面向?qū)ο蟮木幊趟枷?設(shè)計(jì)了T3DObject類、Tchunk類、TMaterial類、T3DModel類等4類來(lái)實(shí)現(xiàn)3DS模型的讀取與重建.
在完成了3DS文件的讀取工作之后,根據(jù)讀入的各個(gè)頂點(diǎn)及其法向量,利用大量的三角面片來(lái)構(gòu)造出人體和服裝模型.關(guān)鍵算法為:
glBegin(GL_TRIANGLES);//通過(guò)參數(shù)GL-TRIANGLES繪制三角形
for F:=0 to FaceCount-1 do//將FaceCount所存各三角形頂點(diǎn)繪制,F為三角形個(gè)數(shù)
//頂點(diǎn)的遍歷
for iVertex:=0 to 2 do//iVertex為每個(gè)三角形頂點(diǎn);訪問(wèn)三角形三個(gè)點(diǎn)
begin
PointIndex:=Faces[F].VertIndex[iVertex];//找到每個(gè)點(diǎn)的索引號(hào)
glNormal3f(Normals[PointIndex].X,Normals[PointIndex].Y, Normals[PointIndex].Z);
//設(shè)置三角面的法向量,為畫三角形準(zhǔn)備
glVertex3f(Verts[PointIndex].X, Verts[PointIndex].Y, Verts[PointIndex].Z);
//設(shè)置三角形其中一個(gè)頂點(diǎn)的坐標(biāo)
end;
glEnd;
3DS的特長(zhǎng)是三維建模,OpenGL的優(yōu)勢(shì)則在于對(duì)三維模型進(jìn)行交互控制和變化.根據(jù)三維圖形的幾何變換理論,OpenGL提供對(duì)三維對(duì)象在三維空間進(jìn)行變化的庫(kù)函數(shù)[14].
當(dāng)矩陣初始化glLoadIdentity()后,調(diào)用OpenGL提供的glTranslatef()函數(shù)作視點(diǎn)變換.Void glTranslate{f,d}(TYPE x,TYPE y,TYPE z),函數(shù)參數(shù)(x,y,z)表示視點(diǎn)在視點(diǎn)坐標(biāo)系中移動(dòng)的位置.根據(jù)三維圖形的幾何變換理論,OpenGL提供對(duì)三維對(duì)象進(jìn)行空間變化的庫(kù)函數(shù).由參數(shù)x,y,z定義了一個(gè)矩陣,該矩陣與當(dāng)前矩陣相乘,這樣的結(jié)果使物體在3個(gè)坐標(biāo)軸上發(fā)生平移,平移的距離大小為x,y,z(或以相同的量移動(dòng)局部坐標(biāo)系).
當(dāng)前矩陣乘以某一個(gè)矩陣,該矩陣使得一個(gè)物體(或局部坐標(biāo)系)繞一條從原點(diǎn)到點(diǎn)(x,y,z)的線,沿逆時(shí)針?lè)较蛐D(zhuǎn).參數(shù)angle給出旋轉(zhuǎn)的角度值,旋轉(zhuǎn)函數(shù)為:Void glRotate{f,d}(TYPE angle,TYPE x,TYPE y,TYPE z);
函數(shù)Void glScale{f,d}(TYPE x,TYPE y,TYPE z)定義了一個(gè)矩陣,與當(dāng)前矩陣相乘,使得物體沿坐標(biāo)軸拉伸、縮短以及相對(duì)于坐標(biāo)軸做鏡面反射.
這些函數(shù)可以使得到的三維人體模型在三維空間中作任意的變化,方便于服裝設(shè)計(jì)者從多個(gè)角度來(lái)觀察人體,如圖1所示.
圖1 不同角度觀察服裝人體模型
紋理分為顏色紋理和幾何紋理兩種類型.生成顏色紋理的一般方法是在平面區(qū)域(即紋理空間)上預(yù)定義紋理圖案,然后建立物體表面的點(diǎn)與紋理空間的點(diǎn)的對(duì)應(yīng)關(guān)系(即映射).當(dāng)物體表面的可見(jiàn)點(diǎn)確定以后,以紋理空間的對(duì)應(yīng)點(diǎn)的值乘以亮度值,就可以把紋理圖案附著在物體表面.也可以用類似的方法讓物體表面產(chǎn)生凹凸不平的凸包紋理.不過(guò)這時(shí)的紋理作用在法向量上,而不是作用于顏色亮度.在織物所形成的服裝表面,應(yīng)該說(shuō)兩種紋理都存在,但是顏色紋理占主要地位.
在紡織品中,大多織物具有印花圖案或織物紋理.只有把這種印花圖案和織物紋理模擬出來(lái),才能更好地體現(xiàn)織物的性質(zhì)和穿著效果.可以通過(guò)紋理映射技術(shù)將織物圖案映射到服裝模型的表面,由此可以實(shí)現(xiàn)任意更換面料的目的,達(dá)到織物三維著裝的仿真效果.
理論上,紋理映射的計(jì)算過(guò)程如下:(1)紋理圖像的選取與預(yù)處理;(2)紋理映射三維曲面的建模;(3)確定紋理映射的方法和對(duì)應(yīng)關(guān)系,包括反走樣處理;(4)二維圖像向三維曲面映射;(5)透視變換顯示.
在服裝曲面上實(shí)現(xiàn)圖案紋理效果,實(shí)質(zhì)上就是織物圖案在物體表面上的映射.首先根據(jù)紋理圖案和物體的邊界定義,確定一個(gè)映射函數(shù),然后使用逆向映射將圖案映射到服裝曲面空間.先將紋理圖案空間點(diǎn)通過(guò)投影逆變換成服裝曲面上的點(diǎn),參數(shù)化成實(shí)際坐標(biāo)(x,y,z),再利用映射函數(shù)求出相應(yīng)的紋理元素的光亮度值作為該圖像元素的明暗值,這實(shí)際上是一個(gè)坐標(biāo)轉(zhuǎn)化的過(guò)程.
要實(shí)現(xiàn)不同面料在服裝上的模擬,只需將各種面料作為紋理圖案映射到服裝曲面上.在程序中進(jìn)行服裝曲面的三角面片模擬之前用OpenGL所提供的紋理映射函數(shù)綁定所選定的面料圖片作為紋理圖案,即可實(shí)現(xiàn)同一服裝的不同面料的模擬效果,具體效果如圖2所示.
圖2 不同面料展示模擬
本文將3D Studio MAX技術(shù)、OpenGL軟件與Delphi語(yǔ)言結(jié)合起來(lái),兼用三者之長(zhǎng),將從3DS中提取的人體數(shù)據(jù)模型導(dǎo)入Delphi中,進(jìn)一步將人體與服裝結(jié)合達(dá)到量體裁衣的目的,對(duì)于特殊群體通過(guò)建立人體模型也可得出適合其體型的服裝,最終在OpenGL中展示著裝效果.整個(gè)建模過(guò)程無(wú)需繁瑣的手工繪制及大量計(jì)算,更加智能化地從多角度觀察不同材質(zhì)的著裝效果.該方法不僅可以應(yīng)用在服裝CAD方面,還可以應(yīng)用到系統(tǒng)仿真、產(chǎn)品設(shè)計(jì)、工程分析、虛擬現(xiàn)實(shí)、大型游戲開(kāi)發(fā)過(guò)程中的場(chǎng)景設(shè)計(jì)以及科學(xué)計(jì)算的可視化等各個(gè)方面.
參考文獻(xiàn):
[1] 袁銘,王建輝,周醉,等.一種古建筑三維建模方法——以蘇州虎丘塔為例[J].蘇州科技學(xué)院學(xué)報(bào):工程技術(shù)版,2009,22(1):43-47.
[2] 張靜,許潔.古文物藝術(shù)造型的數(shù)字化與虛擬展示[J].西安工程大學(xué)學(xué)報(bào),2011,25(6):835-837.
[3] 王名亮.定制化人像產(chǎn)品三維建模知識(shí)庫(kù)技術(shù)研究及應(yīng)用[D].重慶:重慶大學(xué),2013.
[4] 單超杰.皮影人物造型與三維建模技術(shù)結(jié)合的創(chuàng)新研究[D].上海:東華大學(xué),2013.
[5] 張瑞云.用紋理映射技術(shù)實(shí)現(xiàn)三維著裝效果展示[J].中國(guó)紡織大學(xué)學(xué)報(bào),2000(4):53-56.
[6] 吳夢(mèng)熊,胡建鵬,耿兆豐,等.紋理映射技術(shù)在三維虛擬服裝模擬中的應(yīng)用與實(shí)現(xiàn)[J].東華大學(xué)學(xué)報(bào):自然科學(xué)版,2008,34(4):445-448.
[7] 王萍,張秀.基于三維人體測(cè)量的蘇南地區(qū)青年女性體型特征[J].西安工程大學(xué)學(xué)報(bào),2012,26(3):313-316.
[8] 劉浩翰,唐好選.人體的幾何造型[J]. 中國(guó)民航學(xué)院學(xué)報(bào),2003,21(增刊2):173-175.
[9] 李勇,胡敏,付小莉.三維人體建模方法的研究[J].紡織學(xué)報(bào),2002,23(5):80-82.
[10] 馮毅力,李汝勤.人體模型的三維數(shù)據(jù)拾取和服裝曲面的生成[J].紡織學(xué)報(bào),2004,25(6):47-48.
[11] 楊東梅,朱勝緣,路偉成,等.OpenGL與3D Studio MAX結(jié)合實(shí)現(xiàn)三維仿真[J].應(yīng)用科技,2004,31(2):33-35.
[12] WOO Mason,NEIDERF J,DAVIS Tom,et al.OpenGL編程權(quán)威指南[M].吳文武,段海波,薛風(fēng)武,譯.2版.北京:中國(guó)電力出版社,2001:1-2.
[13] 和平鴿工作室.OpenGL高級(jí)編程與可視化系統(tǒng)開(kāi)發(fā)[M].北京:中國(guó)水利水電出版社,2003:74-81.
[14] FRANCIS S Hill J R,STEPHEN M Kelley.計(jì)算機(jī)圖形學(xué)(OpenGL版)(影印版)[M].胡事民,劉利利,劉永進(jìn),等譯.北京出版社,2010:258-277.