【笔记】二、摄像机、视口、光照、阴影

1、摄像机 virtual void createCamera(void) { ////////////////////////////////////////////////////////////////////////// // 摄像机的创建 mCamera = mSceneMgr->createCamera("PlayerCam"); // 创建摄像机 mCamera->setPosition(Vector3(0, 10, 500)); // 设置摄像机的位置 mCamera->lookAt(Vector3(0, 0, 0)); // 设置摄像机的朝向 mCamera->setNearClipDistance(5); // 设置摄像机的近距离裁剪值 mCamera->setFarClipDistance(500); // 设置摄像机的远距离裁剪值 } 2、视口 virtual void createViewports(void) { ////////////////////////////////////////////////////////////////////////// // 视口的创建 Viewport* vp = mWindow->addViewport(mCamera); // 给摄像节添加视口 vp->setBackgroundColour(ColourValue(0, 0, 0)); // 设置视口的背景颜色 mCamera->setAspectRatio(Real(vp->getActualWidth())/ Real(vp->getActualWidth()));// 设置视口的纵宽比 } 3、光照和阴影 void createScene(void) { Entity *ent; Light *light; ////////////////////////////////////////////////////////////////////////// // 阴影的创建 /************************************************************************ Ogre目前支持3种类型的阴影(当前版本1.4.x目前已经支持四种阴影类型): 调制纹理阴影 (SHADOWTYPE_TEXTURE_MODULATIVE) - 是这3种中最节省资源的。她 创建一个阴影投射者的黑与白渲染到纹理,然后用于场景中。 调制模板阴影 (SHADOWTYPE_STENCIL_MODULATIVE) - 这项技术是在所有的非透明体 被渲染到场景以后再渲染所有的阴影体来调制阴影,她耗费资源 没有加成模板阴影强,但是也不是非常精确。 加成模板阴影 (SHADOWTYPE_STENCIL_ADDITIVE) - 这项技术是渲染每一个光源作为 分离的部分附加到场景中。 对显卡来说这是比较麻烦的,因为在 场景中每一个附加的光源需要一个附加渲染通路。 Ogre不支持软阴影作为引擎的一部分。如果你想用软阴影,你需要写你自己的顶点和片段语言。 ************************************************************************/ mSceneMgr->setAmbientLight(ColourValue(0, 0, 0));// 设置环境光 mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE);// 设置阴影类型 mSceneMgr->setShadowUseInfiniteFarPlane(false); ent = mSceneMgr->createEntity("Ninja", "ninja.mesh");// 创建一个实体 ent->setCastShadows(true);// 允许阴影 mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);// 将实体添加到结点中去 Plane plane(Vector3::UNIT_Y, 0);// 创建一个平面 MeshManager::getSingleton().createPlane("ground",ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,plane, 1500, 1500, 20, 20, true, 1, 5, 5, Vector3::UNIT_Z);// 注册平面 ent = mSceneMgr->createEntity("GroundEntity", "ground");// 创建已经注册的平面实体 mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);// 将实体添加到场景根结点中去 ent->setMaterialName("Examples/Rockwall");// 添加材质脚本 ent->setCastShadows(false);// 告诉场景管理器我们不想把她设置成投射阴影体直到她被用做阴影体 ////////////////////////////////////////////////////////////////////////// // 光源的创建 /************************************************************************ Ogre提供了三种光源类型。 点光源 (LT_POINT) - 从一个点发出光放射到四周。 聚光源 (LT_SPOTLIGHT) - 严格来说聚光灯工作有点像手电筒。 你在某个地方设置 了灯光的起点,然后灯光射向一个方向。你可以告诉光源内锥角度大小和 外锥角度大小(你知道手电筒内部会明亮一些。) 有向光 (LT_DIRECTIONAL) - 有向光模拟非常遥远地方的灯光,在场景中从某个方向 照射物体。如果你想要一个夜晚的场景你就需要模拟月光。你可以通过为场 景设置环境光来做到这个,但是这并非是真实场景的模拟因为月光并不平等 地照亮所有物体(日光也不是)。一种方法解决这个是设置一个有向的光源 然后指向一个方向,月光就会显示出来。 光源有一个范围属性描述光看上去的样子。两个更重要的属性是光的漫反射颜色和镜 面反射颜色(diffuse and specular color)。每一个材质脚本定义有多少漫反射和镜 面反射光线由材质反射来 ************************************************************************/ light = mSceneMgr->createLight("Light1"); // 创建光源 light->setType(Light::LT_POINT); // 设置光源类型:点光源 light->setPosition(Vector3(0, 150, 250)); // 设置光源位置 light->setDiffuseColour(1.0, 0.0, 0.0); // 设置漫反射为红色 light->setSpecularColour(1.0, 0, 0); // 设置镜面反射为红色 light = mSceneMgr->createLight("Light3"); // 再创建一个光源 light->setType(Light::LT_DIRECTIONAL); // 设置光源类型为有向光 light->setDirection(Vector3(0, -1, 1)); // 设置光源的方向为45° light->setDiffuseColour(ColourValue(.25, .25, 0)); // 漫反射 light->setSpecularColour(ColourValue(.25, .25, 0)); // 镜面反射 light = mSceneMgr->createLight("Light2"); // 再创建一个光源 light->setType(Light::LT_SPOTLIGHT); // 设置光源类型为聚光灯 light->setDirection(Vector3(-1, -1, 0)); // 设置光源的方向 light->setPosition(Vector3(300, 300, 0)); // 设置聚光灯的位置 light->setSpotlightRange(Degree(35), Degree(50)); // 设置内外光束的大小 light->setDiffuseColour(ColourValue(0, 0, 1.0)); // 漫反射 light->setSpecularColour(ColourValue(0, 0, 1.0)); // 镜面反射 }  

你可能感兴趣的:(工作,vector,脚本,语言,引擎)