日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

一步一步的使用C++和OPENGL实现COLLADA骨骼动画 第一部分

發(fā)布時間:2024/1/1 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一步一步的使用C++和OPENGL实现COLLADA骨骼动画 第一部分 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一步一步的使用C++和OPENGL實現(xiàn)COLLADA骨骼動畫

第一部分

?

英文原作者:waZim

原文標(biāo)題:Step by Step Skeletal Animation in C++ and OpenGL, Using COLLADA

原文地址:http://www.wazim.com/Collada_Tutorial_1.htm

?

Sleepy譯

Sleepysoft#163.com

?

?

譯注:

這是一篇詳細介紹COLLADA文件(也就是DAE文件,3D模型文件的一種)格式的文章。之所以翻譯這篇文章的原因,一是這篇文章的確寫得很好很詳細,另一方面關(guān)于DAE文件格式的中文資料非常的少,每次看E文的也累,所以正好翻譯出來一了百了。

我是從看dancingwind(周煒)與AKER翻譯的NEHE Opengl教程開始學(xué)習(xí)Opengl的,對這些將外國的優(yōu)秀文章和教程漢化的人,我向他們致以由衷的感謝,同時也以此譯文向他們致敬。

另外,本人E文水平有限,有些詞翻譯得不是很準(zhǔn)(但我相信應(yīng)該不會對閱讀的人造成誤導(dǎo)),如果發(fā)現(xiàn)錯誤和不完善的地方(估計會有很多),大家可以通過郵件與我交流,我會在第一時間更正錯誤。

謝謝。?

?????????????????????????????????????????????????????????????????????????????????????????? ?? Sleepy

本次修改:2011-09-08

?

?

?

?

面向?qū)ο?#xff1a;初級到高級

?

介紹:HI,我是waZim,歡迎來到我的第一篇骨骼動畫的教程。這一系列教程由兩部分組成:

1.?????? 了解如何讀取COLLADA文件(概括的介紹COLLADA文件)。

2.?????? 用C++和OPENGL去真正實現(xiàn)第一部分所講的內(nèi)容。

?

這兩篇文章還可以進一步的分成很多小的子章節(jié),在我們講解的過程中會一一進行詳細解釋。

前言背景什么的就不譯了,請參看原文
第一部份:

?

閱讀與理解COLLADA文件

?????? 正如在前面的介紹部分里所說,這篇教程分為兩個部份。第一部分的一般性的講解并不考慮和涉及任何編程語言。但是如果你想直接跳到第二部分去看程序?qū)崿F(xiàn)的話,你非常可能會感到完全無法理解從而無法繼續(xù)下去。所以強烈建議對于COLLADA文件一無所知的初學(xué)者來說,還是耐心看完第一部分的介紹再去看第二部分的實現(xiàn)。

?????? 廢話不多說,讓我們開始吧。

?

COLLADA文件

?????? 在我們準(zhǔn)備開始深入挖掘COLLADA文件的意義之前,我希望你們先下載一個實例文件,這個文件我們將做為此教程從頭到尾討論的對象(所以大家還是下載回來對照參看吧)。大家可以在COLLADA模型中心中找到它。它的名字叫“astroBoy_walk.dae”,如果你到處都找不到這個文件,那么好吧,你可以到這篇教程所在網(wǎng)頁的“下載”部分找到它。(我怎么找不到)

?????? 就像我們之前所說的,COLLADA文件以XML的形式存儲。現(xiàn)在大家可以打開前面所說的示例文件看看,你可以用你最喜歡的文本編輯器打開這個文件(IE就不錯)。你會看到一個根結(jié)點名為“COLLADA”,如果你所用的文本編輯器支持展開與折疊XML結(jié)點的話(IE就可以),你可以通過點擊+-號把各個結(jié)點展開收起來成這個樣子:

圖1:COLLADA文件的概覽

?

在.dae文件或.xml文件的根結(jié)點<COLLADA>下你會找到很多l(xiāng)ibrary這樣的東西,它們就是用來存儲模型中各種不同各類的信息的。比如<library_geometries>就是用來存儲幾何數(shù)據(jù)的(就是三角形啊,還有所謂的mesh啊 – 另外mesh這個詞好像大家叫成英文的比較多,下面遇到這個詞就不譯成中文了);<library_lights>則是用來存儲光照和場景數(shù)據(jù)的。大家看看圖1,并不是什么制造火箭般的高科技是不是,通過這些叫l(wèi)ibrary_xx的東西我們能找到模型實際的各種數(shù)據(jù)。而像如幾何數(shù)據(jù)的存儲區(qū)會有<geometry>名字的結(jié)點,而光照數(shù)據(jù)的存儲區(qū)會有叫<light>的結(jié)點,這表明這些數(shù)據(jù)存儲區(qū)里存儲的模型或光照數(shù)據(jù)常常不止一組。現(xiàn)在,讓我們來一個一個地分析每個數(shù)據(jù)區(qū),按照每個數(shù)據(jù)區(qū)的重要性不同,我會將它們合理的排列在這篇教程的不同位置。

首先,為了讓問題變得簡單,正如我說的這是篇入門教程,所以我們不會討論COLLADA文件的每一個方面,為了在教程中除去其中的復(fù)雜的部分,我們來設(shè)定幾個前提條件。

?

前提條件:

1.????????????? 雖然無論COLLADA文件從Max中導(dǎo)出還是從Maya中導(dǎo)出照理說應(yīng)該是一樣的,但實際上在某些情況下總會有那么一點不同。我們只討論從Max中導(dǎo)出的COLLADA文件,當(dāng)然這并不是說用Maya的人就杯具了。因為我仍可以肯定的是,如果COLLADA從Maya中導(dǎo)出時,在彈出的COLLADA導(dǎo)出選項對話框中將“triangulate”這個選項鉤上,并且以“背向矩陣”(backed matrices,我沒用過Maya,也不知道是什么)方式導(dǎo)出的話,則與Max導(dǎo)出的是一樣的。但是因為我有用過Maya,所以不知道我的導(dǎo)出器載入Maya導(dǎo)出的文件時會失敗在什么地方。

