• <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, 評論 - 14, 引用 - 0
            數據加載中……

            昏頭!被Intersect折騰了半天!

                      D3D中的PICK例程中有這樣的一個檢測函數,檢測拾取,具體原理網上有很多,自己改了一下,卻掉了兩個重要的東西,不過還不是很明白是怎么一回事!修改我射線起始點的坐標有何用呢?
                     
              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// 主要檢測與地形相交 // 此函數相當耗費CPU// 生成地形有13W個面,逐一檢查是否相交
              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 )    //是否返回最近的一個點
             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 }
            另一個問題,大規模的地形一般如何最大程度的優化避免對所有的面進行檢測?用LOD么?

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

            午夜精品久久久久成人| 日本免费一区二区久久人人澡| 国产人久久人人人人爽| 久久香蕉一级毛片| 久久精品亚洲福利| 精品久久无码中文字幕| 一本伊大人香蕉久久网手机| 人妻系列无码专区久久五月天| 2021国内久久精品| 国产精品永久久久久久久久久| 婷婷久久综合| 精品久久无码中文字幕| 欧美久久一级内射wwwwww.| 少妇久久久久久被弄高潮| 亚洲人AV永久一区二区三区久久| 精品久久久久久无码专区| 久久久久国产日韩精品网站| 波多野结衣中文字幕久久| 无码人妻少妇久久中文字幕| 欧美激情精品久久久久| 亚洲国产另类久久久精品黑人| 午夜不卡888久久| 久久99热只有频精品8| 性做久久久久久免费观看| 色综合久久最新中文字幕| 精品久久人人爽天天玩人人妻| 色综合合久久天天给综看| 久久国产一区二区| 久久九九久精品国产| 精品国产福利久久久| 久久久久久九九99精品| 精品国产福利久久久| 亚洲色婷婷综合久久| 久久免费小视频| 7777久久亚洲中文字幕| 久久精品一区二区三区中文字幕| 久久久亚洲欧洲日产国码aⅴ| 伊人久久大香线焦AV综合影院 | 久久综合亚洲欧美成人| 久久久久久久人妻无码中文字幕爆 | 国产精品日韩深夜福利久久|