总结自:http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Basic+Tutorial+2&structure=Tutorials
void TutorialApplication::createCamera() { // Ogre::Camera 继承自Frustum,但是camera可以添加到SceneNode,也可以像SceneNode一样进行变换 // You can also attach it to a SceneNode. The Camera is not a SceneNode (it actually inherits from the Frustum class), // but for movement and rotation, you can treat it like a SceneNode. mCamera = mSceneMgr->createCamera("PlayerCam"); mCamera->setPosition(Ogre::Vector3(0, 300, 500)); mCamera->lookAt(Ogre::Vector3(0, 0, 0)); mCamera->setNearClipDistance(5); mCameraMan = new OgreBites::SdkCameraMan(mCamera); } void TutorialApplication::createViewports() { // 一个Root可以有多个场景,同样可以有多个camera,但是一个camera对应一个viewPort. // 要了解渲染,需要understanding how Ogre renders a scene: the Camera, the SceneManager, and the RenderWindow. // 要实现窗口分割,那么需要从RenderWindow做改变。具体的渲染窗口设置和窗口分割需要通过设置viewPort就可以了。 // viewPort描述了设备坐标系到屏幕坐标系的变换映射方式。 Ogre::Viewport* vp = mWindow->addViewport(mCamera); vp->setBackgroundColour(Ogre::ColourValue(0, 0, 0)); mCamera->setAspectRatio( Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()) ); } void TutorialApplication::creareSceneLightAndShadow() { // Create your scene here :) Ogre::Entity* ninjaEntity = mSceneMgr->createEntity("ninja.mesh"); // we are asking the mesh to cast shadows this time. And notice that // we have created a child scene node and attached the ninjaEntity all in one call this time. ninjaEntity->setCastShadows(true); mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ninjaEntity); // We will also create something for the ninja to be standing on Ogre::Plane plane(Ogre::Vector3::UNIT_Y, 0); Ogre::MeshManager::getSingleton().createPlane( "ground", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane, 1500, 1500, 20, 20, true, 1, 5, 5, Ogre::Vector3::UNIT_Z); Ogre::Entity* groundEntity = mSceneMgr->createEntity("ground"); mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(groundEntity); // this means the ground won't cast a shadow, it doesn't mean we can't cast shadows on to the ground. groundEntity->setCastShadows(false); // we need to give our ground a material. // Make sure you add the texture for the material and the Examples.material script to your resource loading path. In our case, the texture is called 'rockwall.tga'. // You can find the name yourself by reading the entry in the material script. groundEntity->setMaterialName("Examples/Rockwall"); mSceneMgr->setAmbientLight(Ogre::ColourValue(0, 0, 0)); // Then whenever we create an Entity, we call setCastShadows to choose which Entities will cast shadows. // Now the SceneManager will use additive stencil shadows. //Ogre currently supports three types of Shadows : //Ogre::SHADOWTYPE_TEXTURE_MODULATIVE - This is the least computationally expensive type.A black and white render // - to- texture is created using all of the shadow casters.This is then applied to the scene. // Ogre::SHADOWTYPE_STENCIL_MODULATIVE - This technique renders all shadow volumes as a modulation after all // non - transparent objects have been rendered to the scene.This is not as intensive as Ogre::SHADOWTYPE_STENCIL_ADDITIVE, // but it is also less accurate. // Ogre::SHADOWTYPE_STENCIL_ADDITIVE - This technique renders each light as a separate additive pass on the // scene.This is very hard on the graphics card because each additional light requires an additional rendering // pass. // Try experimenting with the different shadow types.There are also other shadow - related methods in the // SceneManager(external link) class that you can play with. // Ogre does not provide soft shadows as part of the engine.You can write your own vertex and // fragment programs to implement soft shadows and many other things.The Ogre Manual(external link) has // a full description of shadows. // 纹理阴影性能最高,模板阴影性能比较差 mSceneMgr->setShadowTechnique(Ogre::SHADOWTYPE_TEXTURE_MODULATIVE/*Ogre::SHADOWTYPE_STENCIL_ADDITIVE*/); /*Ogre provides three types of lighting. Ogre::Light::LT_POINT - This Light speads out equally in all directions from a point. Ogre::Light::LT_SPOTLIGHT - This Light works like a flashlight.It produces a solid cylinder of light that is brighter at the center and fades off.Ogre::Light::LT_DIRECTIONAL - This Light simulates a huge source that is very far away - like daylight.Light hits the entire scene at the same angle everywhere. The Light(external link) class has a wide range of properties.Two of the most important are the diffuse and specular color.Each material script defines how much specular and diffuse lighting a material reflects.*/ Ogre::Light* spotLight = mSceneMgr->createLight("SpotLight"); spotLight->setDiffuseColour(0, 0, 1.0); spotLight->setSpecularColour(0, 0, 1.0); spotLight->setType(Ogre::Light::LT_SPOTLIGHT); spotLight->setPosition(Ogre::Vector3(200, 200, 0)); spotLight->setDirection(-1, -1, 0); spotLight->setSpotlightRange(Ogre::Degree(35), Ogre::Degree(50)); Ogre::Light* directionalLight = mSceneMgr->createLight("DirectionalLight"); directionalLight->setType(Ogre::Light::LT_DIRECTIONAL); directionalLight->setDiffuseColour(Ogre::ColourValue(.4, 0, 0)); directionalLight->setSpecularColour(Ogre::ColourValue(.4, 0, 0)); directionalLight->setDirection(Ogre::Vector3(0, -1, 1)); Ogre::Light* pointLight = mSceneMgr->createLight("PointLight"); pointLight->setType(Ogre::Light::LT_POINT); pointLight->setDiffuseColour(.3, .3, .3); pointLight->setSpecularColour(.3, .3, .3); pointLight->setPosition(Ogre::Vector3(0, 150, 250)); }