2.????????????? COLLADA文件中必須僅僅只有一個mesh,這意味著任何在max文件中有用的數(shù)據(jù)都已經(jīng)記錄下來了(原文:which means, anything in the asset's Max file, should be attached.不知道該怎么譯,不過好像對文章的內(nèi)容并沒影響)。所以我們在COLLADA文件中的<library_geometries>結(jié)點里不會看到多于1個的<mesh>結(jié)點。但如果我們能讀取1個<mesh>,那我們同樣的也能讀取成千上萬個<mesh>不是嗎。

3.????????????? COLLADA里的幾何圖形是以三角形的方式記錄的,因為這即使不是最好的,也是比較好的記錄方式,我們可以直接提供三角形數(shù)據(jù)給OPENGL,所以我們讓Max幫我們將圖形導(dǎo)出為三角形記錄的方式。

4.????????????? 在稍后的實現(xiàn)部分,我們還假定我們所分析的COLLADA中只包含一個貼圖文件。

5.????????????? COLLADA中的動畫至少含有一個骨骼—--至少一個根骨骼(這是很典型的)。嗯,我想,我們能實現(xiàn)骨骼動畫,我們簡直是英雄般的人物。(原文:And I think that’s why we are here, to implement skeletal animation.)

6.????????????? 導(dǎo)出到COLLADA中的硬動畫必須以矩陣的形式保存,從本質(zhì)上來說,在某些情況下這個形成一個動畫的通道而其它情況下則會生成16個動畫通道(什么是通道,我們稍后解釋)。(原文:Animation exported to COLLADA must be baked in matrices, which essentially in some cases makes 1 channel of animation and in others 16 channels of animation (Now what is channel? It should be explained later).)

7.????????????? 動畫只在通道向?qū)ο髮嶓w施加變化影響時才有效,請把它們相像得盡量簡單和清晰。如果你固化了矩陣,那么前面所說的事就理所當(dāng)然的被完成了,所以不用擔(dān)心這些。(原文:Animations can only be valid if the channel targets the "Transform" of the targeted entity, just to keep things clear and easy. When you will bake matrices, then you will have this automatically, so don't need to worry about that.)

8.????????????? 動畫不能包含嵌套的動畫。

9.????????????? 只支持骨骼動畫(沒有硬動畫)(譯注:那你前面說一大堆硬動畫的事干毛啊。)

10.????????? 層次中的每個骨頭都必須對某些皮膚產(chǎn)生影響,換句話說,它們都必須關(guān)聯(lián)到皮膚上。

?

請大家在腦中從頭到尾一直保持上面所列的這些假設(shè),讓我們開始一個一個部分為你講解。你會覺得一切都很容易,如果你立即跳到實現(xiàn)部分去看你也會發(fā)現(xiàn)這些原來并不難。下面的每一節(jié)中都會給出相應(yīng)實現(xiàn)代碼的鏈接。

?

?

從COLLADA文件中讀取幾何數(shù)據(jù)

<library_geometries>

這是COLLADA文件中最重要的一個library了,如果你需要一個繪制一個角色動畫,在這里你能找到它的幾何數(shù)據(jù)。

這個library中包含許多<geometry>類型的結(jié)點,它們分別存儲了場景中的各種幾何數(shù)據(jù),別忘了COLLADA只有一個文件(也就是沒有其它的附屬數(shù)據(jù)文件,貼圖的圖片除外),所以只能把所有的大量的數(shù)據(jù)全放在一個文件里面。但正如我們假設(shè)的,我們只考慮這個文件中只有一個<geometry> node結(jié)點,這個結(jié)點下也只有一個<mesh>結(jié)點的情況。好了,我們找到它了,現(xiàn)在讓我們開始分析它。

?

<mesh>

?????? 我們會在這個被稱為“網(wǎng)格”的結(jié)點中找到我們想要的幾何數(shù)據(jù)。如果你試著分析這一結(jié)點,你會看到至少1到2個<source>結(jié)點,它的意義決定于它的類型,它可以存儲頂點、法線、紋理坐標(biāo)等信息。在示例文件中(如果你是從COLLADA.org這個網(wǎng)站下載的話,這個文件里面不會包含反向動畫,所以你必須將它重新導(dǎo)入Max并且并且以“背向矩陣”重新導(dǎo)出,導(dǎo)出時還要將導(dǎo)出對話框中的“triangulate”這個選項鉤上,如圖2所示),你會找到3個<source>結(jié)點,你會發(fā)現(xiàn)非常幸運的是在COLLADA中每個source結(jié)點都是以同樣的形式來定義的。

圖2:Max導(dǎo)出COLLADA時的設(shè)置

?

<souce>

?????? 請記住,我們所討論的所有的XML結(jié)點都有一個相應(yīng)的ID號,這個ID用來定位這個結(jié)點在COLLADA文件中的位置,當(dāng)其它地方需要引用這個結(jié)點時,就需要使用這個ID。Source這個結(jié)點也并不例外。現(xiàn)在<source>這個結(jié)點擁有許多的子結(jié)點,但最重要的幾個就是<float_array>或<NAME_array>還有 <technique_common>。

?????? 正如它們的名字所描述的,<float_array>包含了許多的浮點數(shù)數(shù)據(jù),它們可以用于各種不同用途,在同一個source結(jié)點下的<technique_common>指出了它們的具體用途。而<float_array>與<NAME_array>的不同之處僅僅在于前者存儲的是一系列浮點數(shù)而后者存儲的是一系列字符串。

?????? 現(xiàn)在我們來看看<technique_common>下的<accessor>子結(jié)點是怎么指明各種array如<float_array>, <NAME_array>或其它各種名字的array結(jié)點它們的用途的。<accessor>結(jié)點有一個叫做“source”的屬性,它說明的是“這個array到底是什么意思,它到底是用來干什么的”;另一個叫做“count”的屬性說明了這個array有幾組數(shù)據(jù);還有一個叫"stride"的屬性則是說明間隔多少數(shù)據(jù)開始下一個數(shù)據(jù)(說的復(fù)雜了,也就是一組有多少個數(shù)據(jù),比如是2個數(shù)字一組還是3個數(shù)字一組,你懂的)。

好了我希望我不是在講天書,我們來直接看圖表吧,這個圖表解釋了COLLADA的source指示的意義。(在此吐糟一下,原文:hope I am not talking Chinese but let's explain it with a figure and example COLLADA source. 嗯,沒錯,現(xiàn)在你們現(xiàn)在看到的就是Chinese)

?

<source id="vertices_source" name="Vertices">

<float_array id="values" count="6"> 0.3 0.5 0.7 0.2 0.4 0.6 </float_array>

<technique_common>

<accessor source="#values" count="2" stride="3">

<param name="X" type="float"/>

<param name="Y" type="float"/>

<param name="Z" type="float"/>

</accessor>

</technique_common>

</source>

?

圖3:source的結(jié)構(gòu)

?

正??? 如你們在圖3中所看到的,這是浮點型的數(shù)組(注:數(shù)據(jù)組,不是C語言的數(shù)組哈),其中數(shù)量是6個 (count="6")(注:仔細看float_array),其中每三個一組(stride="3")共有2組(count="2")(注:仔細看accessor),分別表示XYZ,它們的類型都是浮點型(注:仔細看param)。現(xiàn)在我們看到在<accessor>下有3個<param>子結(jié)點,所以我們每個頂點數(shù)據(jù)是3個一組(x, y, z)(同樣的法線和紋理坐標(biāo)也可能是3個一組)。理解這些信息非常的重要,因為在我沒有COLLADA的文件說明的時候,只是理解這些就花費了我大量的時間(也許我比較笨吧),所以如果你仍沒理解的話,請再仔細讀一遍。

?????? 簡單來說,這個source說明了以下的意思:“我有2組頂點數(shù)據(jù),其中每3個一組,它們都存在<floats_array>里,總共有6個數(shù)字。每一組頂點數(shù)據(jù)由名為 “X”,”Y”,”Z”的成份組成,它們都是浮點形的數(shù)字”。如果我們讀到一個<source>結(jié)點,里面存放的是紋理貼圖坐標(biāo)的話,那么每一組數(shù)據(jù)則是由名為“S”,”T”,”P”的成份組成。(注:作為天朝人,理解這些應(yīng)該無壓力吧)

?????? 好了,這就是source里面的所有東西了。這個示例文件共有3個<source>結(jié)點,在我們分析另外2個之前,或許我們已經(jīng)猜到了,它們應(yīng)該存的是法線坐標(biāo)和紋理映射坐標(biāo)。如果你導(dǎo)出模型時還有其它的屬性,那么你會得到一個有更多<source>結(jié)點的文件,比如雙切線(bitangents)和切線(注:tangents,原文是tangets,我猜是筆誤)等等。

?????? 現(xiàn)在我們可以對<source>進行解碼了,但是我們還是不知道哪些source是頂點哪些source是法線等等。我們還要讀取<mesh>下的<vertices>結(jié)點來找到存儲頂點數(shù)據(jù)的source,盡管我實在是想不通他們這么做的原因,但為了完整起見,你必須讀這個結(jié)點(注:指<vertices>結(jié)點),它至少有一個子結(jié)點名為<input>,并且其屬性”semantic”的值是“POSITIONS”,它以另一個名字/ID引用了了頂點的source(注:類似于定義別名,下面有詳細解釋)。然后當(dāng)你需要頂點的source時,你就會引用到這個新的ID。如果你不明白這一節(jié)的內(nèi)容,那么請直接跳到下一節(jié),然后你很有可能就明白了。

?

<triangles>

?????? 現(xiàn)在正如我們所假設(shè)的一樣,我們只考慮由三角形幾何元素組成的COLLADA文件,所以你在<mesh>下只會看到<triangles>類型的子結(jié)點,否則你可能還會看到比如<polylist>這樣的結(jié)點,這我們盡量不去考慮它。

?????? 這個<triangles>結(jié)點能夠告訴我們所需要的所有構(gòu)造模型的三角形數(shù)據(jù),這些數(shù)據(jù)在我們之前讀出的3個source里面(只針對這個文件來說)。在<triangles>里,"count"屬性告訴我們在這個結(jié)點下到底有多少個三角形,而"material"屬性則告訴我們?nèi)绾螐?lt;library_material>下找到相應(yīng)的材質(zhì)數(shù)據(jù),我們使用這相應(yīng)的材質(zhì)數(shù)據(jù)來渲染對應(yīng)的三角形。所以你會看到很多的<triangles>節(jié)點,它們是根據(jù)材質(zhì)來劃分的(注:也就是說每一類材質(zhì)的表面與它對應(yīng)的材質(zhì)信息一起記錄為一個<triangles>節(jié)點)。所以我們必須讀取所有的<triangles>節(jié)點。

?????? 要解碼<triangles>節(jié)點我們必須讀取它們的子結(jié)點,其中的<input>和<p>結(jié)點是最重要的。<input>結(jié)點的數(shù)量表明每個頂點所具有的屬性的個數(shù)。而<p>結(jié)點則是頂點相應(yīng)屬性在相應(yīng)的<source>結(jié)點中的索引(注,不是值,是索引,真正的值請根據(jù)索引到相應(yīng)的source里面查)。讓我們來看看這個例子。

?

<mesh>

<source id="position"/>

<source id="normal"/>

<source id="textureCoords"/>

?

<vertices id="verts">

<input semantic="POSITION" source="#position"/>

</vertices>

<triangles count="2" material="Bricks">

<input semantic="VERTEX" source="#verts" offset="0"/>

<input semantic="NORMAL" source="#normal" offset="1"/>

<input semantic="TEXCOORD" source="#textureCoords" offset="2" set="1" />

<p>

0 0 1 3 2 1

0 0 2 1 3 2

</p>

</triangles>

</mesh>

?

?圖4:Triangle的結(jié)構(gòu)

?

?????? 正如你從上面的例子中看到的,<vertices>結(jié)點將名為"position"的<source>結(jié)點重命名為"verts",然后以"verts”的名字來定義頂點的source(原文:As you can see from the above example <vertices> node is renaming the "position" source with "verts" and then defining the triangles vertices source with "verts" name.)。這就是我們需要讀取<vertices>結(jié)點的原因,只有這樣,我們才能從一堆<source>中找到我們需要的<source>的實際位置。

?????? 如果你讀取<triangles>的子結(jié)點,你會讀到3個<input>結(jié)點,它們的”semantic”屬性的值分別是"VERTEX" "NORMAL" 和 "TEXCOORD"。這實際上是說,我們?nèi)切螖?shù)據(jù)每個頂點有一個值,第一個是頂點的位置(注:坐標(biāo)),第二個是頂點的法線,第三個是頂點的紋理映射坐標(biāo)。我們怎么知道在<p>里面哪個是哪個呢,我們來看看:

?

<input> 結(jié)點有semantic屬性= "VERTEX" 它的偏移是 offset = "0",

<input> 結(jié)點有 semantic屬性 = "NORMAL" 它的偏移是offset = "1",

<input> 結(jié)點有 semantic屬性 = "TEXCOORD" 它的偏移是offset = "2".

?

所以我們從<p>中為每個三角形每個頂點讀值的時候:

?

第一個值是"VERTEX"也就是三角形頂點位置在名為"positions"的<source>結(jié)點中的索引,

第二個值是"NORMAL"也就是三角形頂點法線的值在名為"normal"的<source>結(jié)點中的索引,

第三個值是"TEXCOORD"也就是紋理映射坐標(biāo)的值在名為"textureCoords"的<source>結(jié)點中的索引。

?

?????? 好,現(xiàn)在有一件事我必須講清楚,所有從<p>這個結(jié)點下讀出來的值都是“索引”而不是實際的數(shù)據(jù)值,所有三角形的所有數(shù)據(jù)的值都以索引的形式保存是為了在有重復(fù)屬性的情況下節(jié)省存儲空間。為了找到真實的數(shù)據(jù)值我們必須引用相關(guān)的<source>結(jié)點,將它們的數(shù)據(jù)按索引指示的一個一個對應(yīng)取出來使用。

?????? 構(gòu)造三角形現(xiàn)在變得非常容易了。你要做的事情就是從<p>這個結(jié)點下一次讀取3 * (<triangles>結(jié)點下<input>結(jié)點的數(shù)量)個值,然后以這些值為索引從相應(yīng)的<source>結(jié)點中讀出真正的數(shù)據(jù)。如果對于每個頂點只有一個屬性的三角形來說,我們會看到像下面這樣的<triangles>結(jié)點,它只有一個<input>子節(jié)點。這種情況下你就必須一次從<p>中讀取三個數(shù)字作為索引,然后在相應(yīng)的名為"verts"的<source>中根據(jù)索引讀取其真正的值。

?

<triangles count="2" material="Bricks">

<input semantic="VERTEX" source="#verts" offset="0"/>

<p>

0 3 2

0 2 1

</p>

</triangles>

?

還有一件我們需要知道的事情就是<triangles>結(jié)點的"material"屬性,這個屬性引用了<library_materials>里面的材質(zhì)數(shù)據(jù),這一個library我們將在稍后的教程中討論。

?

