菜鸟也学Ogre-摄像机投影灯光

OGRE中的Light,Shadow和Camera的设置
1. 要开启阴影:首先要调用SceneManager:: setShadowTechnique(),然后对于需要开启的Entity调用Entity:: setCastShadows()。
2. 灯光和摄像机都需要由SceneManager来创建,分别是SceneManager::createLight()和SceneManager::createCamera()。
3. 可以创建多个摄像机,用视口来管理Ogre::Viewport* vp = mWindow->addViewport(mCamera);视口可以用来设置视口背景颜色,方法是setBackgroundColour()。
主要代码如下:
void TutorialApplication::createScene(void)
{
//设置环境光为全黑
mSceneMgr->setAmbientLight(Ogre::ColourValue(0, 0, 0));
//设置投影的类型
mSceneMgr->setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_ADDITIVE);
//创建一个Entity
Ogre::Entity* entNinja = mSceneMgr->createEntity("Ninja", "ninja.mesh");
//设置是否投影
entNinja->setCastShadows(true);
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(entNinja);
//创建平面
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* entGround = mSceneMgr->createEntity("GroundEntity", "ground");
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(entGround);


entGround->setMaterialName("Examples/RockWall");
entGround->setCastShadows(false);


Ogre::Light* pointLight = mSceneMgr->createLight("pointLight");
pointLight->setType(Ogre::Light::LT_POINT);
pointLight->setPosition(Ogre::Vector3(0, 150, 250));


pointLight->setDiffuseColour(1.0, 0.0, 0.0);
pointLight->setSpecularColour(1.0, 0.0, 0.0);


Ogre::Light* directionalLight = mSceneMgr->createLight("directionalLight");
directionalLight->setType(Ogre::Light::LT_DIRECTIONAL);
directionalLight->setDiffuseColour(Ogre::ColourValue(.25, .25, 0));
directionalLight->setSpecularColour(Ogre::ColourValue(.25, .25, 0));


directionalLight->setDirection(Ogre::Vector3( 0, -1, 1 ));


Ogre::Light* spotLight = mSceneMgr->createLight("spotLight");
spotLight->setType(Ogre::Light::LT_SPOTLIGHT);
spotLight->setDiffuseColour(0, 0, 1.0);
spotLight->setSpecularColour(0, 0, 1.0);


spotLight->setDirection(-1, -1, 0);
spotLight->setPosition(Ogre::Vector3(300, 300, 0));


spotLight->setSpotlightRange(Ogre::Degree(35), Ogre::Degree(50));
}
void TutorialApplication::createCamera()
{
//创建照相机
mCamera=mSceneMgr->createCamera("PlayerCam");
//设置照相机位置
mCamera->setPosition(Ogre::Vector3(0,10,500));
//设置照相机朝向
mCamera->lookAt(Ogre::Vector3(0,0,0));
//设置照相机可视距离
mCamera->setNearClipDistance(5);
//创建一个SkdCamera
mCameraMan=new OgreBites::SdkCameraMan(mCamera);
}


void TutorialApplication::createViewports()
{
//创建一个视口
Ogre::Viewport* vp=mWindow->addViewport(mCamera);
//设置视口背景颜色
vp->setBackgroundColour(Ogre::ColourValue(0,0,0));
//设置视口的摄像机显示比例
mCamera->setAspectRatio(Ogre::Real(vp->getActualWidth())/Ogre::Real(vp->getActualHeight()));
}

记得修改resources.cfg,将资源搜索目录定位到源码Sample的media目录,否则编译会提示无法找到文件。

运行效果:

菜鸟也学Ogre-摄像机投影灯光

2012-7-14