• <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)  編輯 收藏 引用 所屬分類: 圖形學

            亚洲国产精品无码久久久秋霞2| yy6080久久| 2020久久精品国产免费| 亚洲国产精品久久久久久| 久久99精品久久久久久水蜜桃| 亚洲精品综合久久| 人妻无码久久一区二区三区免费| 国产精品99久久精品| 久久婷婷人人澡人人| 99久久久国产精品免费无卡顿| 国产成人无码精品久久久免费| 精品人妻伦九区久久AAA片69| 色综合久久最新中文字幕| 国产精品99久久久久久宅男小说| 国产一级做a爰片久久毛片| 久久天天婷婷五月俺也去| 94久久国产乱子伦精品免费| 亚洲国产精品成人久久| 欧美一级久久久久久久大片| 丁香五月网久久综合| 亚洲午夜久久久久久噜噜噜| 久久免费香蕉视频| 91麻豆精品国产91久久久久久| 欧洲人妻丰满av无码久久不卡| 天天综合久久一二三区| 久久久久久亚洲精品无码| 国内精品久久久久| 久久国产精品77777| 日本欧美久久久久免费播放网| 久久亚洲精品国产精品婷婷| 久久亚洲电影| 久久伊人色| 亚洲国产视频久久| 日韩精品久久久久久久电影| 久久国产成人午夜aⅴ影院| 99久久精品九九亚洲精品| 久久综合欧美成人| 品成人欧美大片久久国产欧美...| AV色综合久久天堂AV色综合在| 国产精品久久精品| 色噜噜狠狠先锋影音久久|