這就是所有的幾何數(shù)據(jù)了。如果你能正確理解這一部分,那么接下來的部分對你來說也沒有任何問題了;如果你還沒理解這一部分,那么請從頭再看幾遍直到你完全明白了為止。現(xiàn)在如果你立即想跳到本教程的實現(xiàn)部分(第二部分),你應(yīng)該能讀取并在你的引擎中顯示靜態(tài)的3D物體了。如果你還想用材質(zhì)和貼圖來渲染你的模型甚至還想讓它能夠動起來,你還需要繼續(xù)閱讀完這篇教程第一部分的剩下的內(nèi)容。

?

從COLLADA文件中讀取貼圖文件名

正如大家所知道了,我們在開始做了一些假設(shè),其中之一就是一個COLLADA只對應(yīng)著一張紋理貼圖,這讓尋找貼圖的文件名變成非常容易。

我們所需要做的一切就是讀取<library_images>下“唯一”的<image>結(jié)點中的"id"屬性。一般來說它會是COLLADA中使用的紋理貼圖的文件名。不過它可能并不是正確的文件名,因為COLLADA可能會創(chuàng)建一個與它文件名不同的ID。所以為了能夠正確的讀取文件名,我們必須讀取<image>結(jié)點下的<init_from>子結(jié)點,它給出了完整的路徑,其中也包括文件名。對于我們的目的而言,我們只關(guān)心它的文件名,而不是完整的絕對路徑,所以我們讀取完整路徑后僅保存文件名而已。

?

從COLLADA文件中讀取材質(zhì)數(shù)據(jù)

我們在“從COLLADA文件中讀取幾何數(shù)據(jù)”中說過,三角形數(shù)據(jù)以它們的材質(zhì)不同來分組,而材質(zhì)則是在<triangles>結(jié)點下的"material"屬性中以ID的形式引用。為了找到ID所對應(yīng)的真正材質(zhì)數(shù)據(jù)我們必須得讀取<library_materials>。在<library_materials>下,你會找到很多名為<material>的結(jié)點,它們的id屬性就是<triangles>結(jié)點中所引用的值。但不幸的是這些<material>結(jié)點下只有一個名為<instance_effect>的子結(jié)點,這個子結(jié)點下只有一個叫作"url"的屬性。這是因為<material>也只是引用了一個<library_effects>下的一個“效果”(effect),材質(zhì)的完整定義其實是在<library_effects>下面。

所以我們保存下<material>的”url”屬性,然后去<library_effects>尋找,但杯具的地方又出現(xiàn)了,<library_effects>可以說是COLLADA中迄今為止我所知道的最復(fù)雜的一個library。特別是當(dāng)陰影效果和一些根本在COLLADA文檔中找不到說明的內(nèi)容被添加進去后,這個<library_effects>會變得異常的復(fù)雜和難解。但是我答應(yīng)過我會讓我們所講的東西簡單明了,所以我們不會隨便讀取這里面的數(shù)據(jù),除非是它對于定義材質(zhì)來說非常重要。

如果我們找到任意材質(zhì)的<material>里”url”所對應(yīng)的<effect>結(jié)點,我們需要尋找一個名為<phong>或<blin>的結(jié)點,這個結(jié)點在<profile_COMMON>結(jié)點中,<profile_COMMON>又是<effects>的子結(jié)點。<phong>或<blin>結(jié)點一般位于<profile_COMMON>的子結(jié)點<technique>的里面。一旦我們找到了<phong>或<blin>,我們繼續(xù)看它們下面的關(guān)于材質(zhì)的各種參數(shù),比如"ambient" "diffuse" "specular" "emission" "shininess" 和 "transparency"等等(注:這些都是<phong>或<blin>的子結(jié)點)。如果你希望你的模型看起來感覺非常的好,一般來說, "diffuse" "shininess" 和 "transparency"這三組參數(shù)足夠你創(chuàng)造出一個有良好觀感的材質(zhì)了。

我們怎樣才能用簡單的方法從這些結(jié)點中讀取數(shù)據(jù)呢?一般來說,ambient(環(huán)境光), emission(輻射光), diffuse(漫反射光) 和 specular(鏡面光) 結(jié)點包含4個浮點數(shù),這4個浮點數(shù)在它們的<color>子結(jié)點里,這4個浮點數(shù)分別表示材質(zhì)相應(yīng)顏色屬性的RGBA組分;而reflectivity(反射)和 transparency(透明度)等只包含一個浮點數(shù)。

?

<ambient>

<color>1.0 1.0 1.0 1.0</color>

</ambient>

?

<transparency>

<float>0.5</float>

</transparency>

?

如果我們把一張紋理貼在物體的表面,那么物體的漫反射光將不是簡單的顏色,而是一張貼圖,那么<diffuse>將不會有名為<color>的子結(jié)點。但為了簡單起見,我們不必擔(dān)心這一點,而是認為貼圖是貼在物體的漫反射光上,也就是說我們不用從COLLADA中讀取漫反射光的值。但是我們需要使用一個OPENGL中定義的默認的漫反射光的值

這就是我們要實現(xiàn)任何靜態(tài)模型所需要的一切了。所以如果你只關(guān)心如何從COLLADA中讀取一個靜態(tài)的模型,那么你可以不用讀下面的部分而直接跳到實現(xiàn)部分。如果你的目的不僅僅是這樣,那么請繼續(xù)看我們是怎樣從COLLADA文件中提取動畫數(shù)據(jù)的。

?

讀取COLLADA文件中的骨骼數(shù)據(jù)

我們假定我們讀取的是COLLADA文件中的骨骼動畫而不是硬動畫,所以我們需要讀取COLLADA中的骨骼數(shù)據(jù)。所謂骨骼,我的意思是讀取關(guān)節(jié)(骨頭)數(shù)據(jù)。我們同樣必須讀取關(guān)節(jié)的層次關(guān)系數(shù)據(jù)。這會告訴我們,誰是誰的子關(guān)節(jié)或誰是某個關(guān)節(jié)的父關(guān)節(jié)等等。下面這張圖解釋了關(guān)于骨骼的一些術(shù)語。記住骨頭和關(guān)節(jié)實際上是同一個東西,它們只是為了方便闡述而起的名字,我們從COLLADA文件中讀取的數(shù)據(jù)實際上是關(guān)節(jié)數(shù)據(jù),骨頭只不過是我們假想的連接兩個關(guān)節(jié)的線。

?

圖5:骨骼術(shù)語

?

在下面這張圖里你會看到我們的示例文件中的骨骼,還有附在骨骼上的皮膚。

?

圖6:完整的人物造型在動畫中的一個姿勢

?

圖6左邊部分的紅點就是我們從COLLADA中讀出來的關(guān)節(jié),連接這些點的線是假想的骨頭,它們可以使皮膚運動起來。在圖的右邊你可以看到另一幀皮膚附著在骨骼上的圖像。

你可能還記得我們的一些假設(shè),其中之一就是,所有的關(guān)節(jié)都關(guān)聯(lián)到皮膚上,這樣會使得<library_visual_scenes>變得非常簡單易讀。你所需要做的一切就是在<visual_scenes>找到骨骼根關(guān)節(jié)(骨頭)的<node>結(jié)點,然后讀出整個關(guān)節(jié)樹。這么做的缺點之一是,你將會考慮到有很多的影響皮膚的關(guān)節(jié),而事實上它們不會對皮膚造成任何影響。但如果你不將所有的骨頭都附加到皮膚上的話,你會看到類型為"JOINT" 和"NODE"的<node>結(jié)點在骨骼層次中混合出現(xiàn)。但如果你將所有的骨頭附加到皮膚上你就會擁有只有"JOINT"類型的骨骼樹。這也是很多引擎模型導(dǎo)入的默認處理方法。如果在骨骼層次中類型為"JOINT" 和"NODE"的<node>結(jié)點混合出現(xiàn),你就必須得讀取<library_visual_scenes>下的<instance_controller>結(jié)點,然后每一次讀取<skeleton>的時候你都必須的再讀取一個關(guān)節(jié)數(shù)據(jù)。那些類型不是"JOINT"的<node>結(jié)點實際上仍然是關(guān)節(jié),只不過它們沒有任何效果而已,也就是說它們不會對皮膚造成影響。這就是為什么我們假設(shè)所有骨頭都必須附著在皮膚上,從而使事情容易和簡單。(注:簡單來說,就是將所有類型的接點,無論是在邊界的還是在中間的,都統(tǒng)一考慮,從而使問題處理起來簡單化,如果對其作區(qū)分,則會增加很多諸如邊界等的判定條件)

為了讀取骨骼的層次,你需要一個數(shù)據(jù)結(jié)構(gòu),它可以保存同種類型數(shù)據(jù)結(jié)構(gòu)的大量的子數(shù)據(jù)和它的父數(shù)據(jù)的引用(這在實現(xiàn)部分有很清楚的描述)。你還需要保存<node>結(jié)點的”SID”屬性。一旦我們建立了這樣的數(shù)據(jù)結(jié)構(gòu),我們就要找到根骨骼的結(jié)點并且遞歸讀取它們的子骨骼與子骨骼的子骨骼……等等,然后將它們保存在上面所說的數(shù)據(jù)結(jié)構(gòu)中。當(dāng)你完成了這些工作,你的數(shù)據(jù)結(jié)構(gòu)可以清楚的指示出比如:哪個關(guān)節(jié)是哪個關(guān)節(jié)的子關(guān)節(jié)而哪個關(guān)節(jié)又是哪個關(guān)節(jié)的父關(guān)節(jié)。

?????? 那么我們怎么能找到根骨骼呢?因為我們假定一個COLLADA文件中只有一個模型,所以我們不用去讀<scene>結(jié)點來查找哪個場景是被實例化的。我們可以立即跳到<library_visual_scenes>里面唯一的子結(jié)點<visual_scene>中去看下面的<node>結(jié)點,其<node>結(jié)點下有子結(jié)點有叫作<instance_controller>的就是我們想要的,我們讀取<instance_controller>下的<skeleton>子結(jié)點,它會告訴你根結(jié)點的ID。因為我們將所有的骨骼都關(guān)聯(lián)到了皮膚上,所以在<instance_controller>下只會有一個<skeleton>子結(jié)點,這個結(jié)點中記錄的就是我們要找的根骨骼,連接在它上面的所有東西都是骨骼的一部分。

