ogre有乙個rayscenequery的類,在預設場景管理器下,這個類返回一組rayscenequeryresultentry,他們都是通過包圍盒進行的檢測,由於包圍盒過於簡陋,我們可以再進行更精細的基於面的射線碰撞檢測。
主要注意的就是mesh的構造方式,是否用了index,index是16位還是32位,其他的沒什麼了,射線到三角的檢測函式取自dx例子,ogre自己也提供了,不過我感覺不太好用。
另外,mesh的頂點格式還要注意,position不一定獨享其所在的source段,可能包含其它資訊比如頂點色。所以我們必須計算乙個偏移量。
廢話少說,看**。
bool intersectmesh( const ogre::ray &ray, const entity *pentity, int *subentityindex, vector3 *intersect********a, vector3 *intersect********b, vector3 *intersect********c, float *t, float *u, float *v )
}if ( ipositonindex == -1 ) //can't find position buffer
return false;
//read vertex buffer
ogre::vertexbufferbinding::vertexbufferbindingmap::iterator vbbm_interator = ghm_vbbm.find( ipositonindex );
size_t vertexbuffersize = vbbm_interator->second->getnumvertices() * vbbm_interator->second->getvertexsize(); //buffer size
byte *vertexbuffer = new byte[vertexbuffersize]; //build vertex buffer
vbbm_interator->second->readdata( 0, vertexbuffersize, vertexbuffer );
//float *fvertexbuffer = (float*)vertexbuffer;
size_t positionelementoffset = vbbm_interator->second->getvertexsize() - 12; //得到頂點之外的位元組數
//check index
ogre::renderoperation rosub;
psubmesh->_getrenderoperation( rosub );
if ( rosub.useindexes ) //使用index
if ( intersect********a && intersect********b && intersect********c )
return true;}}
}}return false;
}
在ogre中進行精細射線檢測
ogre有乙個rayscenequery的類,在預設場景管理器下,這個類返回一組rayscenequeryresultentry,他們都是通過包圍盒進行的檢測,由於包圍盒過於簡陋,我們可以再進行更精細的基於面的射線碰撞檢測。主要注意的就是mesh的構造方式,是否用了index,index是16位還是...
建立射線進行檢測
上圖是我建立好的乙個函式,呼叫函式的時候會提供乙個射線的起點和終點。我們現在就開始對linetracebychannel這個節點進行介紹。在這裡,我只對一下我們經常能用到的引數 進行說明。這個節點的功能是產生一條射線。首先,我們應該給這一條射線乙個起點乙個終點。其實嚴格來說這是一條線段,有兩個端點的...
在VBA中進行除錯
只要從您的專案中觸發 vba就會執行。從簡單的開啟表單到單擊命令按鈕,各種各樣的物件事件都可能引起這種情況。當某些事情無法按預期工作時,您如何才能準確確定出什麼問題以及在 好吧,這就是本文可以為您提供的幫助。對於每個office應用程式,當然包括access,都有乙個整合的偵錯程式。要開啟偵錯程式視...