这种方法当观察点距离贴花远的时候,出现穿插,这是因为LOD技术造成的,而且在鼠标跟随或者其他动态贴花中不适用,计算量太大 ,得找个替代方法
createTerrainDecal("Ogre/Eyes");
setTerrainDecal(613, 933, 64);
void
BasisManager::createTerrainDecal(
char
*
szMaterialName)
{
mTerrainDecal = new Ogre::ManualObject( " decal " );
mSceneMgr -> getRootSceneNode() -> createChildSceneNode() -> attachObject(mTerrainDecal);
mTerrainDecal -> setCastShadows( false );
int x_size = 1 ;
int z_size = 1 ;
mTerrainDecal -> begin(szMaterialName, Ogre::RenderOperation::OT_TRIANGLE_LIST);
for ( int i = 0 ; i < x_size; i ++ )
{
for ( int j = 0 ; j <= z_size; j ++ )
{
mTerrainDecal -> position(Ogre::Vector3(i, 0 , j));
mTerrainDecal -> textureCoord(( float )i / ( float )x_size, ( float )j / ( float )z_size);
}
}
for ( int i = 0 ; i < x_size; i ++ )
{
for ( int j = 0 ; j < z_size; j ++ )
{
mTerrainDecal -> quad( i * (x_size + 1 ) + j, i * (x_size + 1 ) + j + 1 ,
(i + 1 ) * (x_size + 1 ) + j + 1 ,(i + 1 ) * (x_size + 1 ) + j);
}
}
mTerrainDecal -> end();
}
// ------------------------------------------------------------------------------------------
void BasisManager::setTerrainDecal( float x, float z, float radius)
{
Ogre::Real x1 = x - radius;
Ogre::Real z1 = z - radius;
int x_size = 64 ;
int z_size = 64 ;
Ogre::Real x_step = radius * 2 / x_size;
Ogre::Real z_step = radius * 2 / z_size;
mTerrainDecal -> beginUpdate( 0 );
for ( int i = 0 ; i <= x_size; i ++ )
{
for ( int j = 0 ; j <= z_size; j ++ )
{
mTerrainDecal -> position(Ogre::Vector3(x1, HeightFunction::getTerrainHeight(x1, z1) + 0.5 , z1));
mTerrainDecal -> textureCoord(( float )i / ( float )x_size, ( float )j / ( float )z_size);
z1 += z_step;
}
x1 += x_step;
z1 = z - radius;
}
for ( int i = 0 ; i < x_size; i ++ )
{
for ( int j = 0 ; j < z_size; j ++ )
{
mTerrainDecal -> quad( i * (x_size + 1 ) + j, i * (x_size + 1 ) + j + 1 ,
(i + 1 ) * (x_size + 1 ) + j + 1 , (i + 1 ) * (x_size + 1 ) + j);
}
}
mTerrainDecal -> end();
}
{
mTerrainDecal = new Ogre::ManualObject( " decal " );
mSceneMgr -> getRootSceneNode() -> createChildSceneNode() -> attachObject(mTerrainDecal);
mTerrainDecal -> setCastShadows( false );
int x_size = 1 ;
int z_size = 1 ;
mTerrainDecal -> begin(szMaterialName, Ogre::RenderOperation::OT_TRIANGLE_LIST);
for ( int i = 0 ; i < x_size; i ++ )
{
for ( int j = 0 ; j <= z_size; j ++ )
{
mTerrainDecal -> position(Ogre::Vector3(i, 0 , j));
mTerrainDecal -> textureCoord(( float )i / ( float )x_size, ( float )j / ( float )z_size);
}
}
for ( int i = 0 ; i < x_size; i ++ )
{
for ( int j = 0 ; j < z_size; j ++ )
{
mTerrainDecal -> quad( i * (x_size + 1 ) + j, i * (x_size + 1 ) + j + 1 ,
(i + 1 ) * (x_size + 1 ) + j + 1 ,(i + 1 ) * (x_size + 1 ) + j);
}
}
mTerrainDecal -> end();
}
// ------------------------------------------------------------------------------------------
void BasisManager::setTerrainDecal( float x, float z, float radius)
{
Ogre::Real x1 = x - radius;
Ogre::Real z1 = z - radius;
int x_size = 64 ;
int z_size = 64 ;
Ogre::Real x_step = radius * 2 / x_size;
Ogre::Real z_step = radius * 2 / z_size;
mTerrainDecal -> beginUpdate( 0 );
for ( int i = 0 ; i <= x_size; i ++ )
{
for ( int j = 0 ; j <= z_size; j ++ )
{
mTerrainDecal -> position(Ogre::Vector3(x1, HeightFunction::getTerrainHeight(x1, z1) + 0.5 , z1));
mTerrainDecal -> textureCoord(( float )i / ( float )x_size, ( float )j / ( float )z_size);
z1 += z_step;
}
x1 += x_step;
z1 = z - radius;
}
for ( int i = 0 ; i < x_size; i ++ )
{
for ( int j = 0 ; j < z_size; j ++ )
{
mTerrainDecal -> quad( i * (x_size + 1 ) + j, i * (x_size + 1 ) + j + 1 ,
(i + 1 ) * (x_size + 1 ) + j + 1 , (i + 1 ) * (x_size + 1 ) + j);
}
}
mTerrainDecal -> end();
}