如果你看了COLLADA文件中的<node>結(jié)點,你會看到所有的<node>結(jié)點的第一個子結(jié)點都是一個叫作<matrix>的結(jié)點。<matrix>包含了16個浮點數(shù),這夠構(gòu)成了關(guān)節(jié)矩陣。這也被稱為局部骨骼轉(zhuǎn)換矩陣(the local bone transformation matrix)。當(dāng)我們將所有關(guān)節(jié)連接起來,我們需要將它父關(guān)節(jié)的世界矩陣與子關(guān)節(jié)的局部矩陣相乘作為子關(guān)節(jié)的世界矩陣。對于根關(guān)節(jié)來說,它沒有父關(guān)節(jié),所以它的關(guān)節(jié)矩陣也就是世界變換矩陣。(注:如果因為我譯得太差大家不理解的話,我簡要說明如下。所謂的骨骼動畫,骨骼控制皮膚,說白了就是所謂骨骼的變換矩陣影響所謂皮膚的那一部分幾何圖形的繪制,也就是繪制代表“皮膚”的網(wǎng)格之前先用它相關(guān)的“骨骼”的變換矩陣來變換一下,從而得到網(wǎng)格繪制的正確位置,這就是所謂骨骼動畫的控制原理。而骨骼是有層次結(jié)構(gòu)的,越是上層的受到別的骨骼影響越少,越是下層的受到別的骨骼的影響就越多,比如你活動一下肘部,雖然你的腕部關(guān)節(jié)沒動,但你的手掌位置也改變了有木有,而這所謂的影響反應(yīng)到3D世界也就是它們的變換矩陣的疊加)

到現(xiàn)在為止,你應(yīng)該能夠讀取骨骼和通過從每個<node>結(jié)點讀出的關(guān)節(jié)矩陣計算出整個設(shè)計好的造型了。在下一節(jié)中,我們將讀取與骨架相關(guān)聯(lián)的蒙皮信息。

?

從COLLADA文件中讀取蒙皮信息

迄今為止我們已經(jīng)完成了讀取了幾何數(shù)據(jù)(頂點信息、材質(zhì)、紋理貼圖文件名)甚至是模型的骨骼數(shù)據(jù)。我們還需要知道的就是骨骼是怎么關(guān)聯(lián)皮膚(幾何數(shù)據(jù))的。我們已經(jīng)讀取了骨骼中的許多關(guān)節(jié)。但我們?nèi)匀徊恢滥膫€關(guān)節(jié)關(guān)聯(lián)哪個頂點。一些關(guān)節(jié)可能根本不關(guān)聯(lián)任何的頂點。但如果你們還記得我曾經(jīng)作過的假設(shè),那就是所有的關(guān)節(jié)必須附加到皮膚上的話,那么我們討論的情況的前提是所有的關(guān)節(jié)都必須關(guān)聯(lián)到皮膚上。

為了正確的關(guān)聯(lián)所有的皮膚(幾何數(shù)據(jù)),我們需要皮膚的數(shù)據(jù),這一節(jié)中我會試著讓你了解我們從COLLADA文件中的什么地方能獲取皮膚數(shù)據(jù)。

再我們進一步的說明之前,有件事情我必須解釋一下。如果我們的人物模型每個頂點只關(guān)聯(lián)到一個關(guān)節(jié)上的話,當(dāng)這個關(guān)節(jié)移動那么這部分皮膚當(dāng)然也相應(yīng)的會移動,只不過這樣的動畫效果看起來非常的僵硬。這并不是我們實際中所采用的方法,幾乎所有的頂點都會關(guān)聯(lián)到不止一個關(guān)節(jié)上。我們通過所謂的“權(quán)值”來表達每個關(guān)聯(lián)的關(guān)節(jié)對相應(yīng)皮膚的影響。每個關(guān)節(jié)對一個頂點有一定百分比的影響,總量是100%。所以權(quán)值在皮膚的信息來說是非常重要的的一個。

?

<library_controllers>

<library_controllers>包含了整個模型中所有的關(guān)節(jié)各自所關(guān)聯(lián)的頂點和關(guān)聯(lián)的頂點的權(quán)值信息。依照我們的假設(shè),我們只有一組網(wǎng)格和一組骨骼(注:也就是只1個<mesh>結(jié)點和一個<skeleton>結(jié)點),所以<library_controllers>下.只有一個<controller>結(jié)點。一旦我們找到了這個僅有的<controller>結(jié)點,我們繼續(xù)找到它的<skin>子結(jié)點。在<skin>結(jié)點中,找到一個<source>結(jié)點,這個<source>結(jié)點它的子結(jié)點<technique_common>下的子結(jié)點<accessor>下的子結(jié)點<param>中名為”name”屬性值是"JOINT"(我不做過多的解釋了,因為我們在前面讀取幾何數(shù)據(jù)的時候已經(jīng)分析過<source>結(jié)點了),這個結(jié)點的<NAME_array>會給你骨骼中所有關(guān)節(jié)的名字。現(xiàn)在你懂的,你可以從這個<source>下的<NAME_array>里的"count"屬性中獲知所有的關(guān)節(jié)數(shù)量。一個<source>的例子如下所示:

?

<source id="boyShape-skin-skin-joints">

<NAME_array id="skin-joints-array" count="5">Bone1 Bone2 Bone3 Bone4 Bone5<NAME_array />

<technique_common>

<acessor source="#skin-joints-array" count="5" stride="1">

??????????????????????? <param name="JOINT" type="Name" />

</acessor>

</technique_common>

</source>

?

如果你回頭看看<library_visual_scene>中<skeleton>下的<node>結(jié)點,你就會看到你從<NAME_array>中讀到的所有關(guān)節(jié)的名字實際上是前面<node>結(jié)點的SID。

要完全讀取皮膚數(shù)據(jù),首先我們得先讀取<bind_shape_matrix>,這往往是<skin>的第一個子結(jié)點,如果不是的話,那么遍歷它的所有子結(jié)點找到它,然后讀取并保存下來。然后我們開始讀名為<vertex_weights>的結(jié)點了,它的"count"屬性給出了權(quán)值的數(shù)量,至今為止我所知道的是,這個值應(yīng)該等于模型頂點的數(shù)量,這個數(shù)量我們之前讀取幾何數(shù)據(jù)時已經(jīng)讀出來了,因為我們必須為每個頂點定義一份權(quán)重數(shù)據(jù)。(注:是一份,不是一個,千萬不要看錯,高潮在后面)

如果你看看<vertex_weights>結(jié)點的結(jié)構(gòu),你會看到至少2個<input>結(jié)點,一個的<semantic>屬性為"JOINT"而另一個的<semantic>屬性為"WEIGHT";除此之外還有一個<vcount>結(jié)點和一個<v>結(jié)點。

當(dāng)我們需要讀取每一個頂點的權(quán)值的時候,我們循環(huán)N次(N = <vertex_weight>的"count"屬性)讀取<vcount>中的每一個值。每一個值都是影響我們當(dāng)前正在讀取的頂點的關(guān)節(jié)數(shù)量。所以我們必須嵌套的以一對為一組(在這里我們假定在<vertex_weight>中只有兩個<input>結(jié)點)讀取M(M = 當(dāng)前<vcount>的值)組<v>中的索引值。

讀出的每組索引值中,

第一個是之前讀出的名為"JOINT"的<source>里<NAME_array>里面的值的索引(在此假設(shè)屬性semantic="JOINT"的<input>它的"offset"屬性值是0)。我們之前提過怎么樣尋找對應(yīng)的source了,不過這個的<input>里面的"source"屬性也給出了對應(yīng)的source的ID了(所以無論怎么說都能找到吧)。

第二個是”semantic”="WEIGHT"的那只<input>中"source"屬性指出的<source>結(jié)點里的索引了(好繞口)(假設(shè)這只<input>的"offset"屬性值是1)。

?

(注:如果我翻譯得你實在看不懂的話,我用純正的中文來解釋一下:我們把<vcount>里面的值一個一個依次取出來,假設(shè)當(dāng)前取出的值是M,而<input>的數(shù)量是C(上面假設(shè)的是只有2個),然后我們得從<v>中一次讀取M*C個值,其中,以C個值為一組,共有M組數(shù)據(jù)。為什么有M組數(shù)據(jù)呢,因為對這個頂點來說,有M個關(guān)節(jié)能影響它;為什么是以C個值為一組呢,多的我不知道,但就你所看到的當(dāng)前例子而言,C=2,第一個是影響它的關(guān)節(jié)的名字的索引值,第二個是這個關(guān)節(jié)對它影響的權(quán)值。關(guān)節(jié)+權(quán)值,二者組合起來就是一個完整的數(shù)據(jù)了。這么說應(yīng)該能明白了吧。)

?

<vertex_weights count="4">

<input semantic="JOINT" source="#joints" offset="0"/>

<input semantic="WEIGHT" source="#weights" offset="1"/>

<vcount>3 2 2 3</vcount>

<v>

1 0 0 1 1 2

1 3 1 4

1 3 2 4

1 0 3 1 2 2

</v>

</vertex_weights>

?

?

在這個例子里你可以看到<vertex_weight>結(jié)點為4個頂點定義了它們的權(quán)值(關(guān)聯(lián)),第一個頂點有3個關(guān)聯(lián)的關(guān)節(jié),第一個頂點的第一個關(guān)聯(lián)的關(guān)節(jié)的序號1,這個序號是用在Ssemantic="JOINT"的那個input指明的source中的<NAME_array>里的。同樣的它的權(quán)值在semantic="WEIGHT"的那個input指明的source中的<float_array>里,序號是0。

?

<skin>下還有另一個非常重要的子結(jié)點,它的名字是<joints>。它一般有兩個<input>子結(jié)點:其中一個的屬性semantic="JOINT",它通過"source"屬性引用了一個含“joint”這樣名字的<source>結(jié)點;另一個的屬性semantic="INV_BIND_MATRIX",它也通過"source"屬性引用了一個<source>結(jié)點,這個引用的結(jié)點為每個關(guān)節(jié)都定義一個反向綁定矩陣(注:原文with inverse bind matrices for each Joint,全文是And the second <input> with semantic="INV_BIND_MATRIX" references the source with inverse bind matrices for each Joint through the attribute "source")。這個包含了反向綁定矩陣的<source>含有 關(guān)節(jié)數(shù)量*16 個值用以記錄與關(guān)節(jié)數(shù)量一樣的那么多個反向綁定矩陣。這個矩陣是蒙皮所需要的,大家讀了實現(xiàn)部分后就知道了。

一旦我們讀完<controller>結(jié)點,我們會有一個動作綁定矩陣(Bind shape matrix)及很多的關(guān)節(jié)及它們的反向綁定矩陣(Inverse bind matrices),還有就是我們早先從<visual_scene>中讀取的關(guān)節(jié)矩陣。每個頂點都受到一個或多個骨骼的影響(記住這個條件的反面就是:每個關(guān)節(jié)必須至少對一個或多個頂點造成影響,實際上這是不對的,因為他們可能是端點(注:原文since their might be Joints我想應(yīng)該正好相反),不影響任何頂點)。因此我們必須擁有它們的權(quán)值信息。

