青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當(dāng)自強(qiáng)而不息

【ZT】D3D中的骨骼動(dòng)畫

作者:qlwuu


相信這里沒(méi)有人沒(méi)玩過(guò)采用骨骼動(dòng)畫技術(shù)的游戲,看看那些熱門的動(dòng)作游戲,例如《波斯王子》、《分裂細(xì)胞》和《戰(zhàn)神》,你就知道骨骼動(dòng)畫的威力了(我承認(rèn)是猜的)。骨骼動(dòng)畫技術(shù)用來(lái)使我們的3D模型在屏幕上動(dòng)起來(lái),通過(guò)和動(dòng)作捕捉技術(shù)結(jié)合,可以讓模型做出非常逼真的動(dòng)作。而這樣一個(gè)極具威力的技術(shù),其原理卻相當(dāng)簡(jiǎn)單。

假設(shè)我們要讓游戲主角做出一個(gè)動(dòng)作,例如波斯王子拿彎刀往前一劈。最簡(jiǎn)單的方法,就是讓模型師建一個(gè)動(dòng)畫序列,然后在程序中逐幀播放,就像放電影一樣。不過(guò)這樣一來(lái)工作量就太大了,玩家也需要N個(gè)G的硬盤來(lái)安裝這個(gè)游戲。與此不同,骨骼動(dòng)畫技術(shù)采用了一種很聰明的方式。首先,建模師完成一個(gè)標(biāo)準(zhǔn)姿勢(shì)的3D模型,通常是雙手沿著肩的方向伸展平放,雙腳打開(kāi)。所有的后繼動(dòng)作將由這個(gè)基礎(chǔ)動(dòng)作演變得到。在完成這個(gè)基準(zhǔn)模型之后,建模師再建一個(gè)骨骼結(jié)構(gòu),一系列相互關(guān)聯(lián)的頂點(diǎn),就像一個(gè)骨架一樣,與人體模型各個(gè)關(guān)節(jié)匹配并且都會(huì)有一定數(shù)量的頂點(diǎn)與之關(guān)聯(lián)。想象一下人和人身上的骨骼就很容易知道我在說(shuō)什么。之后,在我們想要完成的動(dòng)畫序列中,挑選一些關(guān)鍵幀,對(duì)每個(gè)關(guān)鍵幀,將骨骼的位置與關(guān)鍵幀匹配。然后把這一系列的關(guān)鍵幀骨骼保存起來(lái),除了骨骼的位置,同時(shí)保存的還有從基準(zhǔn)位置變換到當(dāng)前關(guān)鍵幀的旋轉(zhuǎn)、平移、縮放或者一個(gè)混合的坐標(biāo)變換矩陣。在我們引擎中,首先根據(jù)當(dāng)前時(shí)間查找這時(shí)候角色是處于哪兩個(gè)關(guān)鍵幀中間。找到之后以時(shí)間為參數(shù)在關(guān)鍵幀的坐標(biāo)變換矩陣之間求插值,用插值結(jié)果來(lái)決定骨骼當(dāng)前的位置。骨骼位置求出來(lái)后,所有和骨骼關(guān)聯(lián)的頂點(diǎn)的坐標(biāo)也可以相應(yīng)求出來(lái)了。通過(guò)使用骨骼動(dòng)畫技術(shù),我們用相對(duì)較少的數(shù)據(jù)就可以播放很平滑的動(dòng)畫!

了解了相關(guān)原理,來(lái)看看如何在directx中播放骨骼動(dòng)畫。我的參考書是《Advanced Animation with DirectX》。

現(xiàn)在我們知道為了播放骨骼動(dòng)畫,需要有骨骼 (bone)的數(shù)據(jù),模型(mesh)的數(shù)據(jù),關(guān)聯(lián)骨骼和模型上每個(gè)頂點(diǎn)的關(guān)聯(lián)數(shù)據(jù),以及關(guān)鍵幀的坐標(biāo)變換數(shù)據(jù)。所有這些數(shù)據(jù)必須以某種形式存在于某個(gè)地方供我們獲取才行。這里要介紹的MS的x文件格式以及從中獲取數(shù)據(jù)的方法。強(qiáng)烈建議大家都來(lái)學(xué)習(xí)一下x文件格式!你會(huì)發(fā)現(xiàn)它即簡(jiǎn)單又強(qiáng)大,即使用來(lái)存放自定義數(shù)據(jù)也是相當(dāng)?shù)姆奖悖坏┱莆罩笪冶WC你會(huì)對(duì)它愛(ài)不釋手。

