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

            无夜精品久久久久久| 久久亚洲欧洲国产综合| 久久美女网站免费| 久久本道久久综合伊人| 一本综合久久国产二区| 国产综合久久久久| 伊人久久大香线蕉精品不卡| 午夜精品久久久久久99热| 久久99久久无码毛片一区二区| 伊人久久大香线蕉av不变影院| 久久国产精品久久国产精品| 波多野结衣久久一区二区| 久久se精品一区二区| 国产亚洲精品久久久久秋霞| 91久久成人免费| 成人免费网站久久久| 国产成人精品综合久久久久| 久久久久久青草大香综合精品| 久久国产精品无码HDAV| 99久久香蕉国产线看观香| 久久99国产精品成人欧美| 久久精品国产福利国产秒| 欧洲人妻丰满av无码久久不卡| 亚洲?V乱码久久精品蜜桃| 狠狠久久综合伊人不卡| 香蕉久久一区二区不卡无毒影院 | 久久人做人爽一区二区三区| 久久综合九色综合精品| 久久精品亚洲中文字幕无码麻豆| 中文字幕精品久久久久人妻| 久久久久国产成人精品亚洲午夜| 久久久久国产精品| 婷婷久久综合九色综合98| 久久99热国产这有精品| 久久精品国产久精国产| 久久久精品一区二区三区| 国产精品内射久久久久欢欢 | 99久久婷婷国产综合精品草原| 99久久免费国产精精品| 秋霞久久国产精品电影院| 91精品国产高清久久久久久91|