到了現(xiàn)在這一步為止,你應(yīng)該能夠讀取COLLADA文件中的幾何數(shù)據(jù)、骨骼數(shù)據(jù)和蒙皮數(shù)據(jù)。并且你能夠以原始三角形繪制模型甚至能夠繪制出它的骨骼。盡管我還沒有討論你怎樣可以為每個關(guān)節(jié)疊加它們的世界矩陣然后將其以世界坐標(biāo)的形式來繪制從而方便調(diào)試使用。但我想我可以給你一個提示,我們必須將父關(guān)節(jié)的世界矩陣乘以當(dāng)前關(guān)節(jié)的矩陣然后將它作為當(dāng)然關(guān)節(jié)的世界矩陣保存起來。我們必須從根關(guān)節(jié)開始做這件事。從而我們不會從父節(jié)點中獲取污染了的矩陣,而且根關(guān)節(jié)的世界矩陣同時也是根關(guān)節(jié)本身的變換矩陣,因為根關(guān)節(jié)沒有任何的父關(guān)節(jié)(注:也就是說把開始繪制當(dāng)然模型時的世界矩陣當(dāng)作根關(guān)節(jié)的矩陣,而不要重新的維護一個自己的,整個骨骼每次都從根關(guān)節(jié)的矩陣也就是當(dāng)前模型的世界矩陣開始重新計算一遍,這樣也不會造成矩陣重復(fù)疊加的錯誤。盡管這里做了一個很復(fù)雜的解釋,但我想實際上他不說大家也都是這么做的不是嗎)。如果你同時還在讀COLLADA的1.5版規(guī)范說明,你可以找到蒙皮的公式,所以你也可以自己將模型擺成文件中定義好的各個形狀(注:動畫數(shù)據(jù)其實就是一個一個的POSE和擺出這個POSE的時間,只不過按時間的流逝不停的擺出POSE并且還計算出兩個時間點之間的中間POSE從而讓動畫看起來更平滑而已,這是后文)。到現(xiàn)在我們還沒討論到怎么讓這個模型動起來,我們會在下一節(jié)討論這點。

?

?

讀取COLLADA文件中的動畫數(shù)據(jù)

?????? 迄今為止我們已經(jīng)可以讀取靜態(tài)模型的所有數(shù)據(jù)了,還剩下的唯一的事情就是理解和讀取動畫部分的數(shù)據(jù)。COLLADA的動畫并不是非常成熟,可以說它還處在幼年時期,過一段時間后說不定它的動畫會變得更成熟更好。但就從實現(xiàn)我們的目的這點來看,我們還有許多值得擔(dān)心的地方。

??????

<library_animations>

?????? 在這個library里保存了所有的動畫數(shù)據(jù)。對于每個關(guān)節(jié)的動畫,你會看到一個<animation>結(jié)點,它包含了相關(guān)關(guān)節(jié)的詳細動畫數(shù)據(jù)。請記住,一個<animation>通道(注:也就是它下面所關(guān)聯(lián)的一系列數(shù)據(jù))會改變它所作用的目標(biāo)原來的形狀,它的作用目標(biāo)一般而言是關(guān)節(jié)(注:而不是所謂的骨骼,骨骼是假想的東西)。

?????? 在<animation>下有三種類型的子結(jié)點,第一種通常是一系列的記錄數(shù)據(jù)的<source>,第二種是<sampler>,第三種是<channel>。你需要<sampler>和<channel>結(jié)點來獲得動畫數(shù)據(jù)關(guān)聯(lián)的目標(biāo)。

?????? 在<channel>結(jié)點里你會獲得這個動畫數(shù)據(jù)作用的對象的ID。(注:這極難翻譯的原文是From <channel> node you pick the target which gives you the ID of the Object on which the Animation data will be applied. And you also get the Sampler ID from where you will pick the sources from which you will pick the animation Data.)

?????? 下面的例子是不不會出現(xiàn)在我們的示例COLLADA文件中的,因為我們假定文件記錄用的是背向矩陣(backing matrices)。但這樣的例子比較容易理解。

?????? 例子:

<source id="astroBoy-input">

<float_array id="astroBoy-input-array" count="2">0 1.16667</float_array>

< technique_common>

<accessor source="#astroBoy-input-array" count="2" stride="1">

<param name="TIME" type="float"/>

</accessor>

</technique_common >

</source>

<source id="astroBoy-output">

<float_array id="astroBoy-output-array" count="2">2.2 3.5</float_array>

<technique_common>

<accessor source="#astroBoy-output-array" count="2" stride="1">

<param name="TRANSFORM" type="float"/>

</accessor>

</technique_common>

</source>

<source id="astroBoy-interpolations">

<NAME_array id="astroBoy-interpolations-array" count="2">LINEAR LINEAR</NAME_array>

<technique_common>

< accessor source="#astroBoy-interpolations-array" count="2" stride="1">

<param name="INTERPOLATION" type="float"/>

</accessor >

</technique_common>

</source>

?

<sampler id="astroBoy_Skeleton-sampler">

<input semantic="INPUT" source="#astroBoy-input"/>

<input semantic="OUTPUT" source="#astroBoy-output"/>

<input semantic="INTERPOLATION" source="#astroBoy-interpolations"/>

</sampler>

?

<channel source="#astroSkeleton-sampler" target="astroBoy_Skeleton/trans.X"/>

?

現(xiàn)在我們從底部的<channel>結(jié)點開始分析。

這表示在場景中有一個叫做"astroBoy_Skeleton"的實體(對我們來說這實體就是關(guān)節(jié)),它的動畫其中的“X方向變換”(trans.X)是由叫做"astroSkeleton-sampler"的采樣器控制的。

?????? 所以我們需要知道"astroSkeleton-sampler"采樣器是怎樣對實體坐標(biāo)的進行X變換的,我們需要讀取<sampler>結(jié)點,它會告訴我們這一點。

?????? 為了獲得動畫數(shù)據(jù),你需要讀取3種輸入信息(也就是<input>)結(jié)點。

?

?????? 第一種<intput>結(jié)點是:INPUT

?????? 第二種<intput>結(jié)點是:OUTPUT

?????? 第三種<intput>結(jié)點是:INTERPOLATION

?

當(dāng)我們開始讀取<sampler>下的<input>結(jié)點。

屬性”semantic” = "INPUT"的的告訴我們動畫的輸入 <source>

屬性”semantic” = "OUTPUT"的告訴我們動畫的輸出 <source>

屬性”semantic” = "INTERPOLATON"的告訴我們動畫的插值<source>

?

?????? 當(dāng)我們讀取這一堆<source>時,我們看到<sampler>下屬性”semantic”為"INPUT"的<input>子結(jié)點所引用的<source>結(jié)點,其子結(jié)點<technique_common>下的子結(jié)點<accessor>下的子節(jié)點<param>的名字為”TIME”,簡單來說這個source包含了動畫的一系列類型為浮點型的時間信息。

?????? 而<sampler>下屬性”semantic”為"OUTPUT"的<input>子結(jié)點所引用的<source>結(jié)點,其子結(jié)點<technique_common>下的子結(jié)點<accessor>下的子節(jié)點<param>的名字為” TRANSFORM”。這說明了這個source所包含的一系列浮點型的值為X坐標(biāo)變換,這些變換的值與上面讀取的時間相對應(yīng)。(為什么是X坐標(biāo)的變換呢,因為<channel>中指明了是關(guān)于X軸的變換,它所屬的一系列數(shù)據(jù)自然也是同樣的意義了)

??????

?????? <sampler>下屬性”semantic”為"INTERPOLATION"的<input>子結(jié)點所引用的<source>結(jié)點,其子結(jié)點<technique_common>下的子結(jié)點<accessor>下的子節(jié)點<param>的名字為”INTERPOLATION”。這個source以字符串的方式說明了前面我們讀取的OUPUT中的值所應(yīng)采取的插值方式(在Max中它的插值方式通常都是”LINERA”(線性插值),所以我們可以不讀這個source而直接默認全部采用線性插值)。

?????? 最后一個source(注:就是插值的那個)是什么意思呢,比如對應(yīng)兩個時間點,我們可以相應(yīng)的從OUTPUT中取出兩個值。那么如果這個時間正好落在這兩個時間點之間呢,我們怎么做它的動畫?于是我們通過插值來得到那個中間時間的OUTPUT值。如之前所說的,我們可以用簡單的線性插值來實現(xiàn)。

?????? 你所看到的名為TIME的source,實際上是動畫的關(guān)鍵幀。OUTPUT中所對應(yīng)的數(shù)據(jù),就是關(guān)鍵幀的數(shù)據(jù)。具體來說在這里就是控制實體的X坐標(biāo)變換的關(guān)鍵幀數(shù)據(jù)了。

?????? 所以在你的代碼中不斷的獲取時間相應(yīng)的OUTPUT值,并將其作為X變換因子作用于實體上,那么你的模型的動畫就實現(xiàn)了。用線性插值計算關(guān)鍵幀之間的插值數(shù)據(jù),會讓你的動畫看起來更加的平滑。

??????

插值是什么意思?

插值就是計算一個值或多個值間的任意中間值。

?

?????? 比如我們有值X和Y,我們要計算它們兩個的“中間”的值(注:也就是1/2處的值),我們使用0.5作為插值因數(shù),這個插值因數(shù)我們稱之為“T”。如果我們要找到X和Y間3/4處的值,我們使用的插值因數(shù)T=0.75,以此類推(注:原文3-Quater應(yīng)為3-Quarter即四分之三)。

?????? 你可以讓T以不同增量比如0.001、0.01、0.05等等做一個從0.0到1.0的循環(huán),然后你就可以得到它們之間的很多很多插值。

?????? 線性插值是一種很簡單的插值方法,它的公式如下所示:

float Interpolate( float a_Value1, float a_Value2, float a_T)

{

return ((a_Value2 * a_T) + ((1 - a_T) * a_Value1));

}??????????

?

這個公式表明,如果"a_T"為0,那么它會返回給你的值;如果它是1,那么會返回給你的值;如果它是0到1之間的值,那么它會返回一個a_Value1到a_Value2之間的值。

實際上還有其它更好的插值方法。比如貝塞爾插值,三次方插值等。它們有更為復(fù)雜的公式,而且它們的插值是基于多于兩個值的情況。但我們只使用線性插值,這也是為了簡單考慮。

現(xiàn)在正如我們之前所說的,這個例子并不是我們的示例文件中所出現(xiàn)的實際內(nèi)容,所以讓我們來看看實際內(nèi)容是怎么樣的。

謹記我們的假設(shè),我們只有兩種類型的<animation>結(jié)點,同時我們有16*3=48個<source>和16個<sampler>與16個<channel>結(jié)點,或者我們有3個<source>、1個<sampler>和1個<channel>。在第一種情況下"target"屬性在最后的“/”之前含有"transform (X) (Y)"這樣的記錄;而在第二種情況下,"target"屬性在最后的“/”之前則只含有"transform"這樣的記錄。