典型的x文件以數(shù)據(jù)模板和實(shí)際數(shù)據(jù)兩部分組成。數(shù)據(jù)模板類似c++中的結(jié)構(gòu)定義,不過(guò)更為靈活和開(kāi)放。實(shí)際數(shù)據(jù)就是遵守模板定義的數(shù)據(jù)段。

看一個(gè)例子:

template Employee {
  
<3D82AB43-62DA-11cf-AB39-0020AF71E433>  // 每個(gè)模板關(guān)聯(lián)唯一的GUID   
  STRING Name;                                                      // 姓名
  DWORD  Sex;                                                        // 性別 
  [ContactEntry]                                                       // 聯(lián)系方式, 另一個(gè)模板,模板可以嵌套
}

template  ContactEntry {
  
<4C9D055B-C64D-4bfe-A7D9-981F507E45FF>  // GUID
  STRING PhoneNumber;                                         // 電話號(hào)碼
  STRING Address;                                                   // 地址
}

Employee David{
  "David";
  1;
  ContactEntry{
    "100-100000000";
    "far far away";
  }
}

從上面這個(gè)簡(jiǎn)單的例子我們就可以看出x文件的大概模樣了,詳細(xì)的情況大家可以參考《Advanced  Animation with DirectX》。下面我們看如何來(lái)讀取這樣一個(gè)x文件,借助下幾個(gè)對(duì)象:

ID3DXFile                    -- x文件格式文檔對(duì)象。例如Employee.x這樣一個(gè)文件。
ID3DXFileEnumObject -- 用來(lái)枚舉x文檔的頂級(jí)模板數(shù)據(jù)。所謂頂級(jí)模板數(shù)據(jù)是指那些沒(méi)有父模板的數(shù)據(jù),例如上面的David數(shù)據(jù)段。
ID3DXFILEDATA          -- 模板數(shù)據(jù)。上面的David和他的聯(lián)系方式都是ID3DXFILEDATA對(duì)象,自包含。

下面看實(shí)際的分析函數(shù), 下面的代碼適用于DirectX 9.0  SDK Update (October 2004),原書的代碼有點(diǎn)過(guò)時(shí)了...

//-----------------------------------------------------------------------------
// 名稱 : Parse
// 描述 : 分析x文件格式文檔
//-----------------------------------------------------------------------------
bool Parse( char *filename, void **pData )
{
  LPD3DXFILE        lpD3DXFile;
  LPD3DXFILEENUMOBJECT  lpD3DXFileEnumObj;
  LPD3DXFILEDATA             lpD3DXFileData;

  
// 參數(shù)檢查
  if( NULL == filename )
    
return false;

  
// 創(chuàng)建X文件對(duì)象
  HRESULT hr = D3DXFileCreate( &lpD3DXFile );
  
if( FAILED( hr ) )
    
return false;

  
// 注冊(cè)標(biāo)準(zhǔn)模板
  hr = lpD3DXFile->RegisterTemplates( 
            ( LPVOID )D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES );
  
if( FAILED( hr ) )
  {
    Release
<LPD3DXFILE>( lpD3DXFile );
    
return false;
  }

  
// 創(chuàng)建X文件枚舉對(duì)象
  hr = lpD3DXFile->CreateEnumObject( 
           filename, D3DXF_FILELOAD_FROMFILE, 
&lpD3DXFileEnumObj );
  
if( FAILED( hr ) )
  {
     Release
<LPD3DXFILE>( lpD3DXFile );
     
return false;
  }

  
// 解析開(kāi)始
  bool parseResult = BeginParse( pData );
  
iftrue == parseResult )
  {
     
// 查詢頂級(jí)模板數(shù)
     SIZE_T childCount = 0;
     lpD3DXFileEnumObj
->GetChildren( &childCount );

     
// 分析每個(gè)訂級(jí)模板
     for( DWORD i=0; i<childCount; i++ )
     {
       
// 獲取當(dāng)前模板
       hr = lpD3DXFileEnumObj->GetChild( i, &lpD3DXFileData );
       
if( FAILED( hr ) )
         
break;

       
// 分析
       parseResult = ParseObject( lpD3DXFileData, NULL, 0, pData );

       
// 釋放FileData對(duì)象
       Release<LPD3DXFILEDATA>( lpD3DXFileData );

       
// 出現(xiàn)錯(cuò)誤,中斷分析
       iffalse == parseResult )
         
break;
      }

      
