在ogre中進行精細射線檢測

2021-05-22 01:53:20 字數 1500 閱讀 1995

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,都有乙個整合的偵錯程式。要開啟偵錯程式視...