?

這種情況:

<channel source="#astroSkeleton-sampler" target="astroBoy_Skeleton/transform (0) (0)"/>

或是這種情況:

<channel source="#astroSkeleton-sampler" target="astroBoy_Skeleton/transform"/>

?

第二種情況,我們獲得的矩陣的值,是不屬于那三種source之中任意一種的,這和我們在控制器的反向矩陣中遇到的情況是一樣的。而第一種情況下組成4X4矩陣的每一個值來自不同的source,因此當(dāng)我們讀數(shù)據(jù)的時候,必須把它們組合起來。

如果你記得我們從<visual_scene>中讀取每一個關(guān)節(jié)的矩陣時,這些我們從<animation>結(jié)點中讀出的值(它們應(yīng)該是矩陣,因為我們將它們背向了 原文:(which will be matrices, since we backed matrices) 什么玩意),它們通過子結(jié)點<channel>的"target"屬性來指明作用的對象(target,實際上是關(guān)節(jié)joint),它會替換它所作用的關(guān)節(jié)的矩陣,我們早前從<visual_scene>讀出來的每個關(guān)鍵幀在這里的animation中被定義。我們?yōu)槊總€關(guān)節(jié)計算它們的世界矩陣,我們用新的關(guān)節(jié)矩陣乘以它的父關(guān)節(jié)世界矩陣

好了,這就是所有的東西了(原文:And that’s all pretty much it.這是什么鳥語)。如果你從頭到尾讀完了這篇教程,我猜你已經(jīng)可以寫出你自己的COLLADA文檔導(dǎo)出工具了。而且現(xiàn)在你可以準(zhǔn)備去讀這篇教程的下一部分了,如果你之前還沒有看過的話。

?

?

?

?

全文DOC下載:http://download.csdn.net/detail/qyfcool/4732892

總結(jié)

以上是生活随笔為你收集整理的一步一步的使用C++和OPENGL实现COLLADA骨骼动画 第一部分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