// 解析結(jié)束
      if( parseResult ) 
        parseResult 
= EndParse( pData );
  }

  
// 釋放相關(guān)對(duì)象
  Release<LPD3DXFILEENUMOBJECT>( lpD3DXFileEnumObj );
  Release
<LPD3DXFILE>( lpD3DXFile );

  
// 解析結(jié)束
  return parseResult;
}

//-----------------------------------------------------------------------------
// 名稱 : ParseObject
// 描述 : 遞歸解析頂級(jí)模板
//-----------------------------------------------------------------------------
bool ParseObject( 
LPD3DXFILEDATA pDataObj,
LPD3DXFILEDATA pParentDataObj,
DWORD depth,
void **pData )
{
  LPD3DXFILEDATA pSubDataObj;
  
bool parseResult = true;
  HRESULT hr;

  
// 獲取子模板數(shù)目
  DWORD childCount;
  pDataObj
->GetChildren( &childCount );

  
// 遍歷模板并分析
  for( DWORD i=0; i<childCount; i++ )
  {
     
// 取子模板對(duì)象
     hr = pDataObj->GetChild( i, &pSubDataObj );
     
if( FAILED( hr ) )
       
break;

     
// 分析子模板
     parseResult = ParseObject( pSubDataObj, pDataObj, depth+1, pData );

     
// 釋放數(shù)據(jù)對(duì)象
     Release<LPD3DXFILEDATA>( pSubDataObj );

     
// 出現(xiàn)錯(cuò)誤,停止分析
     iffalse == parseResult )
       
break;
  }

  
return parseResult;
}

就那么簡(jiǎn)單,相信大家都看得明白。通過(guò)重載ParseObject方法,我們以判斷當(dāng)前分析的模板類型,然后創(chuàng)建實(shí)際的模板對(duì)象,從文檔中復(fù)制數(shù)據(jù)。有了上面的工具,我們就可以自己來(lái)讀取和解析x格式的骨骼動(dòng)畫文件了。

下面我們就來(lái)看看如何重載 ParseObject方法來(lái)獲得我們感興趣的數(shù)據(jù),不要擔(dān)心,絕對(duì)簡(jiǎn)單。仔細(xì)看代碼,你會(huì)發(fā)現(xiàn)只需要做一件事情,判斷當(dāng)前數(shù)據(jù)段的類型(通過(guò)GUID),分配對(duì)應(yīng)的結(jié)構(gòu)對(duì)象,然后從數(shù)據(jù)段拷貝數(shù)據(jù)(所有SDK自定義模板的GUID都在頭文件rmxfguid.h中定義,  你需要把它加入你的工程中。所有預(yù)定義模板在這里可以找到)。先來(lái)看看如何獲取當(dāng)前數(shù)據(jù)段的GUID,

GUID objGUID;
pDataObj->GetType( &objGUID );

簡(jiǎn)單吧,下面開(kāi)始我們的分析之旅。x動(dòng)畫文件中骨骼是用Frame模板定義的,

template Frame
{
        
< 3D82AB46-62DA-11cf-AB39-0020AF71E433 >
         FrameTransformMatrix frameTransformMatrix;       //  骨骼相對(duì)于父節(jié)點(diǎn)的坐標(biāo)變換矩陣
        Mesh mesh;                                                       // 骨骼的Mesh
}  

