D3D 滑鼠拾取技術

2021-05-01 15:46:35 字數 2407 閱讀 9747

d3d 滑鼠拾取技術對用directx編寫網路遊戲的愛好者,尤其是初學者來說是一項非常重要的藥掌握的技術。開始學寫遊戲時,它總是困擾著初學者...

我這會兒剛完成了,寫點心得

新手分享

就說說思想,畢竟,有了思想,技術上很好實現...

首先呢,我們可以通過獲得視窗上滑鼠的然後呢,將它轉化到世界矩陣裡...

呵呵,這點,對初學者來說還是有點麻煩滴

//計算拾取射線相關變數宣告

point        ptcursor;  //滑鼠位置

d3dxmatrix   matworld, matview, pmatproj, m;

d3dxvector3  vpickrayorig, vpickraydir;

int          iwidth, iheight;

//獲取後台緩衝區的寬度和高度

iwidth = dxutgetbackbuffersu***cedesc()->width;

iheight = dxutgetbackbuffersu***cedesc()->height;

//獲取當前滑鼠在視窗客戶區中的位置

getcursorpos( &ptcursor );

screentoclient( dxutgethwnd(), &ptcursor );

//獲取當前裝置的變換矩陣

pd3ddevice->gettransform( d3dts_world, &matworld );

pd3ddevice->gettransform( d3dts_view, &matview );

pd3ddevice->gettransform( d3dts_projection, &pmatproj );

//計算世界觀察矩陣的逆矩陣matworld

d3dxmatrix mworldview =  pmesh->m_pmatworld* matview;

d3dxmatrixinverse( &m, null, &mworldview );

//計算拾取射線的方向與原點

d3dxvector3 vtemp;

vtemp.x =  ((( 2.0f * ptcursor.x ) / iwidth  ) - 1 ) / pmatproj._11;

vtemp.y = -((( 2.0f * ptcursor.y ) / iheight ) - 1 ) / pmatproj._22;

vtemp.z =  1.0f;

vpickraydir.x  = vtemp.x*m._11 + vtemp.y*m._21 + vtemp.z*m._31;

vpickraydir.y  = vtemp.x*m._12 + vtemp.y*m._22 + vtemp.z*m._32;

vpickraydir.z  = vtemp.x*m._13 + vtemp.y*m._23 + vtemp.z*m._33;

vpickrayorig.x = m._41;

vpickrayorig.y = m._42;

vpickrayorig.z = m._43;

這是我程式中用到的部分**,以供參考...

然後呢,用這個函式

hresultd3dxintersect(lpd3dxbasemeshpmesh,const d3dxvector3 *praypos,const d3dxvector3 *praydir,bool *phit,dword *pfaceindex,float *pu,float *pv,float *pdist,lpd3dxbuffer *ppallhits,dword *pcountofhits);
bhit 的值可以讓我知道有沒有點選到模型
然後呢,用相似的方法,求的這個線向量跟你想要的平面求交點
把它給你的模型,當它的座標就一切ok了

3D物件滑鼠畫素拾取解決方案

標題的功能是公司以前專案中的新加的功能,之前的滑鼠物體拾取是通過cpu計算射線和物體aabb相交來判斷,但這種方式存在很大弊端,如果物體成長條形,那麼在某些角度下aabb就比物體大的多,再者像一些鏤空很多的物體,如蜘蛛 柵欄等,會遮擋後面物體的拾取,要能夠精確的判斷的話,就需要做射線和模型三角網格的...

D3D滑鼠輸入處理

include include include pragma comment lib,dxguid.lib pragma comment lib,dinput8.lib pragma comment lib,odbc32.lib pragma comment lib,odbccp32.lib 定義全...

D3D基本框架 即D3D標頭檔案分類

了dxut的結構 後,發現微軟程式設計師的編碼風格太深奧了。各種巨集定義 預編譯跳得頭暈,由於對於window api的不精通,導致寫出符合dxut風格的框架以現在的水平來看是不可能的。既然沒有弄通dxut,我也暫時不想套用了,那麼還是先自己用自己的框架來寫把。框架如下 雖然沒學會dxut,但是微軟...