实验二 建立基本的游戏场景
实验二 建立基本的游戏场景
一、实验内容:
1. 建立一个简单的游戏场景;
2. 通过摄像机实现场景的切换;
3. 使用不同的光照实现阴影效果;
二、实验目的:
1. 了解Ogre程序的工作方法和Ogre场景的坐标系,掌握场景管理器、场景节点和实体的概念及其具体应用。
2. 掌握摄像机、视口的概念及其在游戏编程中的具体应用。
3. 掌握不同类型光源的使用方法和区别,熟悉阴影的产生方法。
三、实验步骤
(1)、初试
首先第一步是要做出一个简单的窗口,
由于Orge现在Sample都使用了插件的机制,调试不方便,
也不利于理解真正的Orge流程,
所以翻看了些资料,直接从根本动手,
1, 首先建立一个新项目
敲入代码:
#include <Ogre.h>
#include <ExampleApplication.h>
#include <windows.h>
#include <windowsx.h>
int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
// 执行应用程序初始化:
Root * g_ogreRoot=new Root("plugins_d.cfg");
// 显示配置窗口
bool rtn = g_ogreRoot->showConfigDialog();
// 如果配置文件已经存在(已经执行过起码一次showConfigDialog ),
// 那么你可以用下面这句之间读取配置,而不需要显示配置窗口。
g_ogreRoot->restoreConfig();
// 创建渲染窗口
g_ogreRoot->initialise(true, "My Render Window"); // 这里的true 指示ogre 自动创建窗口
RenderWindow * renderWindow =g_ogreRoot->getAutoCreatedWindow();
renderWindow->setAutoUpdated(true);
// 创建场景管理器,这个TerrainSceneManager 是指地形场景管理器
SceneManager* mSceneMgr = g_ogreRoot->createSceneManager("TerrainSceneManager");
// 创建摄像机
Camera* mCamera = mSceneMgr->createCamera("PlayerCam");
mCamera->setPosition(Vector3(0,0,-300)); // 摄像机位置
mCamera->lookAt(Vector3(0,0,800)); // 摄像机朝向
// 设置渲染窗口的视口(和我们的摄像机绑定)
Viewport *vp = renderWindow->addViewport(mCamera);
vp->setBackgroundColour(ColourValue(0, 0, 0));
// 定义资源的读取目录/文件,dragon.zip 放在执行目录,这个文件可以在OgreSDK\media\packs 目录下找到
ResourceGroupManager::getSingleton().addResourceLocation(
"dragon.zip", "Zip", "General"
);
// 我把script 目录从OgreSDK\media\materials\scripts 复制到执行目录下了,龙的皮肤着色需要用到某个脚本
ResourceGroupManager::getSingleton().addResourceLocation(
"scripts", "FileSystem", "General"
);
// 初始化资源管理器
ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
// 读取龙的模型
Entity * ent = mSceneMgr->createEntity("dragon", "dragon.mesh");
// 把模型放入场景管理器
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
// 开始渲染
g_ogreRoot->startRendering();
return 0;
}
代码不难理解,相比起手动建立一个完整的DX来说已是非常简单了,
继续,定义好一个plugins_d.cfg文件,作为Orge的初始化配置
# Defines plugins to load
# Define plugin folder
PluginFolder=.
# Define plugins
Plugin=RenderSystem_Direct3D9_d
# Plugin=RenderSystem_Direct3D10_d
# Plugin=RenderSystem_Direct3D11_d
Plugin=RenderSystem_GL_d
# Plugin=RenderSystem_GLES_d
Plugin=Plugin_ParticleFX_d
Plugin=Plugin_BSPSceneManager_d
Plugin=Plugin_CgProgramManager_d
Plugin=Plugin_PCZSceneManager_d
Plugin=Plugin_OctreeZone_d
Plugin=Plugin_OctreeSceneManager_d
配置文件既是定义了相关的插件配置,咱是xp,跑不了DX10/11,
貌似CMake也做好了判断,DX10的RenderSystem也找不到。。。
2,配置项目
敲好了代码还远远不够,加入Orge的各个配件可是关键,
DXSDK早已配置完成,这里主要把Orge一个个耐心加入:
1.包含文件
\ogre-v1-7-0\Dependencies\include
\ogre-v1-7-0\Samples\Common\include
\ogre-v1-7-0\OgreMain\include
\ogre-v1-7-0\include
2.库文件
\ogre-v1-7-0\Dependencies\lib\Release
\ogre-v1-7-0\Dependencies\lib\Debug
\ogre-v1-7-0\lib\Release
\ogre-v1-7-0\lib\Debug
这些可确是重中之重,仔细检查后F7,F5
3,调试
编译非常顺利,比起OrgeSDK,这可算是从石器时代回到了现代文明,
可美好的东西哪有那么容易得来,
报错了,
没办法,兵来将挡水来土掩,
拿起Debug的利器,
几经跟踪后发现;
应该是动态库的问题
终于发现了:RenderSystem_Direct3D9_d.dll!!
可是一时还搞不明白Orge的复杂读取机制,只好直接暴力破解,
在Orge下找到DLL
直接复制入系统目录
问题迎刃而解:
4,Debug II
可现在就庆祝胜利还是太早了些,错误又来了,
呵呵,粗枝大叶了,Media忘记拷贝过来,
F5,一切搞定:
(2)、这些都不够,我要动起来
1,架构
当前的框架还是十分的稚嫩,
到Orge官网逛了下后决定使用Ogre Wiki Tutorial Framework来进行接下来的工作
一个小插曲,下来的压缩包解压之后竟然是一个无后缀文件,猜测还是一个压缩包,加了个rar,成功
一个全新的窗口来到了,呵呵~~~
2, 主循环
读懂了
的大体结构,
重写一个
void TutorialApplication::createScene(void)
{
mCamera->setPosition(Vector3(0,30,-300)); // 摄像机位置
mCamera->lookAt(Vector3(0,0,800)); // 摄像机朝向
// 定义资源的读取目录/文件,dragon.zip 放在执行目录,这个文件可以在OgreSDK\media\packs 目录下找到
ResourceGroupManager::getSingleton().addResourceLocation(
"dragon.zip", "Zip", "General"
);
// 我把script 目录从OgreSDK\media\materials\scripts 复制到执行目录下了,龙的皮肤着色需要用到某个脚本
ResourceGroupManager::getSingleton().addResourceLocation(
"scripts", "FileSystem", "General"
);
// 初始化资源管理器
ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
// 读取龙的模型
Entity * ent = mSceneMgr->createEntity("dragon", "dragon.mesh");
// 把模型放入场景管理器
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
// 开始渲染
SceneNode* node=mSceneMgr->getRootSceneNode();
float scal=1.0f;
}
结果非常顺利,整个三维世界已经触手可及:
(框架封装好了输入控制,可以直接操作摄像机)
3, 接下来,那就让飞龙动起来吧:
结加入代码,获得更多的控制权
:
if(arg.key == OIS::KC_B)
{
m_pNode->showBoundingBox(!m_pNode->getShowBoundingBox());
}
if(arg.key == OIS::KC_Z)
{
m_fScale=1.1f;
m_pNode->scale(m_fScale,m_fScale,m_fScale);
}
else if(arg.key == OIS::KC_X)
{
m_fScale=0.9f;
m_pNode->scale(m_fScale,m_fScale,m_fScale);
}
if(arg.key == OIS::KC_W)
{
m_pNode->pitch(Radian(0.1f));
}
else if(arg.key == OIS::KC_S)
{
m_pNode->pitch(Radian(-0.1f));
}
if(arg.key == OIS::KC_A)
{
m_pNode->yaw(Radian(0.1f));
}
else if(arg.key == OIS::KC_D)
{
m_pNode->yaw(Radian(-0.1f));
}
4,细节
一开始,缩放只能一直缩或者一直放,
看了源代码,发现Orge下的scal的参数传进去是用了个*,
明白之后,传入1.1/0.9,问题解决
接下来,旋转始终有问题,
发现快捷键与现有的摄像机的快捷键有了冲突,
改正之后,还有个问题就是单帧分离开,就是要一直不停的按才可以,这个很郁闷,
打算写个状态,来记录下键位。。。
4, 继续改进
心动不如行动,加入了一个KeyState记录键位信息,
加入Update作为响应:
响应键位变化:
整体操作现在终于变得非常流畅了:
(3)、上帝说,要有光
基本操作都已经实现,那么接下来就加入光影效果吧:
建立一个新工程,这回直接改写基类,上回写的架构太过罗嗦了,
其它基本保持一致,改动createScene,载入模型,加入灯光
void BasicTutorial2::createScene(void)
{
mSceneMgr->setAmbientLight(Ogre::ColourValue(0, 0, 0));
mSceneMgr->setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_ADDITIVE);
Ogre::Entity* entNinja = mSceneMgr->createEntity("Ninja", "ninja.mesh");
entNinja->setCastShadows(true);
//mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(entNinja);
m_pNode->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));
}
Debug it ,只要正确地配好SDK就万事大吉了,
不得不说,Ogre真的是太方便了,想当初自学ShadowVolume和ShadowMap不知死了多少脑细胞,废了多少周折,现在好了,So easy
(4)、骨骼动画
四、实验数据及处理结果
结果均以截图给出,代码,工程附带。。。
五、思考讨论题或体会或对改进实验的建议
代码Ogre真的很简单,尤其是有了一定基础之后,看他的代码真的是一种享受,好吧,再接再厉,继续探索吧!
转载于:https://www.cnblogs.com/Zephyroal/archive/2011/01/29/1947509.html
实验二 建立基本的游戏场景相关推荐
- 实验二、贪吃蛇游戏开发
实验要求 实现贪吃蛇游戏基本功能,屏幕上随机出现一个"食物",称为豆子,上下左右控制"蛇"的移动,吃到"豆子"以后"蛇" ...
- 实验二 贪吃蛇的游戏开发
实验目的: 实现贪吃蛇游戏基本功能,屏幕上随机出现一个"食物",称为豆子,上下左右控制"蛇"的移动,吃到"豆子"以后"蛇" ...
- 软件技术实习项目:实验二、贪吃蛇游戏
目录 1.系统简介 1.1设计背景 1.2开发工具及环境 2.系统分析与设计 2.1设计目的 2.2功能需求 2.3系统功能代码设计 2.3.1包和类的说明 2.3.2简单计算器的源代码清单 3.系统 ...
- 数据结构实验二——建立具有至少10个元素的顺序表或单链表,并能对该表进行查找、删除等基本操作。
结合实际应用,建立具有至少10个元素的顺序表或单链表,并能对该表进行查找.删除等基本操作. //主函数 #include"Sq.h" #include<stdio.h> ...
- Unity 3D 环境特效||Unity 3D 游戏场景设计实例
Unity 3D 环境特效 一般情况下,要在游戏场景中添加雾特效和水特效较为困难,因为需要开发人员懂得着色器语言且能够熟练地使用它进行编程. Unity 3D 游戏开发引擎为了能够简单地还原真实世界中 ...
- Unity_实验二_游戏场景搭建
实验二 游戏场景搭建 实验目的: 掌握游戏场景搭建. 实验要求: 能够使用Unity的地形引擎创建地形,熟悉场景中的光照与阴影,掌握天空盒和雾化效果等. 实验内容: 地形的绘制:使用高度图绘制:使用笔 ...
- 实验二、贪吃蛇的游戏开发
实验二.贪吃蛇的游戏开发 1.实验目的: 开发一个贪吃蛇游戏,吃到食物蛇身增长,蛇头撞到自身和四周墙壁死亡. 2.实验工具 通过Java运行输出. 3.实验内容 预习: 实验要求:实现贪吃蛇游戏基本功 ...
- 【计算机游戏开发】二维游戏场景绘制
github项目地址 一.实验目的与要求 熟悉cocos2d-x开发环境. 了解cocos2d-x中二维游戏场景绘制方法. 掌握瓦片地图编辑器使用方法. 二.实验内容与方法 完成基本实验 (60分) ...
- c语言编简单博弈小游戏,[2018年最新整理]实验二:利用α-β搜索过程的博弈树搜索算法编写一字棋游戏.doc...
[2018年最新整理]实验二:利用α-β搜索过程的博弈树搜索算法编写一字棋游戏 实验二:利用α-β搜索过程的博弈树搜索算法编写一字棋游戏 一.实验目的与要求 (1)了解极大极小算法的原理和使用方法,并 ...
最新文章
- 13 个mod_rewrite 应用举例
- 华为手机 开启LOGCAT
- ASP.NET MVC:4 Ways To Prevent Duplicate Form Submission(转载)
- nrf51822蓝牙芯片ble_app_proximity程序总结
- 【Python】Cookie 和 Session
- The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods install
- 每日一linux命令
- 如何使用SAP Fiori Launchpad Designer
- Zabbix全方位告警接入-电话/微信/短信都支持
- DB2新建编目及删除编目
- NHibernate直接执行SQL进行插入
- 如何配置数据库ODBC数据源
- 数据结构上机实践第11周项目2 - 操作用邻接表存储的图
- 物联网学什么编程语言_物联网要学什么
- bt porting
- 360奇云的架构演进之路
- 求助文章#C语言 #普中51单片机开发板
- 一加手机怎么root权限_一加手机的两种ROOT权限获取教程详解
- 交付管理——怎样管控项目成本
- session里保存什么信息
热门文章
- 网站建设设计的基本事项需了解!
- service层加需要加锁吗_Redis分布式锁,你真的用对了吗?
- doc如何装oracle,在Windows7下安装Oracle.doc
- quartus编译错误不支持芯片_硒鼓粉盒芯片不识别、耗材佘量错误、打印机亮红灯问题解决方法...
- Markdown 语法介绍
- 421. Maximum XOR of Two Numbers in an Array——本质:利用trie数据结构查找
- ios获取软键盘完成事件
- 常看 Shell: 文本文件操作
- Ubbeditor的使用
- Snapchat - give sum target listInteger first who hits target wins