只有兩個(gè)字段。FrameTransformMatrix就是一個(gè)matrix。Mesh稍微復(fù)雜,詳細(xì)格式大家自己參考MSDN,我們也會(huì)有專門的代碼來(lái)加載Mesh,現(xiàn)在關(guān)注Frame。為了加載Frame,我們要在程序中定義一個(gè)和Frame模板對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu),SDK中經(jīng)默認(rèn)提供了一個(gè),那就是 D3DXFRAME,
typedef struct _D3DXFRAME
{
    LPSTR                   Name;                            
// 骨骼名稱 
    D3DXMATRIX         TransformationMatrix;        // 相對(duì)與父節(jié)點(diǎn)的坐標(biāo)變換矩陣

    LPD3DXMESHCONTAINER     pMeshContainer;  
// LPD3DXMESHCONTAINER對(duì)象,用來(lái)
                                                                     
// 加載MESH,還有一些附加屬性,見(jiàn)SDK

    
struct _D3DXFRAME       *pFrameSibling;         // 兄弟節(jié)點(diǎn)指針,和下面的子節(jié)點(diǎn)指針
                                                                      
// 一塊作用構(gòu)成骨骼的層次結(jié)構(gòu)。    
    struct _D3DXFRAME       *pFrameFirstChild;      // 子節(jié)點(diǎn)指針.
} D3DXFRAME, *LPD3DXFRAME;

這樣一個(gè)結(jié)構(gòu)已經(jīng)足夠容納Frame模板中的數(shù)據(jù)并形成一個(gè)層次結(jié)構(gòu),不過(guò)為了我們程序的需要,我們還需要其他字段,為此我們通常會(huì)擴(kuò)展D3DXFRAME,
typedef struct _D3DXFRAME_EX : public D3DXFRAME
{
    D3DXMATRIX matCombined; 
// 存儲(chǔ)當(dāng)前節(jié)點(diǎn)相對(duì)于根節(jié)點(diǎn)的位置偏移矩陣,沿著到
                                                
// 到根骨骼的路徑把所有的坐標(biāo)變換矩陣相乘得到。

    D3DXMATRIX matOriginal;         
// 在播放動(dòng)畫的時(shí)候有可能會(huì)改變?cè)瓉?lái)結(jié)構(gòu)中的
                                                
// TransformationMatrix,因此我們聲名一個(gè)新的字段
                                                
// 將原來(lái)的坐標(biāo)變換矩陣保存起來(lái)以便在需要的時(shí)候恢
                                                
// 復(fù)回去。

    ...                                     
// 忽略一些方法定義
}

我知道有些人已經(jīng)按捺不住了,那么動(dòng)手吧,

// 判斷當(dāng)前分析的是不是Frame節(jié)點(diǎn)
if( objGUID == TID_D3DRMFrame )
{
        
// 引用對(duì)象直接返回,不需要做分析。一個(gè)數(shù)據(jù)段實(shí)際定義一次后可以
        
// 被其他模板引用,例如后面的Animation動(dòng)畫模板就會(huì)引用這里的Frame
        
// 節(jié)點(diǎn),標(biāo)識(shí)動(dòng)畫關(guān)聯(lián)的骨骼。
        if( pDataObj->IsReference() )
return true;

        
// 創(chuàng)建D3DXFRAME_EX結(jié)構(gòu),準(zhǔn)備拷貝數(shù)據(jù)
        D3DXFRAME_EX *pFrame = new D3DXFRAME_EX();

        
// 拷貝名稱
        pFrame->Name = GetObjectName( pDataObj );

        
// 注意觀察文件就可以發(fā)現(xiàn)一個(gè)Frame要么是根Frame,父節(jié)點(diǎn)不存在,
        
// 要么作為某個(gè)Frame的下級(jí)Frame而存在。
        if( NULL == pData )
        {
                
//  作為根節(jié)點(diǎn)的兄弟節(jié)點(diǎn)加入鏈表。
                pFrame->pFrameSibling = m_pRootFrame;
                m_pRootFrame 
= pFrame;
                pFrame 
= NULL;

                
// 將自定義數(shù)據(jù)指針指向自己,供子
                 
// 節(jié)點(diǎn)引用。
                pData = ( void** )&m_pRootFrame;
         }
         
else
         {
                
// 作為傳入節(jié)點(diǎn)的子節(jié)點(diǎn)
                D3DXFRAME_EX *pDataFrame = ( D3DXFRAME_EX* )( *pData );
                pFrame
->pFrameSibling = pDataFrame->pFrameFirstChild;
                pDataFrame
->pFrameFirstChild = pFrame;
                pFrame 
= NULL;

                pData 
= ( void** )&pDataFrame->pFrameFirstChild;
          }
}

