贴花

这种方法当观察点距离贴花远的时候,出现穿插,这是因为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();

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值