国产精品久久久久久久久久新婚 | 日日碰狠狠添天天爽超碰97久久 | 日本成人中文字幕在线观看 | 国产福利av | 911国产 | 成片视频免费观看 | 欧美成人h版在线观看 | 久久天堂精品视频 | 探花视频在线观看+在线播放 | 久久国产欧美日韩精品 | 在线免费观看不卡av | 久草在线免费在线观看 | 国产精品久久中文字幕 | 成人h动漫精品一区二 | 黄色影院在线免费观看 | 日本公妇色中文字幕 | 亚洲第一区精品 | 天天色天天综合网 | 日本精品一区二区三区在线观看 | 成人免费av电影 | 狠狠操在线 | 欧美激情视频三区 | 超碰免费公开 | 我要色综合天天 | 91精品免费看 | 久热电影 | 中文字幕在线观看三区 | 五月开心六月婷婷 | 日韩国产欧美在线视频 | av高清一区二区三区 | 在线免费观看视频 | 欧美日韩高清在线观看 | 色婷婷精品大在线视频 | 天天综合人人 | 国产精彩视频一区二区 | 免费的黄色av | 久久天天躁狠狠躁夜夜不卡公司 | 中文字幕观看视频 | 欧美日韩视频在线观看一区二区 | 人人艹视频 | 一区二区理论片 | 天堂资源在线观看视频 | 在线网址你懂得 | 亚洲日本国产精品 | 国产黄色电影 | 99综合视频 | 97理论片 | 天天色天天操综合 | 人人舔人人爱 | 久久久免费精品视频 | 9在线观看免费 | 精品91在线 | 一本一道久久a久久精品蜜桃 | 亚洲黄色在线观看 | 日韩乱码中文字幕 | 成人久久18免费网站 | 天天插一插 | 亚洲成av| 国产精品99久久久久久大便 | 日韩一级片观看 | 黄色成人在线观看 | 国产精品av在线免费观看 | 黄色三级免费网址 | 久久伊人八月婷婷综合激情 | 特片网久久 | 国产精品国产三级在线专区 | 米奇四色影视 | 久久综合久久八八 | 亚洲夜夜网 | 日本在线中文 | 日韩在线免费看 | 日韩在线观看一区二区三区 | 五月婷婷综合久久 | 日韩理论在线播放 | 欧美在线视频一区二区三区 | 免费在线成人av电影 | 亚洲福利精品 | 天堂久久电影网 | 亚洲高清不卡av | 欧美日韩国产精品一区二区亚洲 | 欧美国产高清 | 国产成人免费网站 | 日韩高清免费无专码区 | 天天操天天艹 | 奇米影视777四色米奇影院 | 天天操欧美 | 特级黄色片免费看 | 欧美小视频在线观看 | 成人国产精品一区二区 | 久久久久久高清 | 欧美日韩伦理在线 | 国产精品久久久久久一区二区 | 九色激情网 | 在线中文字幕av观看 | 成人在线小视频 | 国产精品久久久久av | 美女视频久久黄 | 欧美一级电影在线观看 | 国产又粗又猛又黄 | 91九色porny蝌蚪主页 | 最新动作电影 | 亚洲最新av在线网站 | 久久久精品电影 | 久久久精品高清 | 久久精品视频一 | 久久精品久久精品久久精品 | 韩日电影在线 | 人人爽人人爽人人片av免 | 亚洲午夜久久久久久久久 | www.伊人网| 欧美污污网站 | 日本字幕网 | 国产黄色精品在线 | 999成人| 91精品国产乱码在线观看 | 亚洲国产精品久久久久久 | 日本h在线播放 | 久久只精品99品免费久23小说 | 国产一区二区在线影院 | 三级黄色在线观看 | 一级片黄色片网站 | 色综合天天在线 | a特级毛片| 亚洲国产精品激情在线观看 | 久久国产一区 | 手机看片 | 夜夜躁狠狠燥 | 亚洲日日射 | 日b视频国产 | 最新av免费在线 | 玖玖在线观看视频 | 国产免费视频一区二区裸体 | 亚洲精品综合在线观看 | 97免费在线观看视频 | 日韩中文字幕视频在线观看 | 中文字幕在线观看免费高清电影 | 999久久久久久久久6666 | 在线免费观看视频一区 | 亚洲爱视频| 九九热免费视频在线观看 | 天天操夜夜操天天射 | 国产区av在线 | 国产亚洲在线观看 | 国产精品手机在线观看 | 99久久精品免费视频 | 色爱区综合激月婷婷 | 一区 二区 精品 | 免费看日韩片 | 麻豆 free xxxx movies hd | 高潮久久久久久久久 | 日韩国产欧美在线视频 | 久久精美视频 | 97成人超碰| 欧美日韩免费一区 | 久久黄色免费观看 | 日本黄色一级电影 | 成年人免费观看国产 | 亚洲aaa毛片| 天天天天天天操 | 五月天婷亚洲天综合网精品偷 | 成人毛片网| 亚洲开心色 | 国产福利av| 久久久久美女 | 亚洲天堂网视频在线观看 | 久久久久久伊人 | 日韩69av| 久久久久久亚洲精品 | 久久久精品日本 | 免费亚洲黄色 | 欧美视频在线二区 | 蜜臀久久99精品久久久久久网站 | 在线色网站 | 亚洲精品色婷婷 | 欧美一区二区在线刺激视频 | 欧美日产在线观看 | 91av国产视频| 婷婷精品在线视频 | 久草视频国产 | 在线久草视频 | 国产在线播放一区二区三区 | 成人影视免费看 | 夜夜操天天 | 免费69视频 | 亚洲人成网站精品片在线观看 | 久久中文网 | 毛片a级片 | 欧美久久影院 | 国产麻豆精品传媒av国产下载 | 色久综合 | 国产视频一区二区在线播放 | 91豆麻精品91久久久久久 | 天天爱av导航 | 日韩中文幕 | 国产精品麻豆免费版 | www五月| 又爽又黄又无遮挡网站动态图 | 久草在线一免费新视频 | 日韩精品综合在线 | 一区二区三区在线视频观看58 | 日韩在线电影一区 | 一级一片免费视频 | 久草在线一免费新视频 | 午夜视频福利 | 久久精选视频 | 亚洲第一av在线 | 99亚洲国产 | 黄污在线看| 久久久夜色 | 我要看黄色一级片 | 国产婷婷一区二区 | 天天干天天射天天操 | 国产精品高潮呻吟久久av无 | 日日碰狠狠添天天爽超碰97久久 | av成人免费观看 | 狠狠狠狠狠操 | 久久久久久久久国产 | 99精品影视 | 国产在线观看,日本 | 国产亚洲精品久久久久久大师 | 99婷婷狠狠成为人免费视频 | 国产精品18久久久久久久久久久久 | 99精品视频免费全部在线 | 中文字幕在线影院 | 三级黄色欧美 | 日韩视频一区二区在线观看 | 精品一区二区6 | 婷婷久久综合九色综合 | 日韩高清毛片 | 在线视频一二三 | 婷婷综合五月天 | 一级免费av | 午夜精品久久久久久久爽 | 在线观看麻豆av | 99免费在线观看 | 欧美日韩精品在线观看视频 | 天天操天天干天天插 | 中文字幕久久精品 | 国产在线观看免费观看 | 天天色视频| 中文字幕一区三区 | 91社区国产高清 | 欧美一级艳片视频免费观看 | 国产区欧美 | 日韩有码在线播放 | 热精品| 婷婷久久一区二区三区 | 91亚洲精 | 91亚洲国产成人久久精品网站 | 一区二区不卡视频在线观看 | 五月婷婷.com| 久久免费黄色网址 | 成人黄色免费在线观看 | 亚洲一区二区麻豆 | av在线a| 999精品 | 夜夜爽天天爽 | 麻豆91在线观看 | 99爱在线观看 | 日韩在线播放av | 久久伦理网 | 国产一区在线精品 | 最近中文字幕国语免费av | 亚洲成aⅴ人在线观看 | 在线精品一区二区 | 日日日操操 | 黄色毛片网站在线观看 | 久久久久亚洲精品国产 | 日韩在线观看一区二区三区 | 国产成人精品综合久久久 | 色香蕉网 | 手机av电影在线 | 一区二区三区免费在线观看视频 | 99 精品 在线 | 五月天激情视频 | 91在线91| 国产精品情侣视频 | 国产片免费在线观看视频 | 国产午夜精品免费一区二区三区视频 | 99久久er热在这里只有精品15 | 亚洲涩涩涩 | 免费看黄色毛片 | 一区二区三区动漫 | 五月天中文字幕mv在线 | 日韩在线观看你懂的 | 国产精品18久久久久久不卡孕妇 | 丁香六月激情婷婷 | 九九热在线观看 | 综合伊人久久 | 色综合久久66 | 日韩sese | 在线观看91久久久久久 | 亚洲成人资源在线观看 | 西西44人体做爰大胆视频 | 午夜精品一区二区三区在线 | 日本久久精 | 中文字幕在线观看91 | 久久精品一二三区白丝高潮 | 91精品高清| 亚洲国产精品成人女人久久 | 欧美精彩视频在线观看 | 日韩一二三在线 | 国产视频99 | 天天插夜夜操 | 中文字幕精品三级久久久 | 婷婷六月在线 | 亚洲激情av | 国产精品欧美 | 久久久久久激情 | 日韩视频一区二区在线观看 | 久久伦理电影 | 成人午夜片av在线看 | 欧美激情另类文学 | 成人va在线观看 | 91av免费在线观看 | 国产精品久久久久久一区二区三区 | 国产午夜精品av一区二区 | 久久手机精品视频 | 国产精品你懂的在线观看 | 久要激情网 | 中文字幕在线播放第一页 | 国产精品国产三级国产 | 国产成在线观看免费视频 | 高清av在线| av不卡免费在线观看 | 欧美一级黄色视屏 | 亚洲激情 | 激情在线网站 | 人人爱人人舔 | 91精品视频在线免费观看 | 五月婷婷激情六月 | 色综合天天天天做夜夜夜夜做 | 欧美日韩性视频 | av在线电影网站 | 一本到在线 | 激情五月开心 | 日本一区二区三区免费观看 | 亚洲最大av | 色网站在线看 | 九九热免费在线视频 | 亚洲国产精品视频在线观看 | 日韩理论电影网 | a久久久久 | 日韩欧美综合精品 | 久久精品国产一区二区三区 | 国产成人一二片 | 亚洲电影成人 | 一区二区三区四区免费视频 | 99免费在线观看视频 | 国产福利91精品一区二区三区 | 久久污视频 | 免费91麻豆精品国产自产在线观看 | 91香蕉国产在线观看软件 | 国产精品白浆 | 国产精品免费久久久久久久久久中文 | 久久久久97国产 | 欧美,日韩 | 精品一区二区日韩 | 亚洲五月激情 | 夜色资源网 | 久久夜色网 | 久久不卡国产精品一区二区 | 婷婷电影在线观看 | 中文字幕一区二区三区乱码在线 | 伊人五月天av | 91九色蝌蚪国产 | 在线观看激情av | 91精选在线观看 | 中文字幕乱码电影 | 久久蜜臀av | 色在线免费视频 | 96超碰在线 | 91精品影视 | 久久伊人综合 | 色资源中文字幕 | 欧美一区免费在线观看 | 精品久久久久久久久久 | 91精品国产一区 | 欧美午夜理伦三级在线观看 | 黄色一级免费网站 | 亚洲 中文字幕av | 婷婷丁香av | 最新日韩在线观看 | 91视频中文字幕 | 亚洲欧美视频一区二区三区 | 91免费高清在线观看 | 久久久久久久99 | 特级西西444www高清大视频 | 美女一区网站 | 亚洲精品456在线播放 | av中文字幕亚洲 | 91久久人澡人人添人人爽欧美 | 国产在线 一区二区三区 | 亚洲国产精品小视频 | 99精品国产高清在线观看 | 亚洲不卡av一区二区三区 | 日韩手机在线 | 99色在线播放 | 国产乱码精品一区二区三区介绍 | av一区二区在线观看中文字幕 | 黄色影院在线免费观看 | 久久婷婷国产色一区二区三区 | 国产一级电影网 | 亚洲国产精品第一区二区 | 在线观看黄网 | 国语精品免费视频 | 久久久久久久电影 | 国内毛片毛片 | 精品一区二区三区久久 | 久久久久久久久爱 | 三级黄色理论片 | 欧美老人xxxx18 | 又黄又色又爽 | www.福利| 999成人精品 | 亚洲 欧美 变态 国产 另类 | 亚洲免费视频观看 | 超碰97免费在线 | 日韩欧美视频在线 | www.日本色| 免费网站黄色 | 国产99久久九九精品免费 | 国产精品一区二区免费视频 | 日韩免费久久 | 2019天天干夜夜操 | 99视频在线观看一区三区 | 香蕉影院在线 | 欧美日本不卡高清 | av黄色免费在线观看 | 久久高清国产视频 | 97精品久久人人爽人人爽 | 又黄又刺激的视频 | 亚洲男男gⅴgay双龙 | 毛片网在线 | 91av免费观看 | 在线观看日韩精品视频 | 在线观看岛国 | 国产一区二区在线观看视频 | 国产午夜影院 | 日韩在线观看中文字幕 | 麻豆一区在线观看 | 国产午夜三级一区二区三 | 在线观看精品视频 | 欧美一区日韩精品 | 亚洲视频 在线观看 | 激情av资源 | 成人av影视在线 | 毛片无卡免费无播放器 | 久久精品电影网 | 免费av大片 | 国产一级二级三级视频 | 免费看片在线观看 | 免费a网| 欧美成人tv| 久久综合色天天久久综合图片 | 久久中文字幕在线视频 | 久久超碰97 | 日韩av播放在线 | 婷五月激情 | 精品久久一二三区 | 91精品免费看| 久久精品国产亚洲aⅴ | 最新色站| 色在线中文字幕 | 极品久久久 | 亚洲丁香久久久 | 国产精品久久99精品毛片三a | 91精品秘密在线观看 | 婷婷色吧| 一区二区三区免费在线观看 | 中文成人字幕 | 天天干天天怕 | 99热高清 | 国产在线理论片 | 国产成人精品午夜在线播放 | 久久9视频 | 国产精品久久久久毛片大屁完整版 | 免费av网站在线 | 成人一级 | 色综合久久久久综合99 | 欧美一区二区三区免费观看 | 国产一区二区在线免费播放 | 六月久久婷婷 | 手机在线永久免费观看av片 | 99久久9 | 六月久久婷婷 | 日韩中文字幕在线 | 免费成人黄色av | 人人插人人射 | 欧美精品久久久久久久久久久 | 97超碰超碰久久福利超碰 | 夜夜夜夜夜夜操 | 日韩午夜精品 | 91理论电影| 九九热久久免费视频 | 国产中文字幕国产 | 日韩av中文字幕在线 | 国产色婷婷 | 国产视频网站在线观看 | 中文成人字幕 | 久久高清 | 免费在线观看不卡av | 黄色网在线免费观看 | 国产精品中文在线 | 色婷婷激情五月 | 嫩小bbbb摸bbb摸bbb | 天天躁日日躁狠狠躁 | 国产精品第72页 | 日韩高清无线码2023 | 日韩免费不卡av | 欧美精品久久久久久久久久久 | 久久视频网 | 国产一级电影免费观看 | 亚洲精品国偷拍自产在线观看 | 天天插夜夜操 | 黄在线免费观看 | 97香蕉久久国产在线观看 | 久久综合色8888 | 人人精品 | 国产亚洲精品久久久久久电影 | 一本一道久久a久久精品蜜桃 | 国产精品入口a级 | 天天做综合网 | 久久高视频 | 国产日本在线 | 久久夜色精品国产欧美一区麻豆 | 国外调教视频网站 | 国产精品福利在线播放 | 国产午夜一区二区 | 日韩在线观看视频在线 | 免费 在线 中文 日本 | 麻豆免费精品视频 | 日韩成人在线免费观看 | 亚洲免费小视频 | 久久国产免 | 亚洲精品va| 激情五月播播久久久精品 | 亚洲黄色一级电影 | 亚洲人天堂 | 国产色资源| 国产中文字幕网 | 日韩av电影免费观看 | 99免费在线观看视频 | 黄色国产精品 | 精品一区精品二区 | 国产高清视频免费在线观看 | 国产永久免费高清在线观看视频 | 国产一线天在线观看 | 欧美性生交大片免网 | 国产免费美女 | 夜夜夜夜操 | 国产老妇av | 精品福利在线观看 | 日本精品视频一区二区 | 91免费观看视频在线 | 99精品在线视频播放 | 午夜婷婷在线观看 | 国产中文字幕视频在线观看 | 久久美女电影 | 免费午夜网站 | 三级黄色在线 | 成人黄色片免费 | 91天堂素人约啪 | 国产午夜精品一区二区三区嫩草 | 中文av资源站 | 丁香综合av | 激情影音先锋 | 亚洲 中文字幕av | 四虎国产精品成人免费4hu | 国产码电影 | 欧美日韩一级久久久久久免费看 | 99久久久久久久久久 | 国产黄在线播放 | 91传媒激情理伦片 | 国产成人福利 | 国产裸体永久免费视频网站 | 日韩美在线| 激情小说网站亚洲综合网 | 日韩在线| 在线观看黄网站 | 亚洲成av人片 | a视频免费在线观看 | 午夜久久久久 | 精品视频www| 精品伊人久久久 | 久久久香蕉视频 | 黄色免费视频在线观看 | 国产蜜臀av | 午夜精品一区二区三区免费视频 | 国产一线二线三线在线观看 | 国产a视频免费观看 | 久久伊人八月婷婷综合激情 | 在线日韩精品视频 | 亚洲精品字幕 | 亚洲国产欧美在线人成大黄瓜 | 成人网在线免费视频 | av一级片网站 | 日韩特黄一级欧美毛片特黄 | 久久亚洲二区 | 久久久国产高清 | 亚洲 综合 专区 | 在线视频 区 | 欧美精品久久人人躁人人爽 | 亚洲成人家庭影院 | 久久久久| 热久久视久久精品18亚洲精品 | 四虎在线免费 | 91网址在线 | 天堂va在线观看 | 欧美另类性 | 日本中文不卡 | 久久综合狠狠 | 狠狠干天天色 | 久久99精品久久久久婷婷 | 成人性生交大片免费看中文网站 | 操久| 成人免费看片网址 | 91九色丨porny丨丰满6 | 九九国产精品视频 | 奇米影视8888在线观看大全免费 | 91中文字幕在线视频 | 91秒拍国产福利一区 | 日韩精品一区电影 | 日韩精品一二三 | 亚洲欧美日韩在线看 | 日韩视频免费在线 | 免费在线观看日韩欧美 | av九九九 | 成人一区二区三区中文字幕 | 欧美性久久久 | 久久久久久国产精品免费 | 久久人人爽人人爽人人片av免费 | 9999免费视频 | 天天干天天干天天色 | 久久视频| 欧美精品久久 | 国产精品视频最多的网站 | 2020天天干夜夜爽 | 国产xx在线 | 99色视频在线 | 久久高视频 | 国产午夜激情视频 | 亚洲国产成人在线观看 | 美女很黄免费网站 | 91久久精品一区 | 天天干天天天 | 99视频在线精品国自产拍免费观看 | 亚洲成人精品av | 欧亚日韩精品一区二区在线 | 少妇自拍av | 日韩精品一区二区免费视频 | 国产视频一二区 | 亚洲网站在线 | 三级av在线| 欧美福利精品 | 午夜久久福利影院 | 久久久久国产精品免费网站 | 亚洲精品网址在线观看 | 国产精品国内免费一区二区三区 | 久久福利综合 | av免费试看 | 免费在线成人av电影 | 丝袜少妇在线 | 成人免费观看a | 欧美粗又大 | 91av在线视频免费观看 | 久久精品视 | 一区二区在线电影 | 国产专区免费 | 亚洲精品视频第一页 | 人人草网站 | 国产在线小视频 | 国产一级性生活 | 日韩免费不卡av | 中文字幕在线观看视频一区二区三区 | 中文字幕免费 | 91精品对白一区国产伦 | 精品一区二区免费 | 亚洲综合在线五月天 | 色综合天天色 | 国产精品理论在线观看 | 五月天色婷婷丁香 | 91免费观看视频网站 | 手机在线中文字幕 | 久久久精品国产一区二区电影四季 | ,久久福利影视 | 成年人在线看视频 | 日韩中文字幕在线 | 国产日韩一区在线 | 精品亚洲二区 | 深夜免费福利 | 丁香网婷婷 | 97影视 | 欧美精品久久久久久久久老牛影院 | 国产免费高清 | 黄色aaa毛片 | 91热这里只有精品 | 在线看小早川怜子av | 在线精品一区二区 | 国产福利精品视频 | 久草在线视频在线观看 | 久久久久 免费视频 | 激情久久久久久久久久久久久久久久 | 成人小电影在线看 | 亚洲激情免费 | 天天舔天天搞 | 欧美成人黄色片 | 免费在线观看91 | 亚洲视频1| 欧美极品一区二区三区 | 99热99热 | 91看片在线播放 | www.天天干| 国产一区二区在线免费播放 | 欧美小视频在线 | 天天做天天爽 | 在线观看av免费 | 超碰免费在线公开 | 91精品1区| 国产一级免费在线观看 | a午夜在线 | 黄色小网站在线观看 | 国产手机在线 | 91丝袜美腿 | 国产亚洲精品久久久久久网站 | 欧美一区二区三区不卡 | 97超碰人| 国产女人40精品一区毛片视频 | 99re6热在线精品视频 | 国产日韩精品一区二区三区在线 | 五月婷婷色播 | 成人国产精品入口 | 色资源网在线观看 | www日日夜夜 | 日韩av中文字幕在线免费观看 | 精品久久久久国产免费第一页 | 中文字幕观看在线 | 日韩激情视频在线 | 午夜视频不卡 | 99精品在线直播 | 国产经典av | 丁香影院在线 | 激情黄色一级片 | 精品在线二区 | 久久嗨 | av免费在线观看1 | 国产艹b视频 | 综合亚洲视频 | 亚洲码国产日韩欧美高潮在线播放 | 91麻豆精品国产 | 免费在线观看av网址 | 欧美日韩p片 | 国产精品黑丝在线观看 | 久久影视中文字幕 | www黄com| 国产一卡二卡在线 | 黄色亚洲精品 | 日韩在线色视频 | 国产精品视频久久 | 500部大龄熟乱视频使用方法 | 日韩中文三级 | 免费高清在线视频一区· | 国产中文字幕在线播放 | 日韩av一区二区三区在线观看 | 777奇米四色 | 麻豆精品在线 | 久久三级视频 | 国产精品久久久久四虎 | 国产欧美日韩视频 | 91大神电影| 精品一区二区在线看 | 欧美激情另类 | 在线久热| 手机在线日韩视频 | 噜噜色官网 | 久草在线中文视频 | 久久久久久久久影视 | 国产亚洲欧美日韩高清 | 91精品国产91| 久久久精品日本 | 五月婷婷一区二区三区 | 超碰人人草 | 91av视频网 | 国产视频精品免费播放 | 天堂视频中文在线 | 99视屏| 成人精品一区二区三区中文字幕 | 24小时日本在线www免费的 | 欧美aa在线 | 香蕉视频网址 | 精品久久久久久国产偷窥 | 国产伦精品一区二区三区四区视频 | 国产福利91精品一区 | 国产成人久久77777精品 | 波多野结衣电影一区二区 | 亚洲在线视频免费 | www.人人干 | 在线综合色 | 人人爽人人爱 | 2018亚洲男人天堂 | 亚洲精品中文字幕在线 | 91九色老| 成人羞羞视频在线观看免费 | 日韩在线观看网站 | 免费在线观看中文字幕 | 精品一区二区在线播放 | 日韩精品专区在线影院重磅 | 国产精品视频永久免费播放 | 免费黄色网址大全 | 一级片视频免费观看 | 国产精品一区二区在线观看免费 | 欧洲亚洲国产视频 | 香蕉影院在线观看 | 奇米网777| av成人免费网站 | 亚洲精品久久久久中文字幕二区 | 狠狠网 | 国产资源在线免费观看 | 在线欧美中文字幕 | 日韩一区二区三区在线看 | 一区二区三区高清不卡 | 在线观看的a站 | 久久99精品久久久久婷婷 | 久久综合免费视频 | 91丨九色丨高潮 | 黄色福利视频网站 | 97国产大学生情侣酒店的特点 | 在线视频亚洲 | 久青草视频在线观看 | 亚洲成人一区 | 久久国内精品视频 | 久久99久久99精品免视看婷婷 | 免费看黄色91 | 国产中文字幕av | 精品一区二区电影 | 天堂av观看 | 91精彩视频在线观看 | av网在线观看 | 日韩国产精品久久 | 特级大胆西西4444www | 亚洲综合在线一区二区三区 | 日日夜夜干 | 波多野结衣在线中文字幕 | 欧美粗又大 | 欧美先锋影音 | 国产91精品一区二区绿帽 | 久久99视频免费 | 国产精品不卡av | 中文字幕一区二区三区四区视频 | 日本激情视频中文字幕 | 在线免费观看成人 | 国产午夜激情视频 | 久久久激情视频 | 久久黄色免费观看 | 国产高清无av久久 | 中文字幕av影院 | 成人9ⅰ免费影视网站 | 福利视频 | 天天要夜夜操 | 成人久久久精品国产乱码一区二区 | 啪啪激情网| 最新国产中文字幕 | av直接看| 涩涩网站在线播放 | 99一级片| 91免费观看网站 | 欧美福利网址 | 亚洲精品动漫成人3d无尽在线 | 91视频传媒 | 欧美日韩视频在线 | 国产一区播放 | 成人av高清 | 欧美成人性战久久 | 97视频总站 | 亚洲 欧美日韩 国产 中文 | 免费视频a| 国内精品久久久久 | 激情五月婷婷激情 | 免费在线激情电影 | 热久久精品在线 | 中文字幕丰满人伦在线 | 国产黄色精品在线 | 精品美女久久久久久免费 | 国产成人精品区 | 欧美另类v| 欧美日韩色婷婷 | 国产中文字幕在线播放 | 亚洲综合精品视频 | 91香蕉视频黄色 | 色婷婷啪啪免费在线电影观看 | 性日韩欧美在线视频 | 日韩精品久久久久 | 亚洲爱爱视频 | 国产视频久久久 | 中国一级片在线播放 | 中国一级特黄毛片大片久久 | 国产亚洲免费的视频看 | 亚洲天堂网在线视频观看 | a精品视频 | 国内三级在线观看 | 免费黄色在线网站 | 久草香蕉在线 | 免费看黄20分钟 | 日韩欧美一区二区在线播放 | 色综合咪咪久久网 | 亚洲激色| 国产免费xvideos视频入口 | 美女国产 | 91精品国产九九九久久久亚洲 | 美女免费黄网站 | 日日干视频 | 久久成电影 | 99热国产在线观看 | 日韩免费av在线 | 成年人免费av | 韩日视频在线 | 国产精品一区二区中文字幕 | 国产亚洲精品成人av久久影院 | 超碰97免费在线 | 欧美va在线观看 | 成人av在线直播 | 毛片网站观看 | 国产黄色资源 | 婷婷狠狠操 | 又黄又爽又湿又无遮挡的在线视频 | 四虎成人免费观看 | av动态图片 | 久久无码av一区二区三区电影网 | 日日夜精品 | 免费久久99精品国产婷婷六月 | 国产精品成人一区二区 | 91精品久久久久久久久久久久久 | 久青草国产在线 | 亚洲春色成人 | 日韩欧美在线综合网 | 最近中文字幕mv免费高清在线 | av中文在线影视 | 国产色婷婷在线 | 一区二区不卡 | 中文字幕国产精品一区二区 | 国产日本在线观看 | 黄色网址a| 91在线国产观看 | 欧美天天射 | 亚洲天天综合 | 在线观看亚洲精品视频 | 99久久精品免费视频 | 综合久久一本 | 天天干天天干天天色 | 成人电影毛片 | www国产在线| 国产在线黄色 | 成人福利av | 成人黄色毛片 | 成人午夜剧场在线观看 | 免费看搞黄视频网站 | 1000部18岁以下禁看视频 | 98涩涩国产露脸精品国产网 | 亚洲精品ww | 亚洲夜夜综合 | 天天草天天摸 | 不卡av在线免费观看 | 久久影院亚洲 | 亚洲精品一区二区精华 | 高清av免费一区中文字幕 | 国产成人亚洲精品自产在线 | 婷婷丁香社区 | 亚洲欧洲精品久久 | 97精品国产91久久久久久 | 狠狠操狠狠 | 色视频在线看 | 国产成人久久精品一区二区三区 | 1024手机看片国产 | 国产精品美女视频 | а天堂中文最新一区二区三区 | 亚洲精品国偷拍自产在线观看蜜桃 | 日韩三级视频 | 国产99久久久精品视频 | 成人国产精品av | 亚洲成人国产精品 | 国产黄色精品网站 | 日韩免费三级 | 久草视频在 | 亚洲天天在线 | 亚洲一区二区天堂 | 国产精品女同一区二区三区久久夜 | .国产精品成人自产拍在线观看6 | 一区 二区 精品 | 综合天堂av久久久久久久 | 色姑娘综合 | 日韩视频一区二区 | 黄色亚洲免费 | 国产免费不卡av | 蜜臀av夜夜澡人人爽人人 | 在线观看免费 | 黄色亚洲大片免费在线观看 | 国产精品久久久久一区二区三区 | 国产精品免费一区二区三区在线观看 |