結(jié)束了!是不是很簡(jiǎn)單,呵呵,記住我們只需要做一件事情,判斷類型,分配匹配的對(duì)象然后拷貝數(shù)據(jù),下面來(lái)分析Frame中的 matrix,

// frame的坐標(biāo)變換矩陣, 因?yàn)閙atrix必然屬于某個(gè)Frame所以pData 必須有效
else if( objGUID == TID_D3DRMFrameTransformMatrix && pData )
{
          
// 我們可以肯定pData指向某個(gè)Frame
          D3DXFRAME_EX *pDataFrame = ( D3DXFRAME_EX* )( *pData );

          
// 先取得緩沖區(qū)大小,應(yīng)該是個(gè)標(biāo)準(zhǔn)的4x4矩陣
          DWORD size = 0;
          LPCVOID buffer 
= NULL;

          hr 
= pDataObj->Lock( &size, &buffer );
          
if( FAILED( hr ) )
return false;

          
// 拷貝數(shù)據(jù)
          if( size == sizeof( D3DXMATRIX ) )
          {
               memcpy( 
&pDataFrame->TransformationMatrix, buffer, size );
               pDataObj
->Unlock();

               pDataFrame
->matOriginal = pDataFrame->TransformationMatrix;
          }
}

這樣大家應(yīng)該對(duì)其他類型的模板數(shù)據(jù)分析代碼都應(yīng)該大致猜的出來(lái)了。具體的代碼我就不在這里提供,只是簡(jiǎn)單的介紹一下它們的作用和關(guān)系,大家可以參考最后附上的工程。

Frame -- 

骨骼。正如大家已經(jīng)看到的那樣,我們可以用pFrameSibling和pFrameFirstChild兩個(gè)字段來(lái)構(gòu)成骨骼的層次結(jié)構(gòu)。骨骼模板包含了當(dāng)前骨骼相對(duì)父骨骼的坐標(biāo)變換矩陣和骨骼對(duì)應(yīng)的模型

Mesh  -- 

模型。角色的頂點(diǎn)數(shù)據(jù),包含vertex buffer, index  buffer等。我們可以直接用普通的ID3DXMesh來(lái)加載其中的數(shù)據(jù)。除此之外,Mesh中還包含了SkinWeight模板。

SkinWeight --

骨骼關(guān)聯(lián)的頂點(diǎn)已經(jīng)該骨骼的坐標(biāo)變換對(duì)該頂點(diǎn)的權(quán)重。實(shí)際中我們并不需要特殊處理這類模板數(shù)據(jù),ID3DXMesh已經(jīng)包含了對(duì)應(yīng)的代碼。

AnimationSet --

動(dòng)畫集合。例如角色的各種動(dòng)作“Kill”,“Jump”等等,包含多個(gè)Animation。

Animation --

動(dòng)畫。由對(duì)應(yīng)骨骼的名稱和一組AnimationKey組成。

AnimationKey --

動(dòng)畫鍵。包含一組時(shí)間戳以及在對(duì)應(yīng)時(shí)間戳應(yīng)用到骨骼上的平移、縮放、旋轉(zhuǎn)向量或者復(fù)合的坐標(biāo)變換矩陣。

以上就是我們需要了解的全部了。至此,所有原料都已經(jīng)準(zhǔn)備齊全,各位大廚們下一步要做的就是骨骼動(dòng)畫這道小菜啦!

posted on 2007-05-24 00:03 lovedday 閱讀(5213) 評(píng)論(8)  編輯 收藏 引用 所屬分類: ■ DirectX 9 Program

評(píng)論

# re: 【ZT】D3D中的骨骼動(dòng)畫 2007-07-23 18:12 creator

你好,
我是剛剛開(kāi)始學(xué)習(xí)directx 9的,現(xiàn)在學(xué)到骨骼動(dòng)畫卡住了。急需一份up-to-date的源代碼拿來(lái)研究研究。很多書上的代碼都是很陳舊的了。
樓主文中說(shuō)有附工程的,但是我找不到。如果可以的話,希望博主能夠幫忙發(fā)一份給我,我的郵件地址是
zhaojianyin2000@hotmail.com 感激不盡!!  回復(fù)  更多評(píng)論   

