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,但是微軟...