• <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>

            Code Knight

            Programming is so cool
            隨筆 - 52, 文章 - 0, 評(píng)論 - 14, 引用 - 0
            數(shù)據(jù)加載中……

            昏頭!被Intersect折騰了半天!

                      D3D中的PICK例程中有這樣的一個(gè)檢測(cè)函數(shù),檢測(cè)拾取,具體原理網(wǎng)上有很多,自己改了一下,卻掉了兩個(gè)重要的東西,不過還不是很明白是怎么一回事!修改我射線起始點(diǎn)的坐標(biāo)有何用呢?
                     
              1 BOOL IntersectTest(LPDIRECT3DVERTEXBUFFER9 pVB,
              2                    LPDIRECT3DINDEXBUFFER9 pIB,
              3                    int nStride,
              4                    int dwNumFaces,
              5                    D3DXVECTOR3* vPickRayOrig,
              6                    D3DXVECTOR3* vPickRay,
              7                    D3DXVECTOR3 *pVRet,
              8                    DWORD dwFlag=0// 主要檢測(cè)與地形相交 // 此函數(shù)相當(dāng)耗費(fèi)CPU// 生成地形有13W個(gè)面,逐一檢查是否相交
              9 {
             10     WORD*        pIndices;
             11     BYTE*        pVertices;
             12     D3DINDEXBUFFER_DESC IB_Desc;
             13 
             14     FLOAT fBary1, fBary2,fDist=1e+32f;
             15 
             16     FLOAT t_fBary1, t_fBary2,t_fDist;
             17     DWORD dwFace=-1;
             18     DWORD  dwUpperLower;    
             19 
             20     D3DXVECTOR3* pV[3];
             21     ULONG  n;
             22 
             23     pIB->GetDesc(&IB_Desc); 
             24     pIB->Lock( 00, (void**)&pIndices, 0 );
             25     pVB->Lock( 00, (void**)&pVertices,0 );
             26 
             27 
             28     for( DWORD i=0; i<dwNumFaces; i++ )
             29     {
             30         for(int j=0;j<3;j++)
             31         {
             32             if(IB_Desc.Format==D3DFMT_INDEX16)            
             33                 n=(WORD)pIndices[3*i+j];
             34             else if(IB_Desc.Format==D3DFMT_INDEX32)        
             35                 n=*(DWORD*)&pIndices[2*(3*i+j)];
             36             else 
             37                 return FALSE;
             38             pV[j]=(D3DXVECTOR3*)(pVertices+nStride*n); 
             39         }
             40 
             41         dwUpperLower=0;
             42 
             43          if(dwFlag) // 這段是必須要的,具體是怎么做到的?
             44          {
             45              if(dwFlag & INTERSECT_NEGATIVEY) 
             46              {
             47                 for(int j=0;j<3;j++)
             48                 {
             49                     dwUpperLower|=vPickRayOrig->x>pV[j]->x? 0x0010:0x0001
             50                     dwUpperLower|=vPickRayOrig->z>pV[j]->z? 0x1000:0x0100
             51 
             52                 }
             53                 if(dwUpperLower!=0x1111continue;        
             54             }
             55             else if(dwFlag & INTERSECT_HORIZENTAL) 
             56             {
             57                 for(int j=0;j<3;j++)
             58                 {
             59                     dwUpperLower|=(vPickRayOrig->> pV[j]->y)? 0x0010:0x0001;
             60                 }
             61 
             62                 if(dwUpperLower!=0x0011continue;    
             63             }
             64 
             65 
             66         }
             67 
             68 
             69 
             70         // 檢測(cè)是否穿過三角形
             71         if( IntersectTriangle( *vPickRayOrig, *vPickRay, *pV[0], *pV[1], *pV[2],
             72             &t_fDist, &t_fBary1, &t_fBary2 ) )
             73         {
             74             if(    t_fDist < fDist )    //是否返回最近的一個(gè)點(diǎn)
             75             {
             76                 dwFace = i;
             77                 fBary1 = t_fBary1;
             78                 fBary2 = t_fBary2;
             79                 fDist  = t_fDist;
             80             }
             81         }
             82     }
             83     
             84 
             85     if(dwFace<dwNumFaces && dwFace>=0 )
             86     {
             87 
             88         for(int j=0;j<3;j++)
             89         {
             90             if(IB_Desc.Format==D3DFMT_INDEX16)            
             91                 n=(WORD)pIndices[3*dwFace +j];
             92             else if(IB_Desc.Format==D3DFMT_INDEX32)        
             93                 n=*(DWORD*)&pIndices[2*(3*dwFace+j)];
             94             else 
             95                 return FALSE;
             96             pV[j]=(D3DXVECTOR3*)(pVertices+nStride*n);
             97         }
             98         *pVRet=*pV[0+fBary1*(*pV[1]-*pV[0])+fBary2*(*pV[2]-*pV[0]);  
             99 
            100 
            101         pVB->Unlock();
            102         pIB->Unlock();
            103         return 1;
            104     }
            105 
            106 
            107     pVB->Unlock();
            108     pIB->Unlock();
            109 
            110 
            111 
            112     return 0;
            113 }
            另一個(gè)問題,大規(guī)模的地形一般如何最大程度的優(yōu)化避免對(duì)所有的面進(jìn)行檢測(cè)?用LOD么?

            posted on 2009-02-11 17:41 Code Knight 閱讀(384) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 圖形學(xué)

            久久久久人妻一区精品性色av| 久久久久国产一区二区三区| 婷婷久久香蕉五月综合加勒比| 日本欧美久久久久免费播放网| 91精品国产91久久久久久青草| 日本久久中文字幕| 国产亚洲精品美女久久久| 激情五月综合综合久久69| 亚洲AV日韩精品久久久久久 | 久久亚洲私人国产精品vA| 久久精品一区二区| 亚洲国产精品无码久久久蜜芽| 狠狠色综合网站久久久久久久| 久久人爽人人爽人人片AV| 手机看片久久高清国产日韩| 久久久精品免费国产四虎| 亚洲AV无码久久精品狠狠爱浪潮| 久久国产视屏| 88久久精品无码一区二区毛片| 无码国内精品久久人妻| 色综合久久夜色精品国产| 精品国产青草久久久久福利| 国产欧美久久久精品| 99久久无色码中文字幕| 狼狼综合久久久久综合网| 久久天天躁狠狠躁夜夜avapp | 精品久久无码中文字幕| 无码国产69精品久久久久网站| 国产美女亚洲精品久久久综合| 久久久久九国产精品| 日韩久久无码免费毛片软件| 久久天天日天天操综合伊人av| 狠狠久久综合伊人不卡| 久久se这里只有精品| 久久www免费人成看国产片| 国产精品亚洲综合专区片高清久久久 | 久久人爽人人爽人人片AV| 久久人人爽人人爽人人片AV不| 久久无码人妻一区二区三区午夜| 色婷婷综合久久久久中文一区二区| 性欧美丰满熟妇XXXX性久久久|