chap5 Ogre Scene Management

/*------------------------------------------------------------
	Terrain.h -- Specialisation of OGRE's framework application 
	to show the terrain rendering plugin 
			(c) Seamanj.2013/7/21
------------------------------------------------------------*/
#include "ExampleApplication.h"

RaySceneQuery* raySceneQuery = 0;

// Event handler to add ability to alter curvature
class TerrainFrameListener : public ExampleFrameListener
{
public:
    TerrainFrameListener(RenderWindow* win, Camera* cam)
        : ExampleFrameListener(win, cam)
    {
        // Reduce move speed
        mMoveSpeed = 50;

    }

    bool frameRenderingQueued(const FrameEvent& evt)
    {
        if( ExampleFrameListener::frameRenderingQueued(evt) == false )
		return false;

        // clamp to terrain
        static Ray updateRay;
        updateRay.setOrigin(mCamera->getPosition());
        updateRay.setDirection(Vector3::NEGATIVE_UNIT_Y);
        raySceneQuery->setRay(updateRay);
        RaySceneQueryResult& qryResult = raySceneQuery->execute();
        RaySceneQueryResult::iterator i = qryResult.begin();
        if (i != qryResult.end() && i->worldFragment)
        {
            mCamera->setPosition(mCamera->getPosition().x, 
                i->worldFragment->singleIntersection.y + 10, 
                mCamera->getPosition().z);
        }

        return true;

    }

};



class TerrainApplication : public ExampleApplication
{
public:
    TerrainApplication() {}

    ~TerrainApplication()
    {
        delete raySceneQuery;
    }

protected:


    virtual void chooseSceneManager(void)
    {
        // Get the SceneManager, in this case a generic one
        mSceneMgr = mRoot->createSceneManager("TerrainSceneManager");
    }

    virtual void createCamera(void)
    {
        // Create the camera
        mCamera = mSceneMgr->createCamera("PlayerCam");

        // Position it at 500 in Z direction
        mCamera->setPosition(Vector3(128,25,128));
        // Look back along -Z
        mCamera->lookAt(Vector3(0,0,-300));
        mCamera->setNearClipDistance( 1 );
        mCamera->setFarClipDistance( 1000 );

    }
   
    // Just override the mandatory create scene method
    void createScene(void)
    {
        Plane waterPlane;

        // Set ambient light
        mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));

        // Create a light
        Light* l = mSceneMgr->createLight("MainLight");
        // Accept default settings: point light, white diffuse, just set position
        // NB I could attach the light to a SceneNode if I wanted it to move automatically with
        //  other objects, but I don't
        l->setPosition(20,80,50);

        // Fog
        // NB it's VERY important to set this before calling setWorldGeometry 
        // because the vertex program picked will be different
        ColourValue fadeColour(0.93, 0.86, 0.76);
        mSceneMgr->setFog( FOG_LINEAR, fadeColour, .001, 500, 1000);
//Figure 5-11 Need Add Begin
        //mWindow->getViewport(0)->setBackgroundColour(fadeColour);
//Figure 5-11 Need Add End
//Figure 5-12 Need Add Begin
		mWindow->getViewport(0)->setBackgroundColour(ColourValue::Black);//Notice that the fog is still in effect on the terrain in the distance.
//Figure 5-12 Need Add End
        std::string terrain_cfg("terrain.cfg");
        mSceneMgr -> setWorldGeometry( terrain_cfg );
        // Infinite far plane?
        if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(RSC_INFINITE_FAR_PLANE))
        {
            mCamera->setFarClipDistance(0);
        }

        // Define the required skyplane
        Plane plane;
        // 5000 world units from the camera
//Figure 5-14 Need Change Begin
       ///*before*/plane.d = 5000;
		/*after*/plane.d=500;
//Figure 5-14 Need Change End
        // Above the camera, facing down
        plane.normal = -Vector3::UNIT_Y;
//Figure 5-13 5-14 Need Add Begin
		mSceneMgr->_setSkyPlane(true,plane,"Examples/CloudySky");//it just look like Figure 5-11 with the lower parts missing.
//Figure 5-13 5-14 Need Add End
        // Set a nice viewpoint
        mCamera->setPosition(707,2500,528);
		//mCamera->lookAt(0,0,0);
        mCamera->setOrientation(Quaternion(-0.3486, 0.0122, 0.9365, 0.0329));
       

        raySceneQuery = mSceneMgr->createRayQuery(
        Ray(mCamera->getPosition(), Vector3::NEGATIVE_UNIT_Y));


    }
    // Create new frame listener
    void createFrameListener(void)
    {
        mFrameListener= new TerrainFrameListener(mWindow, mCamera);
		mFrameListener->showDebugOverlay(true);//若不调用这个函数默认为显示
        mRoot->addFrameListener(mFrameListener);
    }

};

 

 

/*------------------------------------------------------------
	Terrain.cpp -- Shows OGRE's terrain rendering plugin.
			(c) Seamanj.2013/7/21
------------------------------------------------------------*/


#include "Terrain.h"

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main(int argc, char *argv[])
#endif
{
    // Create application object
    TerrainApplication app;

    try {
        app.go();
    } catch( Ogre::Exception& e ) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
        MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
        std::cerr << "An exception has occured: " <<
            e.getFullDescription().c_str() << std::endl;
#endif
    }

    return 0;
}

#ifdef __cplusplus
}
#endif



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用: 在看关于卡尔曼滤波的教程时,提到了一个文件chap1_27f.m,这个文件仿真结果没有问题,但是输出的结果都是关于变量Y(n)的。用户想知道是否有办法可以显示出变量X(n)的变化过程。 引用: 在尝试在Simulink中运行文件时,出现了一个错误信息,指出在flag=1调用期间,由S-Function返回的状态导数必须是长度为4的实向量。用户在flag=1中保持了长度为4,并且使用了实代数方程,但仍然出现了复杂向量的问题。用户想知道为什么会出现这个问题。 关于第一个问题,根据提供的引用内容,无法得知matlab中chap5_3f是什么。请提供更多关于chap5_3f的信息,我将尽力提供帮助。 关于第二个问题,根据引用,出现的错误信息是由于S-Function返回的状态导数的长度不匹配。这可能是因为在flag=1调用中的实向量的长度与期望的长度不一致。建议仔细检查代码中与S-Function相关的部分,确保状态导数的长度正确,并且与S-Function的要求相匹配。如果问题仍然存在,请提供更多关于代码和错误消息的信息,以便我能够提供更具体的帮助。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [卡尔曼滤波求教-chap1_27f.m](https://download.csdn.net/download/weixin_39841856/11536026)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [倒立摆系统的 S 函数文件:S 函数 simulink 错误:在 flag=1 调用期间必须是长度为 4 的实向量...-matlab开发](https://download.csdn.net/download/weixin_38742954/19223894)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值