ogre学习笔记-Intermediate Tutorial 567

Intermediate Tutorial 5         Static Geometry

1、

Creating the Mesh

constfloat width =25;constfloat height =30;
Ogre::ManualObject mo("GrassObject");
 
Ogre::Vector3 vec(width/2,0,0);
Ogre::Quaternion rot;
rot.FromAngleAxis(Ogre::Degree(60), Ogre::Vector3::UNIT_Y);


mo.begin("Examples/GrassBlades", Ogre::RenderOperation::OT_TRIANGLE_LIST);
for(int i =0; i <3;++i){
mo.position(-vec.x, height,-vec.z);
        mo.textureCoord(0,0);
 
        mo.position(vec.x, height, vec.z);
        mo.textureCoord(1,0);
 
        mo.position(-vec.x,0,-vec.z);
        mo.textureCoord(0,1);
 
        mo.position(vec.x,0, vec.z);
        mo.textureCoord(1,1);

  

int offset = i *4;
        mo.triangle(offset, offset+3, offset+1);
        mo.triangle(offset, offset+2, offset+3);
vec = rot * vec;}
mo.end();

  

mo.convertToMesh("GrassBladesMesh");


// Do not add to the code!
        Ogre::MeshPtr        ptr = mo.convertToMesh("GrassBladesMesh");
        Ogre::MeshSerializer ser;
        ser.exportMesh(ptr.getPointer(),"grass.mesh");

2、

Adding Static Geometry


Ogre::Entity*grass = mSceneMgr->createEntity("grass","GrassBladesMesh");
        Ogre::StaticGeometry*sg = mSceneMgr->createStaticGeometry("GrassArea");
 
        constint size =375;constint amount =20;

  

sg->setRegionDimensions(Ogre::Vector3(size, size, size));
sg->setOrigin(Ogre::Vector3(-size/2,0,-size/2));


// Do not add to the project!
sg->setOrigin(Vector3(-size/2,-size/2,-size/2)+ Vector3(x, y, z));

for(int x =-size/2; x < size/2; x +=(size/amount))
{
    for(int z =-size/2; z < size/2; z +=(size/amount))
    {
                Ogre::Real r = size /(float)amount /2;
                Ogre::Vector3 pos(x + Ogre::Math::RangeRandom(-r, r),
                        0, z + Ogre::Math::RangeRandom(-r, r));
                Ogre::Vector3 scale(1, Ogre::Math::RangeRandom(0.9,1.1),1);
                Ogre::Quaternion orientation;
                orientation.FromAngleAxis(Ogre::Degree(Ogre::Math::RangeRandom(0,359)),
                         Ogre::Vector3::UNIT_Y);
 
                sg->addEntity(grass, pos, orientation, scale);
    }
}
sg->build();


3、其它:

Conclusion

Modifying the StaticGeometry Object

Once the StaticGeometry is created, you are not supposed to do too much with it, since that would mostly defeat the purpose. You can, however, do things like wave the grass with the wind. If you are interested in how to do this, take a look at the grass demo which comes with Ogre. The GrassListener::waveGrass function modifies the grass to perform a wave-like motion.

Advanced Object Batching

This is, of course, just the beginnings of object batching. You should use StaticGeometry any time you have objects that are grouped together and will not move. If you are trying to create something as intensive or as expansive as a forest or trying to add grass to a huge amount of terrain, you should take a look at one of the more advanced batching techniques, like thePagedGeometry Engine.



Intermediate Tutorial 6          Projective Decals 投影贴花
贴花图片


Frustums

mDecalFrustum = new Ogre::Frustum();
mProjectorNode = mSceneMgr->getRootSceneNode()->
                    createChildSceneNode("DecalProjectorNode");
mProjectorNode->attachObject(mDecalFrustum);
mProjectorNode->setPosition(0,5,0);


// Do not add this to the project
mDecalFrustum->setProjectionType(Ogre::PT_ORTHOGRAPHIC);
mDecalFrustum->setOrthoWindowHeight(100);

Modifying the Material

Ogre::MaterialPtr mat =(Ogre::MaterialPtr)Ogre::MaterialManager::getSingleton()
                        .getByName(matName);
Ogre::Pass*pass = mat->getTechnique(0)->createPass();


pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
pass->setDepthBias(1);
pass->setLightingEnabled(false);


Ogre::TextureUnitState*texState = pass->createTextureUnitState("decal.png");
texState->setProjectiveTexturing(true, mDecalFrustum);
texState->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP);
texState->setTextureFiltering(Ogre::FO_POINT, Ogre::FO_LINEAR, Ogre::FO_NONE);


Getting Rid of the Back Projection

Modifying the Projector

mFilterFrustum = new Ogre::Frustum();
mFilterFrustum->setProjectionType(Ogre::PT_ORTHOGRAPHIC);
Ogre::SceneNode*filterNode = mProjectorNode
                    ->createChildSceneNode("DecalFilterNode");
filterNode->attachObject(mFilterFrustum);
filterNode->setOrientation(Ogre::Quaternion(Ogre::Degree(90),Ogre::Vector3::UNIT_Y));


Modifying the Material

texState = pass->createTextureUnitState("decal_filter.png");
texState->setProjectiveTexturing(true, mFilterFrustum);
texState->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP);
texState->setTextureFiltering(Ogre::TFO_NONE);


PS:有时间看看 Ogre::Frustum的相关函数的文档


Intermediate Tutorial 7          Render to texture (RTT)
RTT效果图

1、创建纹理
Ogre::TexturePtr rtt_texture = Ogre::TextureManager::getSingleton()
            .createManual("RttTex", 
                Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
                 Ogre::TEX_TYPE_2D, 
mWindow->getWidth(), mWindow->getHeight(),0, Ogre::PF_R8G8B8, Ogre::TU_RENDERTARGET);


Ogre::RenderTexture*renderTexture = rtt_texture->getBuffer()->getRenderTarget();
 
renderTexture->addViewport(mCamera);
renderTexture->getViewport(0)->setClearEveryFrame(true);
renderTexture->getViewport(0)->setBackgroundColour(Ogre::ColourValue::Black);
renderTexture->getViewport(0)->setOverlaysEnabled(false);
renderTexture->update();

2、 Creating a material from scratch
Ogre::MaterialPtr renderMaterial = Ogre::MaterialManager::getSingleton()
                    .create("RttMat",
                    Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
renderMaterial->getTechnique(0)->getPass(0)->setLightingEnabled(false);
renderMaterial->getTechnique(0)->getPass(0)->createTextureUnitState("RttTex");


mMiniScreen->setMaterial("RttMat");

3、 Implementing a RenderTargetListener
继承 :
public Ogre::RenderTargetListener
    virtual void preRenderTargetUpdate(const Ogre::RenderTargetEvent& evt);
    virtual void postRenderTargetUpdate(const Ogre::RenderTargetEvent& evt);
用于 在渲染纹理时,是小窗口隐藏,渲染好后再显示。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值