# re: 【ZT】D3D中的骨骼動(dòng)畫 2007-07-23 18:16 lovedday

這篇文章是轉(zhuǎn)載的,我也沒(méi)有源碼。  回復(fù)  更多評(píng)論   

# re: 【ZT】D3D中的骨骼動(dòng)畫 2007-07-23 18:20 lovedday

這是作者的郵箱:qlwuu@hotmail.com,你可以給他發(fā)郵件。  回復(fù)  更多評(píng)論   

# re: 【ZT】D3D中的骨骼動(dòng)畫 2007-07-23 19:00 creator

謝謝博主! 文章最前面的ZT是不是就是轉(zhuǎn)貼的意思啊,我一時(shí)沒(méi)有明白過(guò)來(lái),呵呵。
我看了你很多的文章,都寫得不錯(cuò)。讓我受益匪淺阿!我會(huì)一直關(guān)注你的博客的,呵呵!  回復(fù)  更多評(píng)論   

# re: 【ZT】D3D中的骨骼動(dòng)畫 2007-07-23 19:13 lovedday

謝謝,我會(huì)再接再厲,努力提高自己的水平,爭(zhēng)取以后寫些對(duì)大家有幫助的東西。  回復(fù)  更多評(píng)論   

# re: 【ZT】D3D中的骨骼動(dòng)畫 2008-01-29 20:39 吸佳佳

感激博主對(duì)廣大正在學(xué)習(xí)3D游戲編程的朋友提供這么生動(dòng)、易讀的文章。
希望多多分享您的經(jīng)驗(yàn)給我們學(xué)習(xí),太感謝了!  回復(fù)  更多評(píng)論   

# re: 【ZT】D3D中的骨骼動(dòng)畫 2009-12-09 12:14 laiyi

Good  回復(fù)  更多評(píng)論   

# re: 【ZT】D3D中的骨骼動(dòng)畫[未登錄](méi) 2011-10-13 21:29 nickolas

好文章,深入淺出  回復(fù)  更多評(píng)論   

