IRRLICHT的實(shí)現(xiàn):
1.波浪是如何實(shí)現(xiàn)的?
先對(duì)每個(gè)點(diǎn)計(jì)算高度,
void addWave(vector3df& dest, const vector3df source, f32 time)
{
dest.Y = source.Y +
(sinf(((source.X/WaveLength) + time)) * WaveHeight) +
(cosf(((source.Z/WaveLength) + time)) * WaveHeight);
}
然后再計(jì)算法線,
recalculateNormals(Mesh);
2.ATMOSphere
太陽(yáng)嘛,就是個(gè)跟隨時(shí)間移動(dòng)的BILLBOARD,邊緣最好加上霧化效果。
3.地形編輯器代碼
if( Terrain && !RightMouseDown && Terrain->getTriangleSelector() )
{
LastMousePosition.set( Device->getCursorControl()->getPosition().X, Device-> getCursorControl()->getPosition().Y );
//計(jì)算從鼠標(biāo)位置到觀察點(diǎn)的射線
core::line3df line = CollisionMgr->getRayFromScreenCoordinates(
core::position2d<s32>( LastMousePosition.X, LastMousePosition.Y ) );
//計(jì)算以交點(diǎn)為中心,一定半徑范圍內(nèi)的點(diǎn)
core::vector3df spherePosition;
if( CollisionMgr->getClosestVertex( line, Terrain->getTriangleSelector(),
spherePosition, CurrentVertexIndex ) )
{
LeftMouseDown = true;

// Get all vertices with the circle
SelectedTerrainVertices.clear();
core::vector3df intersection;
scene::SCollisionTriangle tri;
if( CollisionMgr->getCollisionPoint( line, Terrain->getTriangleSelector(), intersection, tri ) )
{
u32 count = 0;
SelectedTerrainVertices.reallocate( Terrain->getTriangleSelector()->getTriangleCount() );
Terrain->getTriangleSelector()->getVerticesInRadius( SelectedTerrainVertices.pointer(), Terrain->getTriangleSelector()->getTriangleCount(), count, intersection, RedCircleRadius );
SelectedTerrainVertices.set_used( count );
}

return true;
}
}
