專(zhuān)利名稱::Model3D構(gòu)建的應(yīng)用程序接口的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明一般涉及計(jì)算機(jī)圖形學(xué)領(lǐng)域,尤其涉及用于三維景物圖形學(xué)的應(yīng)用程序接口。
背景技術(shù):
:訪問(wèn)計(jì)算機(jī)上圖形的傳統(tǒng)模式正在達(dá)到極限,部分原因是存儲(chǔ)器和總線速度沒(méi)有跟上主處理器和/或圖形處理器的發(fā)展。一般而言,在需要復(fù)雜的圖形效果時(shí)當(dāng)前使用位圖準(zhǔn)備幀的模型需要太多的數(shù)據(jù)處理而無(wú)法跟上硬件刷新率。結(jié)果,當(dāng)用常規(guī)圖形模型嘗試復(fù)雜圖形效果時(shí),與及時(shí)地完成變化導(dǎo)致下一幀的感知視件效果相反,這些變化會(huì)添加在不同的幀上導(dǎo)致結(jié)果在視覺(jué)上不理想。此外,當(dāng)將三維(3D)圖形引入二維(2D)合成系統(tǒng)以顯示2D圖像和3D景物的混合景物時(shí)該問(wèn)題被惡化。在實(shí)現(xiàn)這種混合系統(tǒng)的問(wèn)題之中是如何定義3D模型的程序?qū)ο?。?yīng)如何組織程序?qū)ο竽??作出本發(fā)明就是參照這些和其它考慮。
發(fā)明內(nèi)容以上和其它問(wèn)題由應(yīng)用于計(jì)算機(jī)程序?qū)ο蟮挠?jì)算機(jī)數(shù)據(jù)結(jié)構(gòu)解決,該數(shù)據(jù)結(jié)構(gòu)用以構(gòu)建一樹(shù)分層結(jié)構(gòu)以呈現(xiàn)3D模型的三維(3D)景物。該樹(shù)分層結(jié)構(gòu)中的根對(duì)象收集3D景物的對(duì)象。該樹(shù)分層結(jié)構(gòu)中的組對(duì)象在樹(shù)分層結(jié)構(gòu)中收集其它組對(duì)象和繪制對(duì)象,并定義在由組對(duì)象收集的繪制對(duì)象上可進(jìn)行的組操作。該樹(shù)分層結(jié)構(gòu)中的光線對(duì)象(Light對(duì)象)定義要在呈現(xiàn)3D景物中的3D模型時(shí)使用的照度,以及定義繪制3D景物中的3D模型的操作的一個(gè)或多個(gè)繪制3D對(duì)象。根據(jù)本發(fā)明其它方面,本發(fā)明涉及一種用于處理計(jì)算機(jī)程序?qū)ο蟮姆謱咏Y(jié)構(gòu)的方法,這些對(duì)象用于繪制由合成系統(tǒng)呈現(xiàn)的三維(3D)模型的二維(2D)視圖。該方法遍歷對(duì)象的3D景物樹(shù)分層結(jié)構(gòu)的分支以處理組對(duì)象和葉對(duì)象。該方法檢測(cè)下一未處理對(duì)象是葉對(duì)象還是組對(duì)象。如果它是葉對(duì)象,該方法檢測(cè)葉對(duì)象是光線對(duì)象還是繪制3D對(duì)象。如果葉對(duì)象是光線對(duì)象,設(shè)置3D景物的照度。如果檢測(cè)到繪制3D對(duì)象,3D模型被繪制為根據(jù)照度照亮。該方法還在由組對(duì)象收集的對(duì)象組上執(zhí)行組操作。根據(jù)另外方面,本發(fā)明涉及用于創(chuàng)建由模型3D對(duì)象定義的3D模型的三維(3D)景物的應(yīng)用程序接口。該接口具有一個(gè)或多個(gè)組對(duì)象以及一個(gè)或多個(gè)葉對(duì)象。組對(duì)象包含或收集其它組對(duì)象和/或葉對(duì)象。葉對(duì)象可以是繪制對(duì)象或照度對(duì)象。組對(duì)象可具有變換操作以變換在其組中收的對(duì)象。繪制對(duì)象定義繪制3D景物的3D模型的指令,或繪制3D模型上2D圖像的指令。照度對(duì)象定義照亮3D景物中3D模型的光線的類(lèi)型和方向。本發(fā)明可被實(shí)現(xiàn)為計(jì)算機(jī)進(jìn)程、計(jì)算系統(tǒng)、或者諸如計(jì)算機(jī)程序產(chǎn)品或計(jì)算機(jī)可讀介質(zhì)的制造品。計(jì)算機(jī)可讀介質(zhì)可以是計(jì)算機(jī)系統(tǒng)可讀的并編碼用于執(zhí)行計(jì)算機(jī)進(jìn)程的指令的計(jì)算機(jī)程序的計(jì)算機(jī)存儲(chǔ)介質(zhì)。計(jì)算機(jī)可讀介質(zhì)還可以是計(jì)算系統(tǒng)可讀的并編碼用于執(zhí)行計(jì)算機(jī)進(jìn)程的指令的計(jì)算機(jī)程序的載波上的傳播信號(hào)。參閱以下詳細(xì)描述和附圖,描繪本發(fā)明的這些和各種其它特征、以及優(yōu)點(diǎn)將變得顯然。圖1根據(jù)本發(fā)明一實(shí)施例示出模型3D構(gòu)建API中相關(guān)對(duì)象的數(shù)據(jù)結(jié)構(gòu)。圖2示出其上可實(shí)現(xiàn)本發(fā)明諸實(shí)施例的適當(dāng)計(jì)算系統(tǒng)環(huán)境的示例。圖3是一般示出可結(jié)合本發(fā)明的圖形層架構(gòu)的框圖。圖4是視件(Visual)和相關(guān)聯(lián)組件的景物圖表示,這些組件用于諸如通過(guò)遍歷景物圖以提供圖形命令和其它數(shù)據(jù)來(lái)處理景物圖。圖5是經(jīng)構(gòu)建的有效視件、繪制視件、以及相關(guān)聯(lián)繪制圖元的景物表示。圖6示出用于將摩托車(chē)呈現(xiàn)為3D景物的示例性Model3D(模型3D)樹(shù)分層結(jié)構(gòu)。圖7示出用于處理如圖6所示的3D景物樹(shù)分層結(jié)構(gòu)的操作流程。圖8示出包含在Model3D組對(duì)象中Transform3D(變換3D)對(duì)象的相關(guān)對(duì)象的數(shù)據(jù)結(jié)構(gòu)。圖9示出Model3DAPI中光線對(duì)象的相關(guān)對(duì)象的數(shù)據(jù)結(jié)構(gòu)。具體實(shí)施例方式圖1根據(jù)本發(fā)明一實(shí)施例示出用于實(shí)現(xiàn)Model3DAPI的計(jì)算機(jī)程序?qū)ο蟮募軜?gòu)。Model3D對(duì)象10是根或呈現(xiàn)對(duì)象。有4個(gè)可能Model3D對(duì)象,它們是與根對(duì)象相關(guān)的子對(duì)象。在此架構(gòu)中有3個(gè)對(duì)象-Primitive3D(元3D)對(duì)象12、視件Model3D對(duì)象14、以及光線對(duì)象16-是葉對(duì)象。Model3D組對(duì)象是該樹(shù)中葉對(duì)象或其它組對(duì)象的收集節(jié)點(diǎn),且還包含Transform3D對(duì)象18。Transform3D對(duì)象具有與其相關(guān)聯(lián)的包含對(duì)象的分層結(jié)構(gòu)。Primitive3D對(duì)象包含網(wǎng)格信息26和材質(zhì)信息28,它們可引用或指向?qū)ο蟮姆謱咏Y(jié)構(gòu)以幫助由Primitive3D對(duì)象12繪制的3D模型的定義。視件Model3D對(duì)象14定義結(jié)合到3D景物的2D圖像。光線對(duì)象16定義3D景物的照度,并具有用于定義各種光線條件的對(duì)象的分層結(jié)構(gòu)。所有這些對(duì)象都在此后的Model3DAPI定義章節(jié)中定義。圖1的對(duì)象被用以構(gòu)建Model3D景物樹(shù),即用于呈現(xiàn)3D景物的Model3D對(duì)象的樹(shù)分層結(jié)構(gòu)。該3D景物樹(shù)從具有繪制環(huán)境25的視件3D對(duì)象22或視件2D對(duì)象中被輸入到Model3D根對(duì)象10上。視件3D對(duì)象22及視件2D對(duì)象24的繪制環(huán)境25包含指向Model3D根對(duì)象10和照相機(jī)對(duì)象32的指針。視件3D對(duì)象的指針33指向Model3D根對(duì)象10。視件3D對(duì)象的指針34指向照相機(jī)對(duì)象32。包含在視件2D對(duì)象24的繪制環(huán)境25中的指針31指向Model3D根對(duì)象10。包含在視件2D對(duì)象24的繪制環(huán)境25中的指針35指向照相機(jī)對(duì)象32。照相機(jī)對(duì)象32定義查看3D景物的照相機(jī)的視點(diǎn)或感光點(diǎn)的位置。照相機(jī)對(duì)象32具有照相機(jī)對(duì)象的分層結(jié)構(gòu),包括投影照相機(jī)對(duì)象39、透視照相機(jī)對(duì)象36、正交照相機(jī)對(duì)象37和Matrix3D(矩陣3D)照相機(jī)對(duì)象38。這些照相機(jī)對(duì)象的每一個(gè)都在此后的Model3DAPI定義章節(jié)中定義。此后所述的圖6是將圖1的Model3D對(duì)象用作構(gòu)成塊而構(gòu)建的3D景物樹(shù)的一個(gè)示例。用于呈現(xiàn)圖63D景物的操作流程在此后參照?qǐng)D7描述。用于實(shí)現(xiàn)本發(fā)明的示例性可操作硬件和軟件環(huán)境將參照?qǐng)D2~5描述。示例性操作環(huán)境圖2示出了本發(fā)明可在其中實(shí)現(xiàn)的適當(dāng)?shù)挠?jì)算系統(tǒng)環(huán)境100的示例。該計(jì)算系統(tǒng)環(huán)境100僅是適當(dāng)計(jì)算環(huán)境的一個(gè)示例,并非旨在提出對(duì)本發(fā)明使用或功能性范圍作任何限制。計(jì)算環(huán)境100也不應(yīng)被解釋為對(duì)示例性操作環(huán)境100中所示的任一組件或其組合有任何依賴性或任何需求。本發(fā)明也可在很多其它通用或?qū)S糜?jì)算系統(tǒng)環(huán)境或配置中使用。適于本發(fā)明使用的眾所周知的計(jì)算系統(tǒng)、環(huán)境、和/或配置的示例包括,但不限于,個(gè)人計(jì)算機(jī)、服務(wù)器計(jì)算機(jī)、諸如個(gè)人數(shù)字助理(PDA)、寫(xiě)字板PC或膝上型PC的手持式或膝上型裝置、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、機(jī)頂盒、可編程消費(fèi)品電器、網(wǎng)絡(luò)PC、迷你計(jì)算機(jī)、大型機(jī)、包括任一種以上系統(tǒng)或設(shè)備的分布式計(jì)算環(huán)境等等。本發(fā)明可以計(jì)算機(jī)可執(zhí)行指令的一般上下文進(jìn)行說(shuō)明,諸如由計(jì)算機(jī)執(zhí)行的程序模塊。一般而言,程序模塊包括執(zhí)行具體任務(wù)或?qū)崿F(xiàn)具體抽象數(shù)據(jù)結(jié)構(gòu)的例程、程序、對(duì)象、組件、數(shù)據(jù)結(jié)構(gòu)等等。本發(fā)明還可在任務(wù)由經(jīng)通信網(wǎng)絡(luò)連接的遠(yuǎn)程處理設(shè)備執(zhí)行的分布式計(jì)算環(huán)境中實(shí)踐。在分布式計(jì)算環(huán)境中,程序模塊可置于包括存儲(chǔ)器存儲(chǔ)設(shè)備的本地和遠(yuǎn)程計(jì)算機(jī)存儲(chǔ)介質(zhì)中。參照?qǐng)D2,實(shí)現(xiàn)本發(fā)明的示例性系統(tǒng)包括以計(jì)算機(jī)110形式的通用計(jì)算裝置。計(jì)算機(jī)110的組件可包括,但不限于,處理單元120、系統(tǒng)存儲(chǔ)器130以及把包括系統(tǒng)存儲(chǔ)器在內(nèi)的各種系統(tǒng)組件耦合到處理單元120的系統(tǒng)總線121。系統(tǒng)總線121可能是若干總線結(jié)構(gòu)類(lèi)型中的任何一種,包括存儲(chǔ)器總線或存儲(chǔ)器控制器、外圍總線、以及使用多種總線架構(gòu)的任一種的本地總線。作為示例,而非限制,這些架構(gòu)包括工業(yè)標(biāo)準(zhǔn)架構(gòu)(ISA)總線、微信道架構(gòu)(MCA)總線、擴(kuò)展ISA(EISA)總線、視頻電子標(biāo)準(zhǔn)協(xié)會(huì)(VESA)局部總線和也稱為Mezzanine總線的外圍部件互連(PCD總線。計(jì)算機(jī)110通常包括各種計(jì)算機(jī)可讀介質(zhì)。計(jì)算機(jī)可讀介質(zhì)可以是能被計(jì)算機(jī)110訪問(wèn)的任何可用介質(zhì),并包括易失性和非易失性介質(zhì)、可移動(dòng)和不可移動(dòng)介質(zhì)。作為示例,而非限制,計(jì)算機(jī)可讀介質(zhì)可包括計(jì)算機(jī)存儲(chǔ)介質(zhì)和通信介質(zhì)。計(jì)算機(jī)存儲(chǔ)介質(zhì)包括以任何方法或技術(shù)實(shí)現(xiàn)、用于存儲(chǔ)諸如計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù)等信息的易失性和非易失性介質(zhì)、可移動(dòng)和不可移動(dòng)介質(zhì)。計(jì)算機(jī)存儲(chǔ)介質(zhì)包括但不限于RAM、ROM、EEPROM、閃存或其它存儲(chǔ)器技術(shù)、CD-ROM、數(shù)字化多功能光盤(pán)(DVD)或其它光學(xué)存儲(chǔ)技術(shù)、磁卡、磁帶、磁盤(pán)存儲(chǔ)或其它磁性存儲(chǔ)設(shè)備、或任何其它可用于存儲(chǔ)所需信息并可由計(jì)算機(jī)110訪問(wèn)的介質(zhì)。通信介質(zhì)通常在諸如載波或其它傳輸機(jī)制的已調(diào)制數(shù)據(jù)信號(hào)中體現(xiàn)計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊、或其它數(shù)據(jù),且包括任何信息輸送介質(zhì)。術(shù)語(yǔ)“已調(diào)制數(shù)據(jù)信號(hào)”意指用在信號(hào)中編碼信息的方式設(shè)置或改變其一個(gè)或多個(gè)特征的信號(hào)。作為示例,而非限制,通信介質(zhì)包括諸如有線網(wǎng)絡(luò)或直線連接的有線介質(zhì),和諸如聲學(xué)、射頻、紅外線和其它無(wú)線介質(zhì)的無(wú)線介質(zhì)。以上任何介質(zhì)的組合也應(yīng)包括在計(jì)算機(jī)可讀介質(zhì)的范圍中。系統(tǒng)存儲(chǔ)器130包括諸如只讀存儲(chǔ)器(ROM)131和隨機(jī)存取存儲(chǔ)器(RAM)132的易失性和/或非易失性存儲(chǔ)器形式的計(jì)算機(jī)可讀介質(zhì)。包含有助于計(jì)算機(jī)110如起動(dòng)時(shí)在元件間傳送信息的基本例程的基本輸入/輸出系統(tǒng)(BIOS)133通常存儲(chǔ)在ROM131中。RAM132通常包含可被處理單元120立即訪問(wèn)和/或當(dāng)時(shí)正被操作的數(shù)據(jù)和/或程序模塊。作為示例,而非限制,圖2示出了操作系統(tǒng)134、應(yīng)用程序135、其它程序模塊136、和程序數(shù)據(jù)137。計(jì)算機(jī)110還可包括其它可移動(dòng)/不可移動(dòng)、易失性/非易失性計(jì)算機(jī)存儲(chǔ)介質(zhì)。作為示例,圖2圖示了讀取和寫(xiě)入不可移動(dòng)、非易失性磁性介質(zhì)的硬盤(pán)驅(qū)動(dòng)器141,讀取和寫(xiě)入可移動(dòng)、非易失性磁盤(pán)152的磁盤(pán)驅(qū)動(dòng)器151,讀取和寫(xiě)入可移動(dòng)、非易失性光盤(pán)156,諸如CD-ROM或其它光學(xué)介質(zhì)的光盤(pán)驅(qū)動(dòng)器155。其它也用在示例性計(jì)算環(huán)境中的可移動(dòng)/不可移動(dòng)、易失性/非易失性計(jì)算機(jī)存儲(chǔ)介質(zhì)包括,但不限于,如磁帶、閃存卡、數(shù)字化視頻光盤(pán)、數(shù)字化錄像帶、固態(tài)RAM、固態(tài)ROM等等。硬盤(pán)驅(qū)動(dòng)器141通常通過(guò)諸如接口140的不可移動(dòng)存儲(chǔ)器接口與系統(tǒng)總線121連接,而磁盤(pán)驅(qū)動(dòng)器151和光盤(pán)驅(qū)動(dòng)器155通常通過(guò)諸如接口150的可移動(dòng)存儲(chǔ)器接口與系統(tǒng)總線121連接。如上所述并如圖2所示的盤(pán)驅(qū)動(dòng)器及其相關(guān)聯(lián)的計(jì)算機(jī)存儲(chǔ)介質(zhì)為計(jì)算機(jī)110提供計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊、和其它數(shù)據(jù)的存儲(chǔ)。在圖2中,例如,硬盤(pán)驅(qū)動(dòng)器141被示為存儲(chǔ)操作系統(tǒng)144、應(yīng)用程序145、其它程序模塊146、和程序數(shù)據(jù)147。注意這些組件可以與操作系統(tǒng)134、應(yīng)用程序135、其它程序模塊136、和程序數(shù)據(jù)137相同或不同。在此給予操作系統(tǒng)144、應(yīng)用程序145、其它程序模塊146、和程序數(shù)據(jù)147的數(shù)字不同至少說(shuō)明他們是不同的副本。用戶可通過(guò)諸如書(shū)寫(xiě)板(電子數(shù)字化儀)164、麥克風(fēng)163、鍵盤(pán)162、和通常稱為鼠標(biāo)、跟蹤球或觸摸板等定點(diǎn)裝置161向計(jì)算機(jī)110輸入命令和信息。其它輸入裝置(未示出)可包括游戲桿、游戲墊、衛(wèi)星接收器、掃描儀等等。這些和其它輸入設(shè)備常常通過(guò)與系統(tǒng)總線耦合的用戶輸入接口160與處理單元120相連,但也可通過(guò)諸如并行端口、游戲端口或通用串行總線(USB)的其它接口連接。監(jiān)視器191或其它類(lèi)型的顯示設(shè)備也可通過(guò)諸如視頻接口190的接口與系統(tǒng)總線121相連。監(jiān)視器191還可集成觸摸屏模板193等等,它可通過(guò)諸如觸摸屏接口192的接口向計(jì)算機(jī)系統(tǒng)110輸入諸如手寫(xiě)字的數(shù)字化輸入。注意監(jiān)視器和/或觸摸屏面板可物理地與在其中結(jié)合計(jì)算裝置110的外殼相耦合。除了監(jiān)視器,計(jì)算機(jī)還可包括諸如揚(yáng)聲器195和打印機(jī)196的其它輸出設(shè)備,它們通過(guò)輸出外圍接口194相連。計(jì)算機(jī)110可以在使用與一臺(tái)或多臺(tái)遠(yuǎn)程計(jì)算機(jī),諸如遠(yuǎn)程計(jì)算機(jī)180的邏輯連接的網(wǎng)絡(luò)化環(huán)境中運(yùn)行。遠(yuǎn)程計(jì)算機(jī)180可以是個(gè)人計(jì)算機(jī)、服務(wù)器、路由器、網(wǎng)絡(luò)PC、對(duì)等裝置或其它公共網(wǎng)絡(luò)節(jié)點(diǎn),而且通常包括上述與個(gè)人計(jì)算機(jī)110相關(guān)的許多或全部組件,盡管在圖2中僅圖示了存儲(chǔ)器存儲(chǔ)設(shè)備181。圖2中所描繪的邏輯連接包括局域網(wǎng)(LAN)171和廣域網(wǎng)(WAN)173,但也可包括其它網(wǎng)絡(luò)。這樣的網(wǎng)絡(luò)化環(huán)境在辦公室、企業(yè)范圍計(jì)算機(jī)網(wǎng)絡(luò)、企業(yè)內(nèi)部互聯(lián)網(wǎng)和因特網(wǎng)上是常見(jiàn)的。當(dāng)用于LAN網(wǎng)絡(luò)化環(huán)境中時(shí),計(jì)算機(jī)110通過(guò)網(wǎng)絡(luò)接口或適配器170與局域網(wǎng)171連接。當(dāng)用于WAN網(wǎng)絡(luò)化環(huán)境中時(shí),計(jì)算機(jī)110通常包括調(diào)制解調(diào)器172或其它用于在廣域網(wǎng)173,諸如因特網(wǎng)中建立通信的裝置??梢允莾?nèi)置式或外置式的調(diào)制解調(diào)器172與系統(tǒng)總線121通過(guò)用戶輸入接口160或其它適當(dāng)機(jī)制連接。在網(wǎng)絡(luò)化環(huán)境中,與計(jì)算機(jī)110相關(guān)的程序模塊或其一部分可存儲(chǔ)在遠(yuǎn)程存儲(chǔ)器存儲(chǔ)裝置中。作為示例,而非限制,圖2示出了駐留于存儲(chǔ)器裝置181中的遠(yuǎn)程應(yīng)用程序185。應(yīng)當(dāng)理解,所示網(wǎng)絡(luò)連接是示例性的,且其它用于在計(jì)算機(jī)間建立通信連接的技術(shù)也可以使用。用于處理視件樹(shù)分層結(jié)構(gòu)的軟件環(huán)境圖3示出了其中可處理視件樹(shù)的一般分層架構(gòu)200。如圖3所示,根據(jù)本發(fā)明一方面,程序代碼202(例如應(yīng)用程序或操作系統(tǒng)組件等)可被開(kāi)發(fā)成以一種或多種不同方法輸出圖形數(shù)據(jù),包括通過(guò)成像204、通過(guò)向量圖形元素206、和/或通過(guò)直接置于視件應(yīng)用程序編程接口(API)層212的功能/方法調(diào)用。一般而言,成像204提供帶有用于載入、編輯和存儲(chǔ)例如位圖的圖像的機(jī)制的程序代碼202。如下所述,這些圖像可由該系統(tǒng)的其它部分使用,且還有一種使用圖元繪制代碼直接繪制到圖像中的方法。向量圖形元素206提供另一種與其余的對(duì)象模型相一致的繪制圖形的方法(如下所述)。向量圖形元素208可通過(guò)標(biāo)記語(yǔ)言創(chuàng)建,其中元素/屬性系統(tǒng)208和呈現(xiàn)器系統(tǒng)210進(jìn)行解釋以作對(duì)視件API層212的適當(dāng)調(diào)用。圖形層架構(gòu)200包括一高層合成和動(dòng)畫(huà)引擎214,它包括或以其它方式與緩存數(shù)據(jù)結(jié)構(gòu)216相關(guān)聯(lián)。該緩存數(shù)據(jù)結(jié)構(gòu)216包含一景物圖,它包括按分層結(jié)構(gòu)排列的根據(jù)已定義對(duì)象模型管理的對(duì)象,如下所述。一般而言,視件API層212向緩存數(shù)據(jù)結(jié)構(gòu)216提供帶有接口的程序代碼202(以及呈現(xiàn)器系統(tǒng)210),包括創(chuàng)建對(duì)象、打開(kāi)和關(guān)閉對(duì)象以向它們提供數(shù)據(jù)等等。換言之,該高層合成和動(dòng)畫(huà)引擎214展現(xiàn)一統(tǒng)一介質(zhì)API層212,通過(guò)它開(kāi)發(fā)者可表達(dá)有關(guān)圖形和介質(zhì)的要顯示圖形信息的意圖,并提供帶有足夠信息的下層平臺(tái),從而該平臺(tái)可最優(yōu)化程序代碼對(duì)硬件的使用。例如,下層平臺(tái)將負(fù)責(zé)緩存、資源協(xié)商和介質(zhì)集成。高層合成和動(dòng)畫(huà)引擎214將指令流和可能的其它數(shù)據(jù)(例如位圖指針)傳遞給快速低層的合成和動(dòng)畫(huà)引擎218。在此使用時(shí),術(shù)語(yǔ)“高層”和“低層”類(lèi)似于在其它計(jì)算情形中所使用的,其中一般而言相對(duì)高層組件越低的軟件組件越接近硬件。因而,例如,從高層合成和動(dòng)畫(huà)引擎214發(fā)送的圖形信息可在低層合成和動(dòng)畫(huà)引擎218上接收,其中該信息被用以向包括硬件222的圖形子系統(tǒng)發(fā)送圖形數(shù)據(jù)。高層合成和動(dòng)畫(huà)引擎214結(jié)合程序代碼202建立一景物圖以表示由程序代碼202提供的圖形景物。例如,要繪制的每個(gè)條目可用系統(tǒng)將其緩存于景物圖數(shù)據(jù)結(jié)構(gòu)216中的繪制指令加載。如下所述,有許多指定該數(shù)據(jù)結(jié)構(gòu)216并繪制什么的各種方法。此外,高層合成和動(dòng)畫(huà)引擎214結(jié)合定時(shí)和動(dòng)畫(huà)系統(tǒng)220以提供便于陳述的(或其它)動(dòng)畫(huà)控制(例如動(dòng)畫(huà)間隔)及定時(shí)控制。注意該動(dòng)畫(huà)系統(tǒng)使得動(dòng)畫(huà)值被傳遞到系統(tǒng)中幾乎任何地方,包括例如,在元素屬性層208上、視件API層212內(nèi)部、以及任一其它資源中。該定時(shí)系統(tǒng)被展現(xiàn)在元素和視件層上。低層合成和動(dòng)畫(huà)引擎218管理景物的組成、動(dòng)畫(huà)及呈現(xiàn),其后它被提供給圖形字系統(tǒng)222。該低層引擎218組成多個(gè)應(yīng)用程序景物的呈現(xiàn),并使用呈現(xiàn)組件實(shí)現(xiàn)圖形向屏幕的真正呈現(xiàn)。然而,注意有時(shí)發(fā)生在更高層次上的某些呈現(xiàn)是有必要和/或有益的。例如,當(dāng)?shù)蛯臃?wù)來(lái)自多個(gè)應(yīng)用程序的請(qǐng)求,高層在每個(gè)應(yīng)用程序基礎(chǔ)上例示時(shí),通過(guò)成像機(jī)制204在高層執(zhí)行耗時(shí)或應(yīng)用程序?qū)S贸尸F(xiàn),并將對(duì)位圖的引用傳遞給低層是可能的。圖4和5分別示出了景物圖300和400,包括稱為視件的基本對(duì)象。一般而言,視件包括向用戶顯示可視化表面的對(duì)象,并在顯示器上具有可視化顯示。如圖4中所示,頂層(或根)視件302被連接到視件管理器對(duì)象304,該對(duì)象還與其中輸出程序代碼的圖像數(shù)據(jù)的視窗(HWnd)或類(lèi)似單元有關(guān)系(例如通過(guò)句柄)。該視件管理器304管理頂層視件(以及該視件的任何子視件)在該視窗306上的繪制。為了進(jìn)行繪制,視件管理器304將景物圖處理(例如遍歷或傳輸)為由調(diào)度器308安排,并向低層組件218(圖3)提供其相應(yīng)視窗306的圖形指令和其它數(shù)據(jù)。景物圖處理通常將由調(diào)度器308以比低層組件218和/或圖形子系統(tǒng)222的刷新率相對(duì)慢一些的速率來(lái)安排。圖4示出了在頂層(根)視件302下以分層結(jié)構(gòu)安排的眾多子視件310-315,其中某些被顯示為分別通過(guò)帶有相關(guān)聯(lián)指令列表318、319的例如包含繪制元和其它視件的繪制環(huán)境316、317(示為表示其臨時(shí)性質(zhì)的虛線框)來(lái)填充。這些視件還可包含其它屬性信息,如以下示例視件類(lèi)所示publicabstractclassVisual:VisualComponent{publicTransformTransform{get;set;}publicfloatOpacity{get;set;}publicBlendModeBlendMode{get;set;}publicGeometryClip{get;set;}publicboolShow{get;set;}publicHitTestResultHitTest(Pointpoint);publicboolIsDescendant(Visualvisual);publicstaticPointTransformToDescendant(Visualreference,Visualdescendant,Pointpoint);publicstaticPointTransformFromDescendant(Visualreference,Visualdescendant,Pointpoint);publicRectCalculateBounds();//LooseboundspublicRectCalculateTightBounds();//publicboolHitTestable{get;set;}publicboolHitTestIgnoreChildren{get;set;}publicboolHitTestFinal{get;set;}}可見(jiàn),視件通過(guò)可由get方法設(shè)置和/或讀取的變換、剪輯、不透明度、以及可能的其它屬性來(lái)提供服務(wù)。另外,視件具有控制它如何參與擊中測(cè)試的標(biāo)記。顯示(Show)屬性被用以顯示/隱藏視件,例如為假時(shí)視件不可見(jiàn),否則視件可見(jiàn)。由變換屬性設(shè)置的變換定義了視件的子圖的坐標(biāo)系統(tǒng)。變換之前的坐標(biāo)系統(tǒng)被稱為變換前坐標(biāo)系統(tǒng),包含之后的被稱為包含后坐標(biāo)系統(tǒng),即帶有變換的視件等效于帶有作為父節(jié)點(diǎn)的變換節(jié)點(diǎn)的視件。視件樹(shù)和合成系統(tǒng)的更全面描述包括在以上引用的題為“VisualandSceneGraphInterface”的相關(guān)專(zhuān)利申請(qǐng)中。Model3DAPI處理圖6示出了以用于呈現(xiàn)3D景物(在此為摩托車(chē))的二維示圖的Model3DAPI構(gòu)建的示例性3D景物樹(shù)分層結(jié)構(gòu)。該樹(shù)示出了Model3DAPI中各種結(jié)構(gòu)化數(shù)據(jù)對(duì)象的使用。摩托車(chē)的樹(shù)的抽象或根節(jié)點(diǎn)是對(duì)象602。該抽象對(duì)象具有4個(gè)子對(duì)象—光線對(duì)象604、車(chē)體組對(duì)象606、車(chē)輪組對(duì)象608以及裝置視件Model3D對(duì)象610。車(chē)體組對(duì)象具有組成摩托車(chē)車(chē)體的三個(gè)子對(duì)象;它們是車(chē)框圖元對(duì)象612、引擎圖元對(duì)象614、以及油箱圖元對(duì)象616。這些圖元對(duì)象的每一個(gè)將繪制為該對(duì)象指定的摩托車(chē)車(chē)體元素。車(chē)輪組對(duì)象608收集前輪組對(duì)象618和后輪組對(duì)象620。車(chē)輪圖元對(duì)象624繪制車(chē)輪的3D模型。前輪組對(duì)象618具有3D變換619以由車(chē)輪圖元對(duì)象624將要繪制的車(chē)輪變換成前輪。類(lèi)似地,后輪組對(duì)象620具有3D變換621以由車(chē)輪圖元對(duì)象624將要繪制的車(chē)輪變換成后輪。此外,還有包含在車(chē)輪組對(duì)象608中的3D變換622。變換對(duì)象622可例如變換將前圖元對(duì)象618和后圖元對(duì)象620的執(zhí)行,以變換車(chē)輪用于動(dòng)畫(huà)效果。Model3D對(duì)象的示例性樹(shù)可由圖7所示邏輯操作的操作流程進(jìn)行處理。本發(fā)明諸實(shí)施例的邏輯操作被實(shí)現(xiàn)為(1)運(yùn)行在系統(tǒng)上的一系列計(jì)算機(jī)實(shí)現(xiàn)動(dòng)作或程序模塊和/或(2)計(jì)算系統(tǒng)中相互連接的機(jī)器邏輯電路或電路模塊。該實(shí)現(xiàn)是取決于實(shí)現(xiàn)本發(fā)明的計(jì)算系統(tǒng)性能需求的選擇。相應(yīng)地,在此所述的組成本發(fā)明諸實(shí)施例的邏輯操作被分別稱為操作、結(jié)構(gòu)裝置、動(dòng)作或模塊。本領(lǐng)域技術(shù)人員將理解,這些操作、結(jié)構(gòu)裝置、動(dòng)作或模塊可用軟件、固件、專(zhuān)用數(shù)字邏輯、以及任意組合實(shí)現(xiàn)而不背離本發(fā)明的精神和范圍,如所附權(quán)利要求書(shū)所述。在圖7中,操作流程從設(shè)置照相機(jī)觀看操作702開(kāi)始。照相機(jī)位置由視件3D對(duì)象22提供(圖1)。遍歷操作704沿該樹(shù)的分支而下直到它抵達(dá)一對(duì)象。正常地,該樹(shù)往下并從左到右地遍歷。組測(cè)試操作706檢測(cè)對(duì)象是組對(duì)象還是葉對(duì)象。如果是組對(duì)象,操作流程向分支以處理組對(duì)象操作708。操作708將處理包含在對(duì)象中的任一組操作。Transform3D操作是組操作的示例。更多對(duì)象測(cè)試操作710檢測(cè)該樹(shù)上是否還有對(duì)象,并如果還有至少另一對(duì)象則將把流返回到遍歷操作704。如果下一對(duì)象是葉對(duì)象,操作流程從組測(cè)試操作706通過(guò)分支到光線對(duì)象測(cè)試操作712。如果葉對(duì)象是光線對(duì)象,操作流程將通過(guò)分支“是”從光線對(duì)象測(cè)試操作712到設(shè)置照度操作714。操作714處理光線對(duì)象以設(shè)置3D景物的照度。然后該操作流程繼續(xù)到更多葉對(duì)象測(cè)試操作716。如果葉對(duì)象不是光線對(duì)象,則操作流程繼續(xù)到圖元/視件模型對(duì)象測(cè)試操作718。如果葉對(duì)象是圖元對(duì)象,操作流程經(jīng)分支到繪制元操作720,并隨后到更多的葉對(duì)象測(cè)試操作716。該繪制元操作720將繪制由圖元對(duì)象指定的3D模型。如果葉對(duì)象是視件Model3D對(duì)象,則操作流程經(jīng)分支到繪制視件模型操作722并隨后到更多的葉對(duì)象測(cè)試操作716。繪制視件模型操作722將繪制由視件Model3D對(duì)象指定的視件模型。如果組中還有葉對(duì)象,則更多的葉測(cè)試操作716使操作流程經(jīng)分支到葉遍歷操作724。遍歷操作724沿該樹(shù)到同一組對(duì)象下的下一子對(duì)象。光線對(duì)象測(cè)試操作712和圖元/視件模型測(cè)試操作718檢測(cè)下一對(duì)象是光線對(duì)象、圖元對(duì)象、還是視件模型對(duì)象。經(jīng)檢測(cè)的葉對(duì)象如上所述重復(fù)處理。處理了所有作為同一組對(duì)象的子對(duì)象的葉對(duì)象之后,操作流程經(jīng)分支“否”從測(cè)試操作716到更多對(duì)象測(cè)試操作710。如果有更多對(duì)象要處理,操作流程返回到遍歷操作704。如果沒(méi)有,則已處理完Model3D樹(shù),且操作流程經(jīng)726返回到3D景物處理的調(diào)用者。在圖6的3D景物樹(shù)的示例中,抵達(dá)的第一對(duì)象是光線對(duì)象。如在以下Model3DAPI定義章節(jié)中的定義,光線對(duì)象定義照亮3D景物的光線類(lèi)型。當(dāng)?shù)诌_(dá)第一葉節(jié)點(diǎn)-光線節(jié)點(diǎn)時(shí),組對(duì)象測(cè)試操作706檢測(cè)該對(duì)象是葉節(jié)點(diǎn),且操作流程經(jīng)分支到光線對(duì)象測(cè)試操作708。光線對(duì)象604由測(cè)試操作708檢測(cè),且設(shè)置照度操作714由光線對(duì)象執(zhí)行以設(shè)置3D景物的照度。然后該流程通過(guò)更多的葉對(duì)象測(cè)試操作716和更多的對(duì)象測(cè)試操作710返回到遍歷操作704。遍歷操作704沿圖6中樹(shù)而下到車(chē)體組對(duì)象606。組測(cè)試操作使該流程經(jīng)分支到處理組操作708以執(zhí)行組對(duì)象606中車(chē)體組的任意操作。然后該流程再次返回到遍歷操作704,而遍歷操作將沿分支而下從車(chē)體組對(duì)象606到車(chē)框圖元對(duì)象602。在操作流程通過(guò)測(cè)試操作706、712和718分支后,車(chē)框圖元對(duì)象602將如上所述由繪制圖元操作720處理。當(dāng)操作流程通過(guò)更多葉對(duì)象測(cè)試716護(hù)送,遍歷到下一葉對(duì)象操作724與測(cè)試操作712和718時(shí),將處理引擎圖元對(duì)象614和油箱圖元對(duì)象616。當(dāng)處理了所有來(lái)自車(chē)體組對(duì)象節(jié)點(diǎn)606的葉節(jié)點(diǎn)時(shí),遍歷操作704將沿該樹(shù)到車(chē)輪組對(duì)象608。車(chē)輪組對(duì)象及其子對(duì)象的處理與車(chē)體組對(duì)象及其子對(duì)象的處理一樣,除了車(chē)輪組對(duì)象608包含一Transform3D對(duì)象622。該Transform3D對(duì)象可被用以動(dòng)畫(huà)化摩托車(chē)圖像的車(chē)輪。當(dāng)處理車(chē)輪組對(duì)象608時(shí),操作流程將在測(cè)試Transform3D對(duì)象622之后將經(jīng)分支從組對(duì)象測(cè)試操作706到進(jìn)程組操作708。進(jìn)程組操作708將執(zhí)行對(duì)象622的變換操作以旋轉(zhuǎn)摩托車(chē)的車(chē)輪。圖6示例性3D景物樹(shù)中要處理的最后對(duì)象是裝置視件Model3D對(duì)象610。在處理完該樹(shù)的車(chē)輪組分支后,遍歷操作704將嚴(yán)該樹(shù)到裝置對(duì)象610。在圖7的操作流程中,該流通過(guò)測(cè)試操作706繼續(xù)到繪制視件模型操作722。繪制視件模型操作722繪制由對(duì)象610指定的視件模型。這由圖7的操作完成對(duì)圖6中3D景物樹(shù)的處理。Model3DAPI定義以下API為Model3D對(duì)象定義。圖1中諸如對(duì)象22的Visual3D對(duì)象基本上僅是·包括光線的一3D集合(呈現(xiàn)指令/景物圖/元文件)·定義該景物的2D投影的照相機(jī)·用于將投影映射到局部坐標(biāo)空間中的長(zhǎng)方形2D視點(diǎn),以及·象抗混淆切換、模糊切換等的其它外圍參數(shù)呈現(xiàn)到3D類(lèi)似于2D,呈現(xiàn)通過(guò)作get調(diào)用的DawingContext發(fā)生。例如在2D中,比如DrawingContextctx=...;ctx.DrawRectangle(...);ctx.PushTransform(...);ctx.DrawGeometry(...);ctx.PushTransform(...);ctx.DrawEllipse(...);ctx.Pop();ctx.Pop();為了與2D的一致性,3D中的相似模型為DrawingContext3ctx=...;ctx.DrawMesh(mesh,material);ctx.PushTransform(transform3);ctx.DrawMesh(...);ctx.PushTransform(...);ctx.DrawMesh(...);ctx.Pop();ctx.Pop();注意該呈現(xiàn)模型對(duì)保留模式3D視件(其中簡(jiǎn)單存儲(chǔ)“指令”)和即時(shí)模式3D視件(其中呈現(xiàn)直接發(fā)生,且照相機(jī)需要在前面建立)都能較好地工作。實(shí)際上,在保留模式情形中,內(nèi)部所發(fā)生的是3D建模分層結(jié)構(gòu)正在建立并保留?;蛘撸诩磿r(shí)模式情形中,沒(méi)有這樣的事情發(fā)生,而指令正被直接簽發(fā)且正在維護(hù)有環(huán)境堆棧(例如用于變換)。示例代碼這里是顯示用3D視件API編程的風(fēng)格。該示例簡(jiǎn)單地創(chuàng)建一Visual3D、獲取要呈現(xiàn)的繪制環(huán)境、呈現(xiàn)圖元和光線、設(shè)置照相機(jī)、并將視件添加到控件的子視件中。//Createa3DvisualVisual3Dvisual3=newVisual3D();//Renderintoitusing(Drawing3DContextctx=visual3.Models.Renderopen()){//Rendermeshesandlightsintothegeometryctx.DrawMesn(mesn,material);ctx.PushTransform(transform3);ctx.DrawMesh(...);ctx.PushTransform(secondTransform3);ctx.AddLight(...);ctx.DrawMesh(...);ctx.Pop();ctx.Pop();}//Establishambientpropertiesonthevisualvisual3.Camera=newPerspectiveCamera(...);//AddittothecompositingchildrenofsomecontrolcalledmyControlvisualCollectionchildren=VisualHelper.GetvisualChildren(myControl);//orsomethingchildren.Add(visual3);建模API以上示出了當(dāng)繪制“指令”被簽發(fā)給環(huán)境時(shí)的使用的“命令呈現(xiàn)”風(fēng)格。這不是聲明性使用,且在元素/標(biāo)記章節(jié),我們會(huì)看到該命令行方法并不適合于說(shuō)明性標(biāo)記。因此,有建立并使用類(lèi)似存在于帶有畫(huà)刷、筆、幾何圖形、路徑等2D中的3D“資源”的聲明性方法。最終,使用戶能夠構(gòu)建進(jìn)入3D指令流的眾多類(lèi)型被引入,且被構(gòu)建對(duì)象可不使用該環(huán)境而設(shè)置到Visual3D中。例如,以上基于Drawing3D環(huán)境的示例代碼可被寫(xiě)為//Createa3DvisualVisual3Dvisual3=newVisual3D();visual3.Models.Add(newMeshPrimitive3D(mesh,material));Model3DGroupinnerGroup1=newModel3DGroup();innerGroup1.Transform=transform3;innerGroup1.Children.Add(newMeshPrimitive3D(mesh,material));Model3DGroupinnerGroup2=newModel3DGroup();innerGroup2.Transform=secondTransform3;innerGroup2.Children.Add(newLight(...));innerGroup2.Children.Add(newMeshPrimitive3D(...));innerGroup1.Children.Add(innerGroup2);visual3.Models.Add(innerGroup1);//Everythingelseisthesameasbefore...//Establishambientpropertiesonthevisualvisual3.Camera=newPerspectiveCamera(...);//AddittothecompositingchildrenofsomecontrolcalledmyControlVisualCollectionchildren=VisualHelper.GetVisualChildren(myControl);//orsomethingchildren.Add(visual3);在此,我們正是在建立模型并將其賦到Visual3D中。PushTransform/Pop對(duì)由本身具有在其下面變換和模型的Model3D組的構(gòu)建所替換。再一次,提供該建模方法和命令性基于環(huán)境的方法的要點(diǎn)不是要混淆,而是提供一方案用于·元素層聲明性標(biāo)記·視件枚舉·景象圖效果·視件內(nèi)容的可更改性建模類(lèi)分層結(jié)構(gòu)圖1示出建模類(lèi)分層結(jié)構(gòu)。該建模類(lèi)樹(shù)的根是Model3D,它表示可賦予Visual3D的三維模型。最終,燈光、網(wǎng)格、.X文件流(因此它可來(lái)自文件、資源、存儲(chǔ)器等)、模型組、以及3D放置的2D視件都是模型。因而。我們有以下分層結(jié)構(gòu)·Model3DοModel3Dgroup-將一組Model3D處置為一個(gè)單元的容器οPrimitive3D◆MeshPrimitive3D(網(wǎng)格、材質(zhì)、hitTestID)◆ImportedPrimitive3D(流、hitTestID)(對(duì).x文件)ο光線◆AmbientLight(外圍光線)◆SpecularLight(鏡面光線)·DirectionalLight(有向光線)·PointLight(點(diǎn)光線)οSpotLight(聚光光線)οVisualModel3D-具有視件、Point3以及hitTestIDModel3D類(lèi)本身支持以下操作·獲得3D邊界框·獲得并設(shè)置Model3D的變換·獲得并設(shè)置其它“節(jié)點(diǎn)”層屬性,如明暗模式·獲得并設(shè)置hitTestObject視件API規(guī)范首先,注意盡管它未對(duì)每個(gè)類(lèi)型顯式列出,這些類(lèi)型的每一種都具有以下方法(在此對(duì)Vector3D示出,但也可應(yīng)用于每個(gè)其它類(lèi)型)publicstaticbooloperator==(Vector3Dvector1,vector3Dvector2)publicstaticboolEquals(Vector3Dvector1,vector3Dvector2)pudlicstaticbooloperatorl=(vector3Dvector1,vector3Dvector2)publicoverrideboolEquals(objecto)publicoverrideintGetHashCode()publicoverridestringToString()還有,每種源自Changeable(可變化)(直接或間接)的類(lèi)型對(duì)它將需要具有起始的“publicnewMyTypeCopy()”。圖元類(lèi)型這些圖元類(lèi)型僅為支持本章節(jié)中所述的其它類(lèi)型而存在。Point3DPoint3D是對(duì)2D點(diǎn)類(lèi)型System.Windows.Point的直接模擬。publicstructSystem.windows.Media3D.Point3D{publicPoint3D();//initializesto0,0,0publicPoint3D(doublex,doubley,doublez);publicdoubleX{get;set;}publicdoubleY{get;set;}publicdoubleZ{get;set;}publicvoidoffset(doubledx,doubledy,doubledz);publicstaticPoint3Doperator+(Point3Dpoint,Vector3Dvector);publicstaticPoint3Doperator-(Point3Dpoint,Vector3Dvector);publicstaticvector3Doperator-(Point3Dpoint1,Point3Dpoint2);publicstaticPoint3Doperator*(Point3Dpoint,Matrix3Dmatrix);publicstaticPoint3Doperator*(Point3Dpoint,Transtorm3Dtransform);publicstaticexplicitoperatorvector3D(Point3Dpoint);//Explicitpromotionofa3Dpointtoa4Dpoint.Wcoordbecomes1.publicstaticexplicitoperatorPoint4D(Point3Dpoint);}TypeConverter規(guī)范coordinate:double-number-representationcomma-wsp:onecommawithanyamountofwhitespacebeforeoraftercoordinate-triple:(coordinatecomma-wsp){2}coordinatepoint3D:coordinate-tripleVector3DVector3D是對(duì)2D向量類(lèi)型System.Windows.Vector的直接模擬。publicstructSystem.windows.Media3D.Vector3D{publicVector3D()://initializesto0,0,0publicVector3D(doublex,doubley,doublez);publicdoubleX{get;set;}publicdoubleY{get;set;}publicdoubleZ{get;set;}publicdoubleLength{get;}publicdoubleLengthSquared{get;}publicvoidNormalize();//maketheVector3DunitlengthpublicstaticVector3Doperator-(Vector3Dvector);publicstaticVector3Doperator+(Vector3Dvector1,Vector3Dvector2);publicstaticVector3Doperator-(Vector3Dvector1,Vector3Dvector2);publicstaticPoint3Doperator+(Vector3Dvector,Point3Dpoint);publicstaticPoint3Doperator-(Vector3Dvector,Point3Dpoint);publicstaticVector3Doperator*(Vector3Dvector,doublescalar);publicstaticVector3Doperator*(doublescalar,Vector3Dvector);publicstaticVector3Doperator/(Vector3Dvector,doublescalar);publicstaticVector3Doperator*(Vector3Dvector,Matrix3Dmatrix);publicstaticVector3Doperator*(Vector3Dvector,Transform3Dtransform);//returnthedotproduct:vector1.X*vector2.X+vector1.Y*vector2.YpublicstaticdoubleDotProduct(Vector3Dvector1,Vector3Dvector2);//returnavectorperpendiculartothetwoinputvectorsbycomputing//thecrossproduct.publicstaticVector3DCrossProduct(Vector3Dvector1,Vector3Dvector2);//Returntheanglerequiredtorotatev1intov2,indegrees//Thiswillreturnavaluebetweendegrees//(NotethatthisisslightlydifferentfromtheVectormember//functionofthesamename.Sionedantglesdonotextendto3D.)publicstaticdoupleAngleBetween(vector3Dvector1,vector3Dvector2);publicstaticexplicitoperatorPoint3D(Vector3Dvector);}//Explicitpromotionofa3Dvectortoa4Dpoint.Wcoordbecomes0.publicstaticexplicitoperatorPoint4D(vector3Dpoint);TypeConverter規(guī)范point3D:coordinate-triplePoint4DPoint4D將一第四組件w加入3D點(diǎn)中,并被用于通過(guò)非仿射Matrix3D變換。這不是Vector4D,因?yàn)椤畐’組件1變換為Point3D,而‘w’組件0變換為Vector3D。publicstructSystem.Windows.Media3D.Point4D{publicPoint4D();//initializesto0,0,0,0publicPoint4D(doublex,doubley,doublez,doublew);publicdoubleX{get;set;}publicdoubleY{get;set;}publicdoubleZ{get;set;}publicdoubleW{get;set;}publicstaticPoint4Doperator-(Point4Dpoint1,Point4Dpoint2);publicstaticPoint4Doperator+(Point4Dpoint1,Point4Dpoint2);publicstaticPoint4Doperator*(doublescalar,Point4Dpoint);publicstaticPoint4Doperator*(Point4Dpoint,doublescalar);publicstaticPoint4Doperator*(Point4Dpoint,Matrix3Dmatrix);publicstaticPoint4Doperator*(Point4Dpoint,Transform3Dtransform);}TypeConverter規(guī)范point4D:coordinate-quad四元體四元體顯然是表示三維旋轉(zhuǎn)的3D實(shí)體。它們的能力來(lái)自能夠在四元體之間內(nèi)插(并因而動(dòng)畫(huà)化)以獲取平滑可靠的內(nèi)插。該特定內(nèi)插機(jī)制被稱為球形線性內(nèi)插(或SLERP)。四元體可從其組件(x,y,z,w)的直接規(guī)范構(gòu)建,或者被構(gòu)建為軸/角度表示。第一種表示可導(dǎo)致非標(biāo)準(zhǔn)化的四元體,對(duì)它而言某些操作沒(méi)有意義(例如提取軸和角度)。一旦構(gòu)建了四元體就不能設(shè)置其組件了,因?yàn)檫@樣做可能會(huì)有模糊性。(例如,在非標(biāo)準(zhǔn)化四元體上設(shè)置角度意味著什么?)publicstructSystem.windows.Media3D.Quaternion{publicQuaternion();//initializesto0,0,0,0//Non-normalizedquaternionsareallowedpublicQuaternion(doublex,doubley,doublez,doublew);//allowconstructionthroughaxisandanglepublicQuaternion(Vector3DacisofRotation,doubleangleInDegrees);//fundamentalQuaternioncomponentspublicdoubleX{get;}publicdoubleY{get;}publicdoubleZ{get;}publicdoubleW{get;}//axis/angleaccess.willraiseanexceptionifthequaternion//isnotnormalized.publicVector3DAxis{get;}publicdoubleAngle{get;}//indegrees,justlikeeverythingelse//Magnitudeof1Onlynormalizedquaternionscanbeusedin//RotateTransform3D′s.publicboolIsNormalized{get;}publicQuaternionConjugate();//returnconjugateofthequaternionpublicQuaternionInverse();//returntheinverseofthequaternionpublicQuaternionNormalize();//returnanormalizedquaternionpublicstaticQuaternionoperator+(Quaternionleft,Quaternionright);publicstaticQuaternionoperator-(Quaternionleft,Quaternionright);publicstaticQuaternionoperator*(Quaternionleft,Quaternionright);//smoothlyinterpolatebetweentwoquaternionspublicstaticQuaternionslerp(Quaternionleft,Quaternionriqht,doublet);}TypeConverter規(guī)范quaternion:coordinate-guad|//x,y,z,wrepresentation″(″coordinate-triple″)″coordinate//axis,anglerepresentationMatrix3DMatrix3D是對(duì)System.Windows.Matrix的3D模擬。類(lèi)似于Matrix(矩陣),大多數(shù)API不取Matrix3D,而取深入方式支持動(dòng)畫(huà)的Transform3D。3D計(jì)算的矩陣被表示為4×4矩陣。MIL使用行向量語(yǔ)法。m11m12m13m14m21m22m23m24m31m32m33m34offsetXoffsetYoffsetZm44]]>當(dāng)矩陣被乘以一點(diǎn)時(shí),它將該點(diǎn)從新坐標(biāo)系統(tǒng)變換到先前的坐標(biāo)系統(tǒng)。變換可被嵌套到任意層。在應(yīng)用新變換的任何時(shí)候,都與將其左乘到當(dāng)前變換矩陣上相同。publicstructSystem.windows.Media3D.Matrix3D{//ConstructionandsettingpublicMatrix();//defaultstoidentitypublicMatrix(doublem11,doublem12,doublem13,doublem14,doublem21,doublem22,doublem23,doublem24,doublem31,doublem32,doublem33,doublem34,doubleoffsetX,doubleoffsetY,doubleoffsetzZ,doublem44);//IdentitypublicstaticMatrix3DIdentity{get;}publicvoidSetIdentity();publicboolIsIdentity{get;}//MathoperationspublicvoidPrepend(Matrix3Dmatrix);//″this″becomes:matrix*thispublicvoidAppend(Matrix3Dmatrix);//″this″becomes:this*matrix//Rotations-Ouaternionversions.Ifyouwantaxis/anglerotation,//bulidthequaternionoutoraxls/angle.publicvoidRotate(Quaternionquaternion);publicvoidRotatePrepend(Quaternionquaternion);publicvoidRotateAt(Quaternionquaternion.Point3Dcenter):publicvoidRotateAtPrepend(Quaternionquaternion,Point3Dcenter);publicvoidScale(Vector3DscalingVector);publicvoidScalePrepend(Vector3DscalindVector):publicvoidScaleAt(Vector3DscalingVector,Point3Dpoint);publicvoidScaleAtPrepend(Vector3DscalingVector,Point3Dpoint);publicvoidSkew(vector3DskewVector);//Appendsaskew,indegreespublicvoidSkewPrepend(Vector3DskewVector);publicvoidSkewAt(Vector3DskewVector,Point3Dpoint);publicvoidSkewAtPrepend(Vector3DskewVector,Point3Dpoint);publicvoidTranslate(Vector3Doffset);//AppendsatranslationpublicvoidTranslatePrepend(Vector3Doffset);//PrependsatranslationpublicstaticMatrix3Doperator*(Matrix3Dmatrix1,Matrix3Dmatrix2);//Transformationservices.ThosethatoperateonVector3DandPoint3D//raiseanexceptionifIsAffine==false.publicPoint3DTransform(Point3Dpoint);publicvoidTransform(Point3D[]points);publicPoint4DTransTorm(Point4Dpoint);publicvoidTransform(Point4D[]points);//SincethisisavectorignorestheoffsetpartsofthematrixpublicVector3DTransform(Vector3Dvector);publicvoidTransform(Vector3D[]vectors);//CharacteristicsofthematrixpublicboolIsAffine{get:}//trueifm{1,2,3}4==0,m44==1.publicdoubleDeterminant{get;}publicboolHasInverse{get;}publicMatrix3DInverse{get;}//ThrowsInvalidoperationExceptionif!HasInverse//IndividualmemberspublicdoubleM11{get;set;}publicdoubleM12{get;set;}publicdoubleM13{get;set;}publicdoubleM14{get;set;}publicdoubleM21{get;set;}publicdoubleM22{get;set;}publicdoubleM23{get;set;}publicdoubleM24{get;set;}publicdoubleM31{get;set;}publicdoubleM32{get;set;}publicdoubleM33{get;set;}publicdoubleM34{get;set;}publicdoubleoffsetX{get;set;}publicdoubleoffsetY{get;set;}publicdoubleoffsetZ{get;set;}publicdoubleM44{get;set;}};TypeConverter規(guī)范matrix3D:(coordinatecomma-wsp){15}coordinate|″Identity″Transform3D類(lèi)分層結(jié)構(gòu)類(lèi)似于2D變換,Transform3D是帶有表示特定類(lèi)型3D變換的具體子類(lèi)的呈現(xiàn)基類(lèi)。Transform3D的特定子類(lèi)也可以是動(dòng)畫(huà)進(jìn)入之處。Transform3D的整體分層結(jié)構(gòu)看起來(lái)如下并在圖8中示出Transfom3D----Transform3Dcollection----AffineTransform3D---------TranslateTransform3D---------ScaleTransform3D---------RotateTransform3D----MatrixTransform3DTransform3D根Transform3D對(duì)象802具有某些有趣的用于構(gòu)建特定類(lèi)型變換的靜態(tài)方法。注意它不展現(xiàn)Matrix3D表示,因?yàn)樵撟儞Q會(huì)比較寬廣。publicabstractclassSystem.windows.Media.Media3D.Transform3D:Changeable{internalTransform3D();publicnewTransform3Dcopy();//statichelpersforcreatingcommontransformspublicstaticMatrixTransTorm3DCreateMatrixTransTorm(Matrix3Dmatrix);publicstaticTranslateTransform3DCreateTranslation(Vector3Dtranslation);publicstaticRotateTransform3DCreateRotation(Vector3Daxis,doubleangle);publicstaticRotateTransform3DcreateRotation(Vector3Daxis,doubleangle;Point3DrotationCenter);publicstaticRotateTransform3DCreateRotation(Quaternionquaternion);publicstaticRotateTransform3DCreateRotation(Quaternionquaternion,Point3DrotationCenter);publicstaticScaleTransform3DCreateScale(Vector3DscaleVector);publicstaticScaleTransform3DCreateScale(Vector3DscaleVector,Point3DscaleCenter);publicstaticTransform3DIdentity{get;}//InstancememberspublicboolIsAffine{get;}publicPoint3DTransform(Point3Dpoint);publicVector3DTransform(Vector3Dvector);publicPoint4DTransform(Point4Dpoint);publicvoidTransform(Point3D[]points):publicvoidTransform(Vector3D[]vectors);publicvoidTransform(Point4D[]points);}注意如果該變換不是一仿射變換,取Point3D/Vector3D的]Transform()方法將出現(xiàn)例外。Transform3DCollectionTransform3D集合對(duì)象804將完全模擬視件2D中的TransformCollection,其Add方法用以上Create方法的同樣方式更改。publicsealedclassSystem.windows.Media3D.Transform3DCollection:Transform3D,IList{//followthemodelofTransformCollection}AffineTransform3D仿射Transform3D對(duì)象806僅是(從翻譯、扭曲、旋轉(zhuǎn)、縮放)導(dǎo)出所有具體的仿射3D變換的基類(lèi),并且它展現(xiàn)對(duì)Matrix3D的讀取訪問(wèn)。publicabstractclassSystem.windows.Media3D.AffineTransform3D:Transform3D{internalAffineTransform3D();//non-extensiblepublicvirtualMatrix3Dvalue{get;}}翻譯Transform3D對(duì)象808publicsealedclassSystem.windows.Media3D.TranslateTransform3D:AffineTransform3D{publicTranslateTransform3D():publicTranslateTransform3D(Vector3Doffset):publicTranslateTransform3D(Vector3Doffset,Vector3DAnimationCollectionoffsetAnimations);publicnewTranslateTransform3Dcopy();publicvector3Doffset{get;set;}publicvector3DAnimationCollectionoffsetAnimations{get;set;}publicoverrideMatrix3DValue{get;}}縮放Transform3D對(duì)象812publicsealedclassSystem.Windows.Media3D.ScaleTransform3D:AffineTransform3D{publicScaleTransform3D();publicScaleTransform3D(Vector3DscaleVector);publicScaleTransform3D(Vector3DscaleVector,Point3DscaleCenter);publicScaleTransform3D(Vector3DscaleVectorVector3DAnimationCollectionscaleVectorAnimations,Point3DscaleCenter,Point3DAnimationCollectionscaleCenterAnimations);publicnewScaleTransform3DCopy();publicVector3DScaleVector{get;set;}publicVector3DAnimationCollectionScaleVectorAnimations{get;set;}[Animations(″ScaleCenterAnimations″)]publicPoint3DScaleCenter{get;set;}publicPoint3DAnimationCollectionScaleCenterAnimations{get;set;}publicoverrideMatrix3DValue{get;}}RotateTransform3D由于要四處旋轉(zhuǎn)的軸(以及因而四元體的使用)的概念引入,旋轉(zhuǎn)Transform3D對(duì)象812不僅僅是來(lái)自2D旋轉(zhuǎn)的簡(jiǎn)單映射。publicsealedClassRotateTransform3D:AffineTransform3D{publicRotateTransform3D();publicRotateTransform3D(Vector3Daxis,doubleangle);publicRotateTransform3D(Vector3Daxis.doubleangle,Point3Dcenter);//QuaternionssuppliedtoRotateTransform3Dmethodsmustbenormalized,//otherwiseanexceptionwillberaisedpublicRotateTransform3D(Quaternionquaternion);publicRotateTransform3D(Quaternionquaternion,Point3Dcenter);publicRotateTransform3D(Quaternionquaternion,QuaternionAnimationCollectionquaternionAnimations,Point3Dcenter,Point3DAnimationCollectioncenterAnimations);publicnewRotateTransform3DCopy();//Angle/AxisarejustadifferentviewontheQuaternionRotationparameter.If//Angle/Axischanges,QuaternionRotationwillchangeaccordingly,andvice-versa.publicdoubleAngle{get;set;}publicVector3DAxis{get;set;}[Animations(″QuaternionRotationAnimations″)]publicQuaternionQuaternionRotation{get;set;}publicQuaternionAnimationCollectionQuaternionRotationAnimations{get;set;}[Animations(″CenterAnimations″)]publicPoint3DCenter{get;set;}publicPoint3DAnimationCollectionCenterAnimations{get;set;}publicoverrideMatrix3DValue{get;}}注意在此僅僅四元體屬性是可動(dòng)畫(huà)化的。一般而言,軸/角度的動(dòng)畫(huà)并不會(huì)工作得很好。為了更好地動(dòng)畫(huà)四元體,我們可從四元體的基值中提取軸和角度。如果僅僅想要在固定軸上動(dòng)畫(huà)角度,指定它的簡(jiǎn)便方法是建立表示這些位置的兩個(gè)四元體,并在它們之間動(dòng)畫(huà)。MatrixTransform3D矩陣Transform3D對(duì)象直接從Matrix3D中建立Transform3D。publicsealedclassSystem.Windows.Media3D.MatrixTransform3D:Transform3D{publicMatrixTransform3D();publicMatrixTransform3D(Matrix3Dmatrix};publicnewMatrixTransform3DCopy();publicMatrix3DValue{get;set;}}Transform3DTypeConverter當(dāng)一Transform3D類(lèi)型屬性在標(biāo)記中指定時(shí),該屬性系統(tǒng)使用變換類(lèi)型變換器以將字符串表示變換成適當(dāng)?shù)淖儞Q導(dǎo)出對(duì)象。無(wú)法使用該語(yǔ)法來(lái)描述動(dòng)畫(huà)屬性,但可使用復(fù)雜的屬性語(yǔ)法用于動(dòng)畫(huà)描述。語(yǔ)法該語(yǔ)法模擬2D變換。<>表示可任選參數(shù)?!atrix(m00m01m02m03m11...m33)·translate(txtytz)·scale(sx<sy><sz><cx><cy><cz>)ο如果未指定<sy>或<sz>,假設(shè)為統(tǒng)一大小。ο如果指定了<cx><cy><cz>,則它們以及<sy><sz>都需要指定。它們被用作縮放中心。如果未指定,則中心被假設(shè)為0,0,0?!otate(axayazangle<cx><cy><cz>)οaxayaz指定旋轉(zhuǎn)軸ο角度是通過(guò)該軸的角度ο如果未指定cxcycz,則假設(shè)為0,0,0。·skew(angleXangleYangleZ<cx><cy><cz>)ο如果未指定cxcycz,則假設(shè)為0,0,0。文法transform-list:wsp*transformswsp*transforms:transform|transformcomma-wsp+transformstransform:matrix|translate|scale|rotate|skewX|skewYmatrix:″matrix″wsp*″(″wsp*numbercomma-wspnumbercomma-wsp...13moretimes...numberwsp*″)″translate:″translate″wsp*″(″wsp*number(comma-wspnumbercomma-wspnumber)wsp*″)″scale:″scale″wsp*″(″wsp*number(comma-wspnumbercomma-wspnumber(comma-wspnumbercomma-wspnumbercomma-wspnumber))wsp*″)″rotate:″rotate″wsp*″(″wsp*numberwsp*numberwsp*numberwsp*number(comma-wspnumbercomma-wspnumbercomma-wspnumber)wsp*″)″skew:″rotate″wsp*″(″wsp*numberwsp*numberwsp*number(comma-wspnumbercomma-wspnumbercomma-wspnumber)wsp*″)″Visual3D圖1中Visual3D對(duì)象22從Visual2D中導(dǎo)出,且這樣做時(shí)得到所有其屬性,包括·不透明·2D幾何圖形剪輯·2D混合模式·點(diǎn)擊測(cè)試API·2D邊界查詢·視件樹(shù)中參與注意所有不透明、剪輯、混合模式以及邊界都應(yīng)用于3D景物的2D投影。publicclassSystem.Windows.Media3D.Visual3D:Visual{publicVisual3D();publicVisual3D(UIContextContext);//Modeling-orientedsemantics.Defaultvalueisanemptycollection.publicModel3DCollectionModels{get;set;}//Ambientproperties//Camera-there'snodefault,it'sanerrornottoprovideone.publicCameraCamera{get;set;}//ViewPortestablisheswheretheprojectionmapstoin2D.Defaultis0,0,1,1[Animation(″ViewPortAnimations″)]publicRectViewPort{get;set;}publicRectAnimationCollectionViewPortAnimations{get;set;}publicFogFog{get;set;}}當(dāng)由照相機(jī)/模型組合確定的投影映射到2D局部坐標(biāo)空間時(shí),建立視點(diǎn)框。Drawing3DContextDrawing3DContext非常類(lèi)似于2D繪制環(huán)境,且通過(guò)RenderOpen/RenderAppend可從Visual3D的Model3Dcollection訪問(wèn)。它感覺(jué)像是即時(shí)模式的呈現(xiàn)環(huán)境,盡管它是內(nèi)部的保留指令。publicclassSystem.Windows.Media3D.Drawing3DContext:IDisposable{internalDrawing3DContext();//can'tbepubliclyconstructed//RenderingpublicvoidDrawMesh(Mesh3Dmesh,Materialmaterial,objecthitTestToken);//Thesearefordrawingimportedprimitiveslike.xfilespublicvoidDrawImportedPrimitive(ImportedPrimitive3DSourceprimtiveSource,objecthitTestToken);publicvoidDrawImportedPrimitive(ImportedPrimtive3DSourceprimitiveSource,MaterialoverridingMaterial,objecthitTestToken);publicvoidDrawVisual(Visualvisual,Point3DcenterPosition,objecthitTestToken);publicvoidDrawModel(Model3Dmodel);publicvoidAddLight(Lightlight);//StackmanipulationpublicvoidPushTransform(Transform3Dtransform);publicvoidPop();publicvoidClose();//AlsoinvokedbyDispose();}對(duì)于這些Drawing3Dcontext操作的語(yǔ)義上的特定細(xì)節(jié),參看建模API章節(jié),其中實(shí)際上Drawing3Dcontext只是為了方便。例如,DrawImportedPrimitive(ImportedPrimitive3DsourceprimitiveSource、objectHitTestToken)僅創(chuàng)建了ImportedPrimitive3D,并將其添加到當(dāng)前積累的Model3D中(而它通過(guò)環(huán)境中的Push/Pop方法操縱)。DrawModel()是在“環(huán)境”世界和“建?!笔澜缰g的另一交叉點(diǎn),使Model3D能被畫(huà)入環(huán)境中。沒(méi)有從Drawing3Dcontext中的顯式“讀回”。這是因?yàn)樗鼉H具有支持它的Model3Dgroup,并可一直枚舉該集合。建模API這是這些類(lèi)的公共及受保護(hù)的API,沒(méi)有顯示繼承成員。Model3D圖1中的Model3D對(duì)象是從中建立任何對(duì)象的抽象模型對(duì)象。publicabstractclassModel3D:Cnangeable{publicTransform3DTransform{get;set;}//defaultstoIdentitypublicShadingModeShadingMode{get;set;}publicobjectHitTestToken{get;set;}publicRect3DBounds3D{get;}//Boundsforthismodel//singleton″e(cuò)mpty″model.publicstaticModel3DEmptyModel3D{get;}}Model3DGroup圖1中的Model3DGroup對(duì)象18是構(gòu)建一模型組合,并通過(guò)可任選地變換其它屬性或及其應(yīng)用到各模型中而視它們?yōu)橐粋€(gè)單元的地方。publicsealedclassModel3DGroup:Model3D{publicModel3DGroup();//Drawing3DContextsemanticspublicDrawing3DContextRenderOpen();publicDrawing3DContextRenderAppend();//Model3DCollectionisastandardIListofModel3Ds.publicModel3DCollectionChildren{get;set;}}注意Model3DGruop還具有返回一Drawing3DContext的RenderOpen/Append。該環(huán)境的使用更改了Model3DCollection本身。RenderOpen()和RenderAppend()之間的差異是RenderOpen()首先清空該集合。還要注意在Model3DGruop上一次只能打開(kāi)一個(gè)Drawing3DContext,且當(dāng)它被打開(kāi)時(shí),應(yīng)用程序可能不能直接訪問(wèn)(用于讀取或?qū)懭?Model3Dgruop上的內(nèi)容。光線分層結(jié)構(gòu)光線對(duì)象是Model3D對(duì)象。它們包括外圍、位置、有向、和光斑光線。它們正是在Direct3D光線集上建模的,但具有作為建模分級(jí)結(jié)構(gòu)一部份的附加屬性,且因此可作坐標(biāo)空間變換。在所有光線上都提供外圍、彌散、以及鏡面色彩。光線分層結(jié)構(gòu)看起來(lái)如下,并在圖9示出Model3D----Light(抽象)-------AmbientLight(具體)-------DirectionLight(具體)-------PointLight(具體)----------SpotLight(具體)基光線對(duì)象902僅為具有如下的抽象類(lèi)publicabstractclassLight:Model3D{internalLight();//onlyallowpublicconstruction-no3rdpartylights[Animation(″AmbientColorAnimations″)]publicColorAmbientColor{get;set;}publicColorAnimationCollectionAmbientColorAnimations{get;set;}[Animation(″DiffuseColorAnimations″)]publicColorDiffuseColor{get;set;}publicColorAnimationCollectionDiffuseColorAnimations{get;set;}[Animation(″SpecularColorAnimations″)]publicColorSpecularColor{get;set;}publicColorAnimationCollectionSpecularColorAnimations{get;set;}}AmbientLight外圍光線對(duì)象904光線除其形狀外統(tǒng)一建模。publicsealedclassAmbientLight:Light{publicAmbientLight(ColorambientColor);}DirectionLight來(lái)自有向光線對(duì)象906的有向光線在空間上沒(méi)有位置,并將其光線沿由向量定義的一特定方向投影。publicsealedclassDirectionalLight:Light{publicDirectionalLight{Colordiffusecolor,Vector3Ddirection);//commonusage[Animation(″DirectionAnimations″)]publicVector3DDirection{get;set;}publicVector3DAnimationCollectionDirectionAnimations{get;set;}}該方向無(wú)需標(biāo)準(zhǔn)化,但它還必須具有非零幅度。PointLight來(lái)自點(diǎn)光線對(duì)象908的定位光線具有空間位置并向所有方向投影其光線。光線的分散由衰減和范圍屬性控制。publicclassPointLight:Light{publicPointLight(ColordiffuseColor,Point3Dposition);//commonusage[Animation(″PositionAnimations″)]publicPoint3DPosition{get;set;}publicPoint3DAnimationCollectionPositionAnimations{get;set;}//Rangeofthelight,beyondwhichithasnoeffect.ThisisSpecified//inlocalcoordinates.publicdoubleRange{get,set,}publicDoubleAnimationCollectionRangeAnimations{get,set,}//constant,linear,andguadraticattenuationfactorsdefineshowthelight//attenuatesbetweenitspositionandthevalueotRange.publicdoubleConstantAttenuation{get;set;}publicDoubleAnimationCollectionConstantAttenuationAnimations{get;set;}[Animation(″LinearAttenuationAnimations″)]publicdoubleLinearAttenuation.{get;set;}publicDoubleAnimationCollectionLinearAttenuationAnimations{get;set;}[Animation(″QuadraticAttenuationAnimations″)]publicdoubleQuadraticAttenuation{get;set;}publicDoubleAnimationCollectionQuadraticAttenuationAnimations{get;set;}}SpotLightSpotLight從PointLight導(dǎo)出為具有位置、范圍和衰減,但還添加了方向以及控制光線“錐形”的參數(shù)。為了控制該“錐形”,必須制定outerConeAngle(外部錐角)(其外沒(méi)有東西被照亮)和innerConeAngle(內(nèi)部錐角)(其內(nèi)所有東西被照亮)。內(nèi)部錐形外部和外部錐形之間的光照線性衰減。(此處造成混淆的一個(gè)源是有兩個(gè)分散-一個(gè)是內(nèi)部錐形和外部錐形邊界之間的“角度”分散;另一個(gè)則是距離上相對(duì)于光線位置的距離上的分散并受衰減和范圍影響。)publicsealedclassSpotLight:PointLight{publicSpotLight(Colorcolor,Point3Dposition,Vector3Ddirection,doubleouterConeAngle,doubleinnerConeAngle);publicVector3DDirection{get;set;}publicVector3DAnimationCollectionDirectionAnimations{get;set;}[Animation(″OuterConeAngleAnimations″)]publicdoubleOuterConeAngle{get;set;}puolicDoubleAnimationCollectionouterConeAngleAnimations{get;set;}[Animation(″InnerConeAngleAnimations″)]publicdoubleInnerConeAngle{get;set;}publicDoubleAnimationCollectionInnerConeAngleAnimations{get;set;}}注意角度以度指定。Primitive3D圖1中Primitive3D對(duì)象12是導(dǎo)致在樹(shù)上呈現(xiàn)的頁(yè)節(jié)點(diǎn)。具體的類(lèi)帶入顯式制定的網(wǎng)格、以及被引入的圖元(.x文件)。publicabstractclassPrimitive3D:Model3D{internalPrimitive3D(objecthitTestToken);}MeshPrimitive3DMeshPrimitive3D用于以網(wǎng)格和材質(zhì)建模。publicsealedclassMeshPrimitive3D:Primitive3D{publicMeshPrimitive3D(Mesh3Dmesh,Materialmaterial,obiecthitTestToken);publicMesh3DMesh{get;set;}publicMaterialMaterial{get;set;}}注意MeshPrimitive3D是葉幾何圖形,且它不包含自身而是包含網(wǎng)格。這意味著無(wú)需復(fù)制網(wǎng)格數(shù)據(jù)就可在帶有不同材質(zhì)、用于不同點(diǎn)擊測(cè)試的多個(gè)MeshPrimitive3D上共享一網(wǎng)格。ImportedPrimitive3DImportedPrimitive3D表示可變換成適當(dāng)內(nèi)部形式的所攜帶的外部獲取圖元(可能帶有材質(zhì)和動(dòng)畫(huà))。它被Avalon示為剛性模型。其規(guī)范實(shí)例為.X文件,且具有顯式引入.X文件的ImportedPrimitive3Dsource子類(lèi)。publicsealedclassImportedPrimitive3D:Primitive3D{publicImportedPrimitive3D(ImportedPrimitive3DSourceprimitive,objecthitTestToKen);publicImportedPrimitive3DSourcePrimitiveSource{get;set;}//Allowoverridingtheimportedmaterial(s)iftherewasany.Ifnotspecified.//thisisnull,andthebuiltinmaterialisused.publicMaterialOverridingMaterial{get;set;}}ImportedPrimitive3D的TypeConverter由于.x文件被包括在景物中,用于表達(dá)它的簡(jiǎn)單TypeConverter格式看起來(lái)應(yīng)為<ImportedPrimitive3Dxfile=″myFile.x″/>VisualModel3DVisualModel3D取任意視件(按定義為2D)并將其置于景物中。在呈現(xiàn)時(shí),它將是與屏幕對(duì)齊的,且其尺寸不受影響,但它將在照相機(jī)的特定Z平面上。該視件將保持交互。publicsealedclassVisualModel3D:Model3D{publicVisualModel3D(Visualvisual,Point3centerPoint,objecthitTestToKen);publicVisualVisual{getset;}publicPoint3DCenterPoint{get;set;}}呈現(xiàn)VisualModel3D首先將CenterPoint變換到整體坐標(biāo)中。然后以屏幕對(duì)齊方式將該視件呈現(xiàn)到像素緩存中,其中經(jīng)變換CenterPoint的z在置入視件中心之處。在照相機(jī)運(yùn)動(dòng)中,VisualModel3D將一直占用同樣數(shù)量的屏幕資產(chǎn),并一直是正向面對(duì)且不受光線等影響。有關(guān)景物的其余部分在該視件的照相機(jī)運(yùn)動(dòng)期間的固定點(diǎn)將在該視件中央,因?yàn)榉胖没谠擖c(diǎn)進(jìn)行。所提供的視件是完全交互式的,并有效地從包括它的Visual3D繼承(注意這意味著給定視件在任意VisualModel3D中僅可使用一次,就像視件僅可具有單個(gè)父親一樣)。Mesh3DMesh3D圖元是可通過(guò)編程構(gòu)建的直接三角圖元(允許索引和非索引指定)。注意它支持位置、法線、色彩和紋理信息,后三個(gè)是可任選的。該網(wǎng)格還允許選擇是否要將其顯示為三角形、直線或點(diǎn)。它還支持用于解釋索引的三種拓樸三角紋、三角條、以及三角扇。對(duì)于不由Mesh3D直接支持的頂點(diǎn)格式和其它圖元構(gòu)建,可構(gòu)建并引入.x文件。publicsealedclassSystem.Windows.Media3D.Mesh3D:Changeable{publicMesh3D();//Vertexdata.Normals,Colors,andTextureCoordinatesarealloptional.publicPoint3DCollectionPositions{get;set;}publicVector3DCollectionNormals{get;set;}//assumedtobenormalizedpublicColorcollectionColors{get;set;}publicColorcollectionSpecularcolors{get;set;}publicPointCollectionTextureCoordinates{get;set;}//Topologydata.Ifnull,treatasnon-indexedprimitivepublicIntegerCollectionTriangleIndices{get;set;}//Primitivetype-default=TriangleListpublicMeshPrimitiveTypeMeshPrimitiveType{get;set;}}MeshPrimitiveType被定義為publicenumSystem.Windows.Media3D.MeshPrimitiveType{TriangleList,TriangleStrip,TriangleFan,LineList,LineStrip,PointList}網(wǎng)格數(shù)據(jù)的解釋Mesh3D中的每個(gè)頂點(diǎn)數(shù)據(jù)被分割到位置、法線、色彩以及紋理坐標(biāo)中。僅位置坐標(biāo)是必需的。如果提供了任一其它坐標(biāo),它們必需具有與位置集合完全一樣的長(zhǎng)度,否則將產(chǎn)生例外。法線(如果提供)假設(shè)是標(biāo)準(zhǔn)化的。當(dāng)需要法線時(shí),則必須提供。TriangleIndices集合具有索引到頂點(diǎn)數(shù)據(jù)的成員,以確定組成網(wǎng)格的三角形的每個(gè)頂點(diǎn)信息。該集合基于MeshPrimitiveType的設(shè)置來(lái)翻譯。這些翻譯與Direct3D中的完全一樣。對(duì)于TriangeList,TriangleIndices集合中的每三個(gè)元素定義一新的三角形。對(duì)于TriangleFan,索引0,1,2確定第一三角形,然后是每個(gè)隨后的索引i確定由頂點(diǎn)0,i,i-1給出的新三角形。對(duì)于TriangleStrip,索引0,1,2確定第一三角形,然后是每個(gè)隨后的索引i確定由頂點(diǎn)i-2,i-1和i給出的新三角形。LineList、LineStrip以及PointList具有類(lèi)似的翻譯,而呈現(xiàn)則根據(jù)直線和點(diǎn)而不是三角形。如果TriangleIndices是空,則網(wǎng)格被實(shí)現(xiàn)為非索引圖元,它等于長(zhǎng)度n的位置集合的持有值0,1,...,n-2,n-1的TriangleIndices。網(wǎng)格的構(gòu)建以及避免數(shù)據(jù)復(fù)制在構(gòu)建網(wǎng)格之后,實(shí)現(xiàn)創(chuàng)建了表示該網(wǎng)格的最優(yōu)D3D結(jié)構(gòu)。此時(shí),真正的集合數(shù)據(jù)結(jié)構(gòu)可通過(guò)網(wǎng)格實(shí)現(xiàn)丟棄以避免數(shù)據(jù)的復(fù)制。例如通過(guò)其它機(jī)制訪問(wèn)的網(wǎng)格的隨后讀回(例如遍歷Visual3D模型分層結(jié)構(gòu))將可能從所持有的D3D信息重建數(shù)據(jù),而不是保留原始數(shù)據(jù)。網(wǎng)格的可變性網(wǎng)格從Changeable(可變的)導(dǎo)出,并因而可更改。該實(shí)現(xiàn)將需要捕捉對(duì)頂點(diǎn)和索引數(shù)據(jù)的設(shè)置,并將這些變化傳播到D3D數(shù)據(jù)結(jié)構(gòu)中。網(wǎng)格的TypeConverter類(lèi)似于所有其它類(lèi)型,XAML復(fù)雜屬性語(yǔ)法可被用以指定定義Mesh3D的集合。然而,提供了TypeConverter以使規(guī)范簡(jiǎn)潔。定義在網(wǎng)格中的每個(gè)集合可取單個(gè)數(shù)字字符串以作解析并用來(lái)創(chuàng)建該集合。例如,僅具有位置和色彩的表示經(jīng)索引三角形條紋的網(wǎng)格可被指定為<Mesh3DmeshPrimitiveType=″TriangleStrip″positions=″1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18″colors=″redbluegreencyanmagentayellow″triangleIndices=″1,3,4,1,2,3,4,5,6,1,2,4,2″/>當(dāng)然,在復(fù)雜屬性語(yǔ)法中這些的任一都可表示為更加繁復(fù)。材質(zhì)構(gòu)建Primitive3D的方法取定義其顯現(xiàn)的材質(zhì)。材質(zhì)是帶有三個(gè)具體子類(lèi)的抽象基類(lèi)BrushMaterial、VisualMaterial、以及AdvancedMaterial。BrushMaterial和VisualMaterial兩者都是稱為BasicMaterial的另一抽象類(lèi)的子類(lèi)。因而Matrial----BasicMaterial--------BrushMaterial--------VisualMaterial----AdvancedMaterial·BrushMaterial僅取單個(gè)畫(huà)刷并可用于大范圍的效果,包括獲取透明度(每個(gè)像素的或分等級(jí)的)、具有紋理變換(甚至動(dòng)畫(huà))、使用視頻紋理、隱式的自動(dòng)生成的mipmap等。具體地,對(duì)于以純色、圖像、梯度、甚至另一視件作為紋理,將只使用SolidColorBrush、ImageBrush、GradientBrush、或VisualBrush來(lái)創(chuàng)建其畫(huà)刷材質(zhì)?!isualMaterial被特別地設(shè)計(jì)成構(gòu)建視件外的材質(zhì)。該材質(zhì)將在輸入從其嵌入的3D世界中傳遞到視件的意義上是交互式的??赡軙?huì)想知道它和帶有VisualBrush的BrushMaterial之間的差異。該差異為BrushMaterial是非交互式的?!けM管比僅使用BrushMaterial或VisualMaterial要復(fù)雜得多,但AdvancedMaterial類(lèi)提供了更多的靈活性。然而,非3D愛(ài)因斯坦無(wú)需知道AdvancedMaterial,并可僅使用BrushMaterial/VisualMaterial來(lái)獲取想獲得的效果。publicabstractclassMaterial:Changeable{internalMaterial();//don′tallowexternalsubclassingpublicnewMaterialcopy();//shadowschangeable.Copy()publicstaticMaterialEmpty{get;}//singletonmaterial}publicabstractclassBasicMaterial:Material{internalBasicMaterial();//don’tallowexternalsubclassingpublicnewBasicMaterialCopy();//shadowsChangeable.copy()MatrixTextureTransform{get;set;}//defaultstoidentity}材質(zhì)獲取極大的靈活性以及基于畫(huà)刷的“經(jīng)濟(jì)概念”。具體地·無(wú)需反映獨(dú)立的類(lèi)似視頻紋理、梯形紋理等的紋理分級(jí)結(jié)構(gòu),因?yàn)槟切┒伎芍付楫?huà)刷?!ぎ?huà)刷已封裝α遮罩和分級(jí)不透明值,從而它們可用以紋飾。·畫(huà)刷是附著,在后來(lái)是庫(kù)存諸如木紋陰影器的過(guò)程陰影器的合適地方。這在2D中將可用作填充或筆,在3D中則用作紋理。對(duì)于過(guò)程陰影器無(wú)需在3D空間中指定特定API支持。注意,TextureTransform屬性不同于可存在于BrushMaterial或VisualMaterial定義之內(nèi)的任意變換。它指定來(lái)自討論中的變換以紋飾坐標(biāo)空間(其范圍為[1,1])。材質(zhì)中的變換與紋理變換組合以描述1×1(紋理坐標(biāo)中)的材質(zhì)如何在網(wǎng)格上映射。陰影器可在API中訪問(wèn)一組“庫(kù)存”陰影器(其中許多被參數(shù)化)如下1)對(duì)于2D世界中有意義的陰影器,它們將被呈現(xiàn)為畫(huà)刷的具體子類(lèi),其參數(shù)化法通過(guò)類(lèi)上構(gòu)建器表達(dá),或表達(dá)為該類(lèi)上的屬性。然后它們可被應(yīng)用于2D對(duì)象。2).對(duì)于僅在3D世界中有意義的陰影器,它們將被呈現(xiàn)為Material或BasicMaterial的具體子類(lèi),其中它們也可通過(guò)其構(gòu)建器參數(shù)化。然后該展現(xiàn)將使陰影器能被應(yīng)用于3D(如果適當(dāng)則2D)網(wǎng)格。BrushMaterial如上所述,BrushMaterial僅封裝一畫(huà)刷。應(yīng)用于Primitie3D的BrushMaterial被視為紋理。紋理將被直接映射—即,正在映射的元上2Du,v坐標(biāo)將直接索引相應(yīng)的紋理上由紋理變換更改的x,y坐標(biāo)。注意,像Avalon中的所有2D,紋理坐標(biāo)系統(tǒng)從左上角沿著正y方向向下。用作畫(huà)刷的VisualBrush將不接受輸入,但它將根據(jù)其上的任何動(dòng)畫(huà)或所發(fā)生的任何結(jié)構(gòu)變化進(jìn)行更新。為了將視件用作材質(zhì)并仍接收輸入,使用如下所述的VisualMaterial是不合法的。publicsealedclassBrushMaterial:BasicMaterial{publicBrushMaterial(Brushbrush);publicnewBrushMaterialCopy();//shadowsMaterial.Copy()publicBrushBrush{get;set;}//Additionaltexturingspecificknobs.}VisualMaterial如上所述,VisualMaterial封裝一交互式視件。這不同于在視件中使用的BrushMaterial,因?yàn)樵撘暭云浼y飾形式保持活動(dòng)。注意視件實(shí)際上以某種形式繼承根Visual3D。在一種以上材質(zhì)中使用單個(gè)UIElement,或在一個(gè)以上地方使用VisualMaterial。publicsealedclassVisualMaterialBasicMaterial{publicVisualMaterial(Visualvisual);publicnewVisualMaterialcopy();//shadowschangeable.Copy()publicVisualVisual{get;set;}--(needtoaddviewport/viewboxstuffforpositioning...)//Additionaltexturingspecificknobs.}AdvancedMaterialBrushMaterials/VisualMaterials以及BumpMaps被用以定義AdvancedMaterial。publicclassAdvancedMaterial:Material{publicAdvancedMaterial();//TODO:Addcommonconstructors.publicnewAdvancedMaterialCopy();//shadowsChangeable.Copy()publicBasicMaterialDiffuseTexture{get;set;}publicBasicMaterialSpecularTexture{get;set;}publicBasicMaterialAmbientTexture{get;set;}publicBasicMaterialEmissiveTexture{get;set;}[Animations(″SpecularPowerAnimations″);publicdoubleSpecularPower{get;set;}publicDoubleAnimationcollectionSpecularPowerAnimations{get;set;}publicBumpMapDiffuseBumpMap{get;set;}publicBumpMapReflectionBumpMap{get;set;}publicBumpMapRefractionBumpMap{get;set;}publicBrushMaterialReflectionEnvironmentMap{get;set;}publicBrushMaterialRefractionEnvironmentMap{get;set;}}注意EnvironmentMaps是期望以特定格式使能立方映射的紋理。具體地,立方映射的6個(gè)表面將需要以與紋理相關(guān)聯(lián)的眾所周知的畫(huà)刷分段來(lái)表示(可能像畫(huà)刷上3×2網(wǎng)格)。外圍、彌散、以及鏡面屬性取一BasicMaterial而非一般材質(zhì),因?yàn)樗鼈儽旧聿槐恢付锳dvancedMaterials。還要注意環(huán)境映射是BrushMaterials。BumpMap定義顛簸映射是通過(guò)圖元上的紋理坐標(biāo)映射到3D圖元上的類(lèi)似紋理的網(wǎng)格。然而,內(nèi)插數(shù)據(jù)被解釋為表面法線的擾動(dòng),導(dǎo)致圖元的“顛簸式”顯現(xiàn)。為了獲得這個(gè),顛簸映射帶有諸如法線擾動(dòng)的信息,以及可能其它信息。它們不帶有色彩或透明度信息。正因?yàn)榇?,將?huà)刷用作顛簸映射是不恰當(dāng)?shù)摹R虼?,我們引入新的BumpMap類(lèi),它將是特定像素格式的ImageSource。publicsealedclassBumpMap:ImageSource{//Fillthisinwhenwefigureoutissuesbelow.}材質(zhì)的TypeConverter材質(zhì)提供簡(jiǎn)單的TypeConverter,它使畫(huà)刷的指定能自動(dòng)提升為BrushMaterial的字符串指定。Material:...delegatetoBrushtypeconverter...這允許指定類(lèi)似于<MeshPrimitive3D...material=″yellow″/><MeshPrimitive3D...material=″LinearGradientbluegreen″/><MeshPrimitive3D...material=″HorizontalGradientorangepurple″/><MeshPrimitive3D...material=″*Resource(myImageResource)″/>“外圍”參數(shù)本節(jié)討論的模型參數(shù)是那些不能在幾何圖形分層結(jié)構(gòu)中任意層次中嵌入的“外圍”參數(shù)。模糊通過(guò)設(shè)置Visual3D上的模糊屬性,可將模糊添加到景物中??捎玫哪:恰跋袼啬:?。模糊被表示為一抽象類(lèi)以及如下所示的分層結(jié)構(gòu)。publicabstractclassFog:Changeable{//onlyconstructableinternallyinternalFog(Colorcolor);publicnewFogCopy();//hidesChangeable.Copy()[Animation(″ColorAnimations″)]publicColorColor{get;set;}publicColorAnimationCollectionColorAnimations{get;set;}//singletonrepresentationof″nofog″publicstaticFogEmpty{get;}}publicsealedclassLinearFog:Fog{publicLinearFog(Colorcolor,doublefogStart,doublefogEnd);publicdoubleFogStart{get;set;}publicDoubleAnimationCollectionFogStartAnimations{get;set;}[Animation(″FogEndAnimations″)]publicdoubleFogEnd{get;set;}publicDoubleAnimationCollectionFogEndAnimations{get;set;}}publicsealedclassExponentialFog:Fog{publicExponentialFog(Coiorcolor,doublefogDensity,boolsquaredExponent);publicdoubleFogDensity{get;set;}publicDoubleAnimationCollectionFogDensityAnimations{get;set;}publicboolSquaredExponent{get;set;}}fogDensty范圍為0-1,且是模糊強(qiáng)度的標(biāo)準(zhǔn)化表示。fogStart和fogEnd是在裝置空間中指定的z深度,并表示模糊開(kāi)始和結(jié)束的地方。照相機(jī)圖1中的照相機(jī)對(duì)象是將3D模型投影到2D視件之上的機(jī)制。照相機(jī)本省是抽象類(lèi)型,有兩個(gè)子類(lèi)-ProjectionCamera(投影照相機(jī))和MatrixCamera(矩陣照相機(jī))。ProjectionCamera本身是帶有兩個(gè)子類(lèi)的抽象類(lèi)-PerspectiveCamera(透視照相機(jī))和OrthogonalCamera(正交照相機(jī))。PerspectiveCamera取眾所周知的參數(shù),諸如位置、視點(diǎn)以及視野以構(gòu)建照相機(jī)。OrthogonalCamera類(lèi)似于PerspectiveCamera,除了它取寬度而不是視野。MatrixCamera取用以定義世界到裝置變換的Matrix3D。publicabstractclassCamera:changeable{//Onlyallowtobebuiltinternally.internalCamera();publicnewCameraCopy();//hidesChangeable.Copy()}在Visual3D中,照相機(jī)被用以提供Model3D上的視圖,而結(jié)果投影被映射到在Visual3D中建立的2DViewPort(視口)。還要注意,Visual3D的2D邊界框?qū)⑹?D模型的封裝其頂點(diǎn)及與軸對(duì)齊外殼的剪輯成建立在視件上的片斷的投影3D框。ProjectionCamera圖1中ProjectionCamera對(duì)象39是從中導(dǎo)出PerspectiveCamera和OrthogonalCamera的抽象父對(duì)象。它封裝MIL(介質(zhì)集成層)所支持的兩類(lèi)ProjectionCamera的公共屬性,諸如位置、查看方向以及上行方向。publicabstractclassProjectionCamera:Camera{//CommonconstructorspublicProjectionCamera();//Cameradata[Animations(″NearPlaneDistanceAnimations″)]publicdoubleNearPlaneDistance{get;set;}//default=0publicDoubleAnimationCollectionNearPlaneDistanceAnimations{get;set;}[Animations(″FarPlaneDistanceAnimations″)]publicdoubleFarPlaneDistance{get;set;}//default=infinitypublicDoubleAnimationCollectionFarPlaneDistanceAnimations{get;set;}[Animations(″PositionAnimations″)]publicPoint3DPosition{get;set;}publicPoint3DAnimationCollectionPositionAnimations{get;set;}[Animations(″LookDirectionAnimations″)]publicPoint3DLookDirection{get;set;}publicPoint3DAnimationCollectionLookDirectionAnimations{get;set;}[Animations(″UpAnimations″)]publicVector3DUp{get;set;}publicVector3DAnimationCollectionupAnimations{get;set;}}PerspectiveCamera圖1中的PerspectiveCamera對(duì)象36是通過(guò)它透視的投影照相機(jī)從諸如位置、視點(diǎn)以及視野等眾所周知的參數(shù)中得以構(gòu)建的裝置。以下說(shuō)明提供了PerspectiveCamera相關(guān)方面的良好指示。圖1查看和投影(視野應(yīng)在水平方向)publicclassPerspectiveCamera:ProjectionCamera{//CommonconstructorspublicPerspectiveCamera();publicPerspectiveCamera(Point3Dposition,Point3DlookDirection,Vector3DUp,doublefieldofview);publicnewProjectionCameraCopy();//hidesChangeable.Copy()[Animations(″FieldofviewAnimations″)]publicdoubleFieldofview{get;set;}publicDoubleAnimationCollectionFieldofViewAnimations{get;set;}}一些注解·PerspectiveCamera從ProjectionCamera繼承位置、查看方向以及上行向量屬性?!ieldOfView表示水平視野,并用度數(shù)指定(像所有其它MIL角度)?!ぽ^近和較遠(yuǎn)的PlaneDistances表示沿LookDirection點(diǎn)定義的向量離照相機(jī)位置的3D世界-坐標(biāo)距離。較近PlaneDistance缺省為零,而較遠(yuǎn)PlaneDistance缺省為無(wú)限。·在真正投影之后,如果近/遠(yuǎn)PlaneDistances仍分別為0/無(wú)限,則根據(jù)照相機(jī)投影來(lái)檢查模型并投影其邊界范圍。然后檢查結(jié)果邊界范圍使較近平面距離被設(shè)置成與與LookDirection垂直的離照相機(jī)位置最近的邊界范圍平面的距離。對(duì)于較遠(yuǎn)平面也是一樣,但使用最遠(yuǎn)的平面。這導(dǎo)致z-緩存方案的優(yōu)化使用,同時(shí)仍顯示整個(gè)模型。注意由PerspectiveCamera的參數(shù)定義的“投影平面”被映射到Visual3D上的視口長(zhǎng)方形,并且這表示從3-空間到2-空間的變換。OrthogonalCamera圖1中OrthogonalCamera對(duì)象37指定從世界到裝置空間的正交投影。類(lèi)似于PerspectiveCamera,OrthogonalCamera或正交照相機(jī)指定位置、查看方向和上行方向。然而,與PerspectiveCamera不同,OrthogonalCamera描述不包括透視縮短的投影。OrthogonalCamera從物理上描述其邊平行的查看框(而PerspectiveCamera描述其邊最終相交于照相機(jī)上一點(diǎn)的查看框)。publicclassOrthoganalCamera:ProjectionCamera{//CommonconstructorspublicOrthogonalCamera();publicOrthogonalCamera(Point3Dposition,Point3DlookDirection,Vector3DUp,doublewidth);publicnewProjectionCameraCopy();//hidesChangeable.Copy()[Animations(″WidthAnimations″)]publicdoubleWidth{get;set;}publicDoubleAnimationCollectionWidthAnimations{get;set;}}一些注解·OrthogonalCamera從ProjectionCamera中繼承位置、查看方向和上行向量屬性?!idth(寬度)表示OrthogonalCamera的查看框,并以世界單位指定。·較近和較遠(yuǎn)PlaneDistances對(duì)PerspectiveCamera一樣動(dòng)作。MatrixCamera圖1中MatrixCamera對(duì)象38是照相機(jī)的子類(lèi),并提供直接將矩陣指定為投影變換。這對(duì)具有自己的投影矩陣計(jì)算機(jī)制的應(yīng)用程序是有用的。它當(dāng)然表示對(duì)系統(tǒng)的先進(jìn)使用。publicclassMatrixCamera:Camera{//CommonconstructorspublicMatrixCamera();publicMatrixCamera(Matrix3DViewMatrix,Matrix3DProjectionMatrix);publicnewMatrixCameraCopy();//hidesChangeable.Copy()//CameradatapublicMatrix3DViewMatrix{get;set;}//default=identitypublicMatrix3DProjectionMatrix{get;set;}//default=identity}一些注解·ViewMatrix表示MatrixCamera的位置、查看方向和向上向量。由于橫列方式,這可與Model3D分層結(jié)構(gòu)的頂層變換不同。ProjectionMatrix將景物從照相機(jī)空間變換到裝置空間?!inimumZ和MaximumZ屬性已被移除,因?yàn)檫@些值由MatrixCamera的投影矩陣隱含。該投影矩陣坐標(biāo)系統(tǒng)從照相機(jī)空間變換成標(biāo)準(zhǔn)化的立方體,其中X和Y的范圍為[-1,1],z的范圍為。照相機(jī)空間中的最小和最大z坐標(biāo)根據(jù)投影矩陣如何變換z坐標(biāo)來(lái)定義。注意結(jié)果投影被映射成Visual3D上的視口長(zhǎng)方形,且這表示從3-空間到2-空間的變換。XAML標(biāo)記實(shí)例以下是示出對(duì)XAML中整個(gè)Model3D分層結(jié)構(gòu)的指定的更完全標(biāo)記。注意某些語(yǔ)法可作一般變化。簡(jiǎn)單的x-文件引入和合成該實(shí)例僅創(chuàng)建一模型,帶有兩個(gè)被引入.x文件、其中之一上的旋轉(zhuǎn)變換(z-軸上45°)以及坐落于0,1,0的單個(gè)白色點(diǎn)光線。<Model3DGroup><!--Modelchildrengoaschildrenhere--/><PointLightposition=″0,1,0″diffuseColor=″white″/><ImportedPrimitive3Dxfile=″myFile.x″/><Model3DGrouptransform=″rotate(0,0,1,45),scale(2)″><ImportedPrimitive3Dxfile=″mySecondeFile.x″/></Model3DGroup></Model3DGroup>現(xiàn)在,該標(biāo)記將是文件、流、資源等等??蛻魴C(jī)程序?qū)⒄{(diào)用對(duì)該XAML的調(diào)用,且這將由合適的應(yīng)用程序構(gòu)建要被使用的完整Model3Dgroup。顯式網(wǎng)格聲明該示例通過(guò)使用復(fù)雜屬性XAML語(yǔ)法來(lái)提供經(jīng)顯式聲明的MeshPrimitive3D。該網(wǎng)格將用從黃到紅的線性梯度來(lái)紋飾。這也是景物中的光線。<Model3DGroup><!--Modelchildrengoaschildrenhere--/><PointLightposition=″0,1,0″diffuseColor=″white″/><MeshPrimitive3Dmaterial=″LinearGradientyellowred″><MeshPrimitive3D.Mesh><Mesh3DmeshPrimitiveType-″TriangleStrip″positions=″1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18″normals=″...sensiblenormalvectors...″textureCoordinates=″.5,.5,1,1,0,0,.25,.25,.3,.4,.7,.8″triangleIndices=″1,3,4,1,2,3,4,5,6,1,2,4,2″/></MeshPrimitive3D.Mesh></MeshPrimitive3D></Model3DGroup>.x文件上的動(dòng)畫(huà)該示例取第一.x文件并添加到XAML指定的動(dòng)畫(huà)中。該特定文件添加一統(tǒng)一的標(biāo)度,在5秒內(nèi)將.x文件從1x放大到2.5x,反轉(zhuǎn),然后無(wú)限重復(fù)。它還使用加速/減速來(lái)慢慢放大/慢慢縮小其標(biāo)度。<Model3DGroup><!--Modelchildrengoaschildrenhere--/><PointLightposition=″0,1,0″diffuseColor=″white″/><ImportedPrimitive3Dxfile=″myFile.x″><ImportedPrimitive3D.Transform><ScaleTransform3D><ScaleTransform3D.ScaleVector><VectorAnimationfrom=″1,1,1″to=″2.5,2.5,2.5″begin=″immediately″duration=″5″autoReverse=″true″repeatDuration=″indefinite″acceleration=″0.1″deceleration=″0.1″/></ScaleTransform3D.Scalevector><ScaleTransform3D></ImportedPrimitive3D.Transform></ImportedPrimitive3D></Model3DGroup>VisualMaterial指定該示例引入.x文件并將活動(dòng)UI應(yīng)用為其材質(zhì)。<Model3DGroup><!--Modelchildrengoaschildrenhere--/><PointLightposition=″0,1,0″diffusecolor=″white″/><ImportedPrimitive3Dxfile=″myFile.x″><ImportedPrimitive3D.overridingMaterial></VisualMaterial><ButtonText=″PressMe″OnClick=″button_onclick″/></VisualMaterial></ImportedPrimitive3D.overridingMaterial></ImportedPrimitive3D></Model3DGroup>Viewport3D的APIViewport3D的API規(guī)范如下publicclassViewport3D:UIElement//ControlFrameworkElement{//Stock2DpropertiespublicBoxUnitTop{get;set;}publicBoxUnitLeft{get;set;}publicBoxUnitWidth{get;set;}publicBoxUnitHeight{get;set;}publicTransformTransform{get;set;}publicGeometryClip{get;set;}//3Dscene-levelpropertiespublicFogFog{get;set}publicCameraCamera{get;set;}//havegooddefault//The3DModelitselfpublicModel3DModel{get;set;}}這完成了本發(fā)明實(shí)施例中的Model3DAPI定義。盡管已用計(jì)算機(jī)結(jié)構(gòu)特征、方法論動(dòng)作的專(zhuān)用語(yǔ)言以及通過(guò)計(jì)算機(jī)可讀介質(zhì)描述了本發(fā)明,可以理解所附權(quán)利要求中定義的本發(fā)明無(wú)需受限于所述特定結(jié)構(gòu)、動(dòng)作或介質(zhì)。因此,特定結(jié)構(gòu)特征、動(dòng)作和介質(zhì)被揭示為實(shí)現(xiàn)本發(fā)明的示例性實(shí)施例。上述各種實(shí)施例僅作為示例提供,且不應(yīng)被解釋為限制本發(fā)明。本領(lǐng)域技術(shù)人員容易理解可對(duì)本發(fā)明作各種變換和改變,而無(wú)需遵從在此所述的示例實(shí)施例和應(yīng)用程序,且不背離在以下權(quán)利要求中陳述的本發(fā)明的真正精神和范圍。權(quán)利要求1.一種應(yīng)用于樹(shù)分層結(jié)構(gòu)中計(jì)算機(jī)程序?qū)ο蟮挠?jì)算機(jī)數(shù)據(jù)結(jié)構(gòu),所述樹(shù)分層結(jié)構(gòu)用于呈現(xiàn)三維(3D)模型,其特征在于,所述數(shù)據(jù)結(jié)構(gòu)包括用于呈現(xiàn)3D景物的一對(duì)象樹(shù)分層結(jié)構(gòu);所述樹(shù)分層結(jié)構(gòu)中收集所述3D景物的對(duì)象的一個(gè)根對(duì)象;所述樹(shù)分層結(jié)構(gòu)中收集其它組對(duì)象或葉對(duì)象,并具有在所述組對(duì)象的被收集對(duì)象上操作的變換的一個(gè)或多個(gè)組對(duì)象;所述樹(shù)分層結(jié)構(gòu)中的葉對(duì)象,所述葉對(duì)象包括在所述樹(shù)分層結(jié)構(gòu)中定義用以呈現(xiàn)3D景物中3D模型的照度的光線對(duì)象,以及定義繪制3D景物中3D模型的操作的一個(gè)或多個(gè)繪制3D對(duì)象。2.如權(quán)利要求1所述的數(shù)據(jù)結(jié)構(gòu),其特征在于,還包括在將所述3D景物作為2D圖像觀看的3D空間中定義照相機(jī)視點(diǎn)位置的照相機(jī)數(shù)據(jù)。3.如權(quán)利要求2所述的數(shù)據(jù)結(jié)構(gòu),其特征在于,還包括定義觀看所述3D景物的2D圖像的2D視窗邊界的視口數(shù)據(jù)。4.如權(quán)利要求1所述的數(shù)據(jù)結(jié)構(gòu),其特征在于,還包括在所述樹(shù)分層結(jié)構(gòu)中變換所述繪制對(duì)象的繪制操作以在所述3D景物中翻譯3D模型的組對(duì)象。5.如權(quán)利要求1所述的數(shù)據(jù)結(jié)構(gòu),其特征在于,繪制對(duì)象還包括執(zhí)行所述繪制操作以在所述3D景物中創(chuàng)建2D圖像的一個(gè)或多個(gè)視件模型對(duì)象。6.一種用于處理計(jì)算機(jī)程序?qū)ο蠓謱咏Y(jié)構(gòu)的方法,所述計(jì)算機(jī)程序?qū)ο笥糜诶L制由合成系統(tǒng)呈現(xiàn)的三維(3D)模型的二維(2D)視圖,其特征在于,所述方法包括遍歷對(duì)象的3D景物樹(shù)分層結(jié)構(gòu)的分支以處理所述樹(shù)的組對(duì)象和葉對(duì)象;檢測(cè)所述下一未處理對(duì)象是組對(duì)象還是葉對(duì)象;如果檢測(cè)到葉對(duì)象,檢測(cè)所述葉對(duì)象是光線對(duì)象還是繪制3D對(duì)象;如果所述葉對(duì)象是光線對(duì)象,設(shè)置繪制3D對(duì)象要使用的照度;以及如果檢測(cè)到所述繪制3D對(duì)象,繪制由所述光線對(duì)象提供的所述照度所照亮的3D模型。7.如權(quán)利要求6所述的方法,其特征在于,還包括設(shè)置照相機(jī)視點(diǎn);以及基于所述照相機(jī)視點(diǎn)繪制所述3D模型的動(dòng)作。8.如權(quán)利要求6所述的方法,其特征在于,還包括將所述3D景物中的葉對(duì)象收集到一個(gè)葉對(duì)象組合中;以及在葉對(duì)象的所述組執(zhí)行一個(gè)組操作。9.如權(quán)利要求8所述的方法,其特征在于,所述組操作是用于由所述組中的繪制對(duì)象變換所述繪制操作的一個(gè)或多個(gè)變換操作。10.如權(quán)利要求6所述的方法,其特征在于,所述繪制對(duì)象包括繪制所述3D景物中3D模型的一圖元3D繪制對(duì)象。11.如權(quán)利要求6所述的方法,其特征在于,所述繪制對(duì)象包括在所述3D景物中繪制2D圖像的一Model3D繪制對(duì)象。12.在一計(jì)算系統(tǒng)中,用于創(chuàng)建由Model3D對(duì)象定義的3D模型的三維(3D)景物的應(yīng)用程序接口,其特征在于,所述接口包括一個(gè)或多個(gè)繪制對(duì)象,定義繪制所述3D景物的3D模型的指令;以及一光線對(duì)象,定義所述3D景物中3D模型的所述照度。13.如權(quán)利要求12所述的應(yīng)用程序接口,其特征在于,還包括一組對(duì)象,將一個(gè)或多個(gè)繪制對(duì)象收集到組中用于繪制一模型,所述模型是由該組中所述繪制對(duì)象繪制的所述模型的組合。14.如權(quán)利要求13所述的應(yīng)用程序接口,其特征在于,所述組對(duì)象包含在組中對(duì)所述繪制對(duì)象上作用的一個(gè)或多個(gè)組操作。15.如權(quán)利要求14所述的應(yīng)用程序接口,其特征在于,所述組操作包括一變換,在所述組中的一個(gè)或多個(gè)繪制對(duì)象的所述繪制操作進(jìn)行操作。全文摘要一應(yīng)用程序接口可被用以構(gòu)建由Model3D對(duì)象定義的3D模型的三維(3D)景物。該接口具有一個(gè)或多個(gè)組對(duì)象以及一個(gè)或多個(gè)葉對(duì)象。這些組對(duì)象包含或收集其它組對(duì)象和/或葉對(duì)象。葉對(duì)象可以是繪制對(duì)象或照度對(duì)象。組對(duì)象可具有變換操作以變換收集于其組中的對(duì)象。繪制對(duì)象定義繪制3D景物的3D模型或在3D模型上繪制2D圖像的指令。照度對(duì)象定義照亮3D景物中3D模型的光線的類(lèi)型和方向。方法處理用應(yīng)用程序接口的對(duì)象構(gòu)建的計(jì)算機(jī)程序?qū)ο蟮臉?shù)分層結(jié)構(gòu)。該方法遍歷對(duì)象的3D景物樹(shù)分層結(jié)構(gòu)的分支,以處理組對(duì)象和葉對(duì)象。該方法檢測(cè)下一未處理對(duì)象是組對(duì)象還是葉對(duì)象。如果是葉對(duì)象,方法檢測(cè)該葉對(duì)象是光線對(duì)象或繪制3D對(duì)象。如果葉對(duì)象是光線對(duì)象,設(shè)置3D景物的照度。如果檢測(cè)到繪制3D對(duì)象,則繪制按照度照亮的3D模型。該方法還對(duì)由組對(duì)象收集的對(duì)象組執(zhí)行組操作。文檔編號(hào)G06T15/00GK1809843SQ200480001353公開(kāi)日2006年7月26日申請(qǐng)日期2004年7月29日優(yōu)先權(quán)日2004年5月3日發(fā)明者G·D·謝齊特,G·D·斯韋特伯格,J·S·蓓達(dá),A·M·史密斯申請(qǐng)人:微軟公司