天龍八部裡面人物和地面物體的表面的碰撞時用WCollision來做的
比如橋之類,不屬於地表,屬於物體,沒法用地形的高度檢測,但是人要過去,就做了一層透明的碰撞表面蓋在上面
我用黑色材質標識了出來,:
至於wcollision二進位檔案的資料格式也很簡單:
前8個位元組不重要,應該是版本號碼和三角形總數吧,貌似總數不太對
接下來的資料就是WCollision的資料區塊
資料區塊的前8個位元組是地圖行列座標,貌似沒什麼用,接下來的4個位元組很重要,是這個資料區塊的三角形數量
他決定這個資料區塊的size
按資料區塊讀取就好
直接給出我的源碼:
void TLBBTerrain::openWCollisionFile(const String &fileName , const String &groupName)<br />{<br />DataStreamPtr stream = ResourceGroupManager::getSingleton().openResource(fileName , groupName);<br />if(stream.isNull())<br />{<br />OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "開啟WCollision檔案失敗:"+fileName, "Terrain::openWCollisionFile");<br />return ;<br />}<br />WCollisionHeader header;<br />// 讀取檔案頭, 8個位元組的結構<br />stream->read(&header , sizeof(header));</p><p>Vector3 vec3 = Vector3::ZERO;<br />int number = 0;<br />while(!stream->eof()){<br />stream->skip(8);// 跳過資料區塊行列座標,暫時沒發現什麼用<br />stream->read(&number, sizeof(number)); // 資料區塊的三角形數量</p><p>// 讀取此資料區塊的三角形頂點資料<br />for (int i = 0; i < number * 3; ++ i)<br />{<br />stream->read(&vec3, sizeof(vec3));<br />mWCollisionData.push_back(vec3);<br />}<br />}<br />}