第三章 OGRE中的光照,阴影,摄像机和视口

#include "ExampleApplication.h"
class Example3:public ExampleApplication
{
public:
	void createScene()
	{
		/*
		//1 begin
		Ogre::Plane plane(Vector3::UNIT_Y,-10);
		Ogre::MeshManager::getSingleton().createPlane("plane",ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,plane,1500,1500,20,20,true,1,5,5,Vector3::UNIT_Z);
		Ogre::Entity* ent=mSceneMgr->createEntity("LightPlaneEntity","plane");
		mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
		ent->setMaterialName("Examples/BeachStones");
		//1 end
		//2_1 begin
		Ogre::SceneNode* node1=mSceneMgr->createSceneNode("Node1");
		mSceneMgr->getRootSceneNode()->addChild(node1);
		Ogre::Light* light1=mSceneMgr->createLight("MyLight1");
		light1->setType(Ogre::Light::LT_POINT);
		light1->setPosition(0,20,0);
		light1->setDiffuseColour(1.0f,1.0f,1.0f);
		Ogre::Entity* LightEnt1=mSceneMgr->createEntity("MyEntity1","sphere.mesh");
		Ogre::SceneNode* node2=node1->createChildSceneNode("Node2");
		node2->setPosition(0,20,0);
		node2->setScale(0.1f,0.1f,0.1f);
		node2->attachObject(LightEnt1);
		//2_1 end
		//3_2 begin
		Ogre::Light *light2=mSceneMgr->createLight("MyLight2");
		light2->setType(Ogre::Light::LT_POINT);
		light2->setPosition(20,20,20);
		light2->setDiffuseColour(1.0f,1.0f,1.0f);
		Ogre::Entity* LightEnt2=mSceneMgr->createEntity("MyEntity2","sphere.mesh");
		Ogre::SceneNode* node3=node1->createChildSceneNode("Node3");
		node3->setPosition(20,20,20);
		node3->setScale(0.1f,0.1f,0.1f);
		node3->attachObject(LightEnt2);
		//3_2 end*/
		//4|all begin
		Ogre::Plane plane(Vector3::UNIT_Y,-10);
		Ogre::MeshManager::getSingleton().createPlane("plane",ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,plane,1500,1500,200,200,true,
		1,5,5,Vector3::UNIT_Z);
		Ogre::Entity* ent=mSceneMgr->createEntity("LightPlaneEntity","plane");
		mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
		ent->setMaterialName("Examples/BeachStones");
		Ogre::SceneNode* node1=mSceneMgr->createSceneNode("Node1");
		mSceneMgr->getRootSceneNode()->addChild(node1);
		Ogre::SceneNode* node4=node1->createChildSceneNode("Node4");
		node4->setPosition(0,100,0);
		Ogre::Light* pSpotLight1=mSceneMgr->createLight("MySpotLight1");
		pSpotLight1->setType(Ogre::Light::LT_SPOTLIGHT);
		pSpotLight1->setDirection(Ogre::Vector3(1,-1,0));
		pSpotLight1->setSpotlightInnerAngle(Ogre::Degree(5.0f));
		pSpotLight1->setSpotlightOuterAngle(Ogre::Degree(45.0f));
		pSpotLight1->setSpotlightFalloff(0.0f);
		pSpotLight1->setDiffuseColour(Ogre::ColourValue(0.0f,1.0f,0.0f));
		node4->attachObject(pSpotLight1);//如果不显示附着,则是在RootSceneNode()上附着
		Ogre::Entity* GreenSpotLightSphere=mSceneMgr->createEntity("GreenSpotLightSphere","sphere.mesh");
		node4->setScale(0.1f,0.1f,0.1f);
		node4->attachObject(GreenSpotLightSphere);

		Ogre::SceneNode* redspotlightnode=node1->createChildSceneNode("RedSpotLightNode");
		Ogre::Light* redspotlight=mSceneMgr->createLight("RedSpotLight");
		redspotlight->setType(Ogre::Light::LT_SPOTLIGHT);
		redspotlight->setDiffuseColour(Ogre::ColourValue(1.0f,0.0f,0.0f));
		redspotlight->setDirection(-1,-1,0);
		redspotlight->setSpotlightInnerAngle(Ogre::Degree(5.0f));
		redspotlight->setSpotlightOuterAngle(Ogre::Degree(45.0f));
		redspotlight->setSpotlightFalloff(0.0f);
		redspotlightnode->attachObject(redspotlight);
		Ogre::Entity* redspotlightsphere=mSceneMgr->createEntity("RedSpotLightSphere","sphere.mesh");
		redspotlightnode->setScale(0.1f,0.1f,0.1f);
		redspotlightnode->setPosition(200,100,0);//注意是结点位移,不是灯光位移,否则球体不位移
		redspotlightnode->attachObject(redspotlightsphere);
		//4|all end
		//5_4 begin
		Ogre::Light* directionallight=mSceneMgr->createLight("DirectionLight");
		directionallight->setType(Ogre::Light::LT_DIRECTIONAL);
		directionallight->setDirection(1,-1,0);//方向光源无需attach
		directionallight->setDiffuseColour(Ogre::ColourValue(1.0f,1.0f,1.0f));
		//5_4 end
		//6_5 begin
		Ogre::Entity* Sinbad=mSceneMgr->createEntity("Sinbad","Sinbad.mesh");
		Ogre::SceneNode* SinbadNode=mSceneMgr->getRootSceneNode()->createChildSceneNode("SinbadNode");
		SinbadNode->setPosition(Ogre::Vector3(0.0f,4.0f,0.0f));//平面在-10,-10+14(Sinbad放大3倍后下半身长度为14)=4
		SinbadNode->setScale(3.0f,3.0f,3.0f);
		SinbadNode->attachObject(Sinbad);
		//6_5 end
		//7_6 begin
		mSceneMgr->setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_ADDITIVE);
		//7_6 end
	}
	//8_7 begin
	void createCamera()
	{
		mCamera=mSceneMgr->createCamera("MyCamera1");
		mCamera->setPosition(0,100,200);
		mCamera->lookAt(0,0,0);
		mCamera->setNearClipDistance(5);
		//8.1 begin
		//mCamera->setPolygonMode(Ogre::PM_WIREFRAME);
		//8.1 end
	}
	//8_7 end
	//9_8|8.1 begin
	void createViewports()
	{
		Ogre::Viewport* vp=mWindow->addViewport(mCamera);
		vp->setBackgroundColour(Ogre::ColourValue(0.0f,0.0f,1.0f));
		//9.1 begin
		//mCamera->setAspectRatio(Real(vp->getActualWidth())/Real(vp->getActualHeight()));
		//9.1 end
		//10_9|9.1 begin
		mCamera->setAspectRatio(0.2);
		//10_9|9.1 end
	}
	//9_8|8.1 end
};

int main()
{
	Example3 app;
	app.go();
	return 0;
}


 --->mSceneMgr ----->  mCamera

mRoot   

--->mWindow ----------> addViewport(mCamera)


There can only be one camera active at a particular time 


Each viewport can only render the view of one camera,so Ogre 3D enforces that one camera is given during creation.Of course,the camera can be changed later using the appropriate getter and setter functions.




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值