公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区三区视频在线观看| 国产精品乱码久久久久久| 亚洲国产视频直播| 久久精品一本| 久久久久国产免费免费| 亚洲一区二区三区激情| 99视频精品全部免费在线| 一本色道久久综合亚洲精品婷婷| 久久成人人人人精品欧| 国产精品成人v| 西瓜成人精品人成网站| 久久综合中文字幕| 99国产精品视频免费观看一公开 | 一本色道久久综合亚洲精品婷婷| 精品成人国产在线观看男人呻吟| 亚洲卡通欧美制服中文| 久久国产精品久久久| 一区二区av| 一区二区三区日韩精品| 西西裸体人体做爰大胆久久久| 精品动漫av| 美日韩精品免费| 美女网站久久| 一本久久综合亚洲鲁鲁| 欧美国产精品日韩| 先锋影音国产精品| 欧美激情精品久久久久久蜜臀| 在线视频欧美精品| 影音先锋成人资源站| 狠狠狠色丁香婷婷综合久久五月| 欧美激情第三页| 在线视频精品一区| 欧美视频日韩视频在线观看| 久久久精品免费视频| 欧美国产精品中文字幕| 欧美日韩久久精品| 国产一在线精品一区在线观看| 黄色亚洲精品| 一区二区高清视频| 老司机免费视频久久| 一本久久a久久免费精品不卡| 午夜精品在线视频| 国产精品九九| 亚洲一区二区影院| 欧美成人精品影院| 亚洲日本电影| 久久亚洲高清| 国产精品人人爽人人做我的可爱| 亚洲在线观看视频| 久久久久国产成人精品亚洲午夜| 国产精品久久久久久久一区探花| 欧美色欧美亚洲高清在线视频| 亚洲二区在线视频| 午夜精品剧场| 99精品视频一区二区三区| 国产精品福利久久久| 久久九九国产精品| 一区二区三区国产盗摄| 欧美不卡福利| 久久艳片www.17c.com| 久久只精品国产| 国产一区二区久久精品| 一本到12不卡视频在线dvd| 欧美成人高清视频| 欧美成人精品| 午夜激情综合网| 欧美 日韩 国产一区二区在线视频 | 久久久久久久久久久成人| 欧美精品在线免费播放| 夜夜嗨av色一区二区不卡| 91久久夜色精品国产九色| 麻豆freexxxx性91精品| 国产一区二区中文字幕免费看| 欧美好吊妞视频| 欧美亚洲一区三区| 亚洲成人直播| 亚洲欧美精品在线观看| 欧美有码视频| 久久资源在线| 亚洲欧洲三级| 亚洲国产精品女人久久久| 欧美一区2区三区4区公司二百| 欧美国产第二页| 一区二区精品在线| 亚洲性线免费观看视频成熟| 国产欧美日韩一区二区三区在线 | 夜夜狂射影院欧美极品| 99re这里只有精品6| 国产精品xxxxx| 久久精品视频网| 久久先锋资源| 99亚洲伊人久久精品影院红桃| 亚洲国产精品成人综合色在线婷婷| 欧美劲爆第一页| 久久精品亚洲国产奇米99| 快she精品国产999| 亚洲手机在线| 久久天天躁夜夜躁狠狠躁2022| 日韩亚洲不卡在线| 欧美中文在线视频| 亚洲特黄一级片| 两个人的视频www国产精品| 亚洲永久免费精品| 免费成人激情视频| 久久精品成人| 国产精品久久久久久久久久久久久久 | 国产精品视频午夜| 免费在线看一区| 欧美午夜精品久久久久久孕妇| 久久亚洲不卡| 国产精品一级| 亚洲巨乳在线| 在线精品国产成人综合| 亚洲小视频在线| 亚洲伦理自拍| 久久久久久夜| 久久欧美中文字幕| 国产精品欧美日韩一区| 亚洲欧洲精品天堂一级| 极品少妇一区二区三区精品视频| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 亚洲国产成人在线| 亚洲欧美在线视频观看| 亚洲视频日本| 欧美日本在线观看| 亚洲福利电影| 在线看国产一区| 欧美中文字幕视频| 久久se精品一区精品二区| 国产精品免费观看视频| 夜夜嗨av一区二区三区网站四季av| 在线日韩精品视频| 欧美在线在线| 久久蜜桃香蕉精品一区二区三区| 国产精品免费福利| 亚洲自拍都市欧美小说| 亚洲激情网站免费观看| 国产精品老牛| 欧美日韩三级在线| 欧美成人精品在线观看| 久久久.com| 鲁鲁狠狠狠7777一区二区| 久久黄色级2电影| 久久免费视频网站| 欧美11—12娇小xxxx| 久久久福利视频| 美女脱光内衣内裤视频久久影院| 久久久久免费| 欧美激情久久久久| 国产区精品视频| 国产一区在线看| 亚洲久久在线| 欧美一级播放| 免费亚洲一区| 国产精品黄视频| 国产精品亚洲综合一区在线观看| 依依成人综合视频| 亚洲精品自在久久| 农夫在线精品视频免费观看| 久久综合中文| 中日韩美女免费视频网址在线观看 | 国产精品三级久久久久久电影| 欧美视频免费| 黄色一区二区三区| 一区二区精品在线| 亚洲一二三四久久| 亚洲日韩欧美视频一区| 亚洲精品1区| 欧美日韩在线看| 欧美一级欧美一级在线播放| 欧美大片在线看| 亚洲一区bb| 在线成人www免费观看视频| 欧美国产在线视频| 亚洲综合第一| 亚洲丶国产丶欧美一区二区三区| 亚洲视频在线播放| 亚洲第一级黄色片| 国产精品你懂的| 欧美寡妇偷汉性猛交| 亚洲在线网站| 亚洲精品中文字幕有码专区| 久久久久久网站| 亚洲一区二区三区影院| 亚洲国产日韩欧美综合久久 | 国产欧美日韩专区发布| 美女精品在线| 欧美在线观看网站| 亚洲最新视频在线| 欧美福利视频在线| 久久精品视频在线播放| 99国产精品久久久久久久久久| 国产日韩精品电影| 欧美性大战久久久久久久蜜臀| 久久精品成人| 香蕉av福利精品导航| 一区二区三区免费在线观看| 亚洲国产婷婷香蕉久久久久久99| 久久久水蜜桃| 久久精品2019中文字幕|