• <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è)檢測函數(shù),檢測拾取,具體原理網(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// 主要檢測與地形相交 // 此函數(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         // 檢測是否穿過三角形
             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)行檢測?用LOD么?

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

            中文字幕一区二区三区久久网站| 久久久久久精品免费看SSS| 精品国产青草久久久久福利| 国产精品内射久久久久欢欢| 久久久精品2019免费观看| 一本色道久久99一综合| 久久乐国产综合亚洲精品| 一本一道久久a久久精品综合| 久久综合精品国产一区二区三区| 久久综合九色综合欧美就去吻| 四虎影视久久久免费观看| 一本一道久久a久久精品综合 | 久久久久久毛片免费看| 久久无码一区二区三区少妇| 香蕉久久夜色精品国产尤物| 色婷婷久久综合中文久久蜜桃av| 久久久久亚洲AV无码网站| 久久综合狠狠综合久久激情 | 久久精品无码一区二区三区免费| 亚洲欧洲久久av| 久久久国产乱子伦精品作者| 久久精品国产影库免费看| 国产精品青草久久久久福利99| 亚洲精品乱码久久久久久不卡| 97精品依人久久久大香线蕉97| 久久国产乱子伦精品免费强| 久久99精品久久久久久齐齐 | 久久久精品波多野结衣| 波多野结衣久久精品| 久久人爽人人爽人人片AV | 精品国产99久久久久久麻豆| 国产一区二区精品久久| 久久国内免费视频| 精品久久久久久久| 久久WWW免费人成一看片| 亚洲午夜精品久久久久久人妖| 久久天天婷婷五月俺也去 | 99久久夜色精品国产网站| 日本欧美国产精品第一页久久| 久久久久亚洲AV片无码下载蜜桃| 色婷婷久久综合中文久久一本|