IRRLICHT的實現:
1.波浪是如何實現的?
先對每個點計算高度,
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);
}
然后再計算法線,
recalculateNormals(Mesh);
2.ATMOSphere
太陽嘛,就是個跟隨時間移動的BILLBOARD,邊緣最好加上霧化效果。
3.地形編輯器代碼
if( Terrain && !RightMouseDown && Terrain->getTriangleSelector() )
{
LastMousePosition.set( Device->getCursorControl()->getPosition().X, Device-> getCursorControl()->getPosition().Y );
//計算從鼠標位置到觀察點的射線
core::line3df line = CollisionMgr->getRayFromScreenCoordinates(
core::position2d<s32>( LastMousePosition.X, LastMousePosition.Y ) );
//計算以交點為中心,一定半徑范圍內的點
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;
}
}
