/*------------------------------------------------------------ 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