实验五 游戏实体的鼠标选取
实验五 游戏实体的鼠标选取
一、实验内容:
1. 建立一个简单的游戏场景并在场景中建立一些游戏角色;
2. 使用射线场景查询阻止摄像机穿越地面;
3. 使用射线场景查询实现单个游戏角色的鼠标点选和拖放操作;
4. 使用手工对象创建矩形选取框;
5. 使用空间场景查询实现多个游戏角色的鼠标框选和拖放操作;
二、实验目的:
1. 了解射线场景查询的工作原理,熟悉RaySceneQueries类的使用方法及其场景选取中的应用。
2. 了解手工对象的创建方法,掌握ManualObjec类的使用方法。
3. 了解空间场景查询的工作原理,熟悉PlaneBoundedVolume类的使用方法及其场景选取中的应用。
三、实验步骤
1, 框架建立,目标
就参照Ogre的中文Wiki,定下几个目标:
首先,做一点小小的改进,因为每次都要确认初始化设备的窗口很是麻烦,查到了Root有restore这个方法,改进首先,我们想要将鼠标右键绑定到“鼠标观察”模式。不能使用鼠标四下看看是相当郁闷的,所以我们首先对程序增加鼠标控制(尽管只是在我们保持鼠标右键按下时)。
第二,我们想要让镜头不会穿过地表。这会使它更接近我们期望的样子。
第三,我们想要在地表上用鼠标左键点击一下,就在那里增加一个实体。
最后,我们想要能“拖拽”实体。即选中我们想要看到的实体,按住鼠标左键不放,将它移动到我们想要放置的地方。松开鼠标左键,就又会将它锁定在原地。
。。。
第一步很简单,照搬前面实验的框架。
2, 改进CeGUI联通:
使用了0.75版的CeGUI真可谓问题不断,首先建立自己的初始化CeGUI,
读取键位时转化为CeGUi的消息:
把quit的响应消息注册为App的quit函数(注册为监听器里的quit函数时会报错)
在监听器里把鼠标的消息注入CeGui:
Quit函数简单的用了一个m_bQuit变量
当m_bQuit为ture时就退出:
调试后的结果:
3, 地形碰撞检测,摄像机高度
以相机的位置发射一条向量,mRaySceneQuery,得到当前地面的高度,得出相机应处的位置RaySceneQueryResult
视角再不会出现穿刺地面的情况:
4, 地形选择
改正一个bug,在消息处理中最后注入CeGUI消息;
利用Ogre提供的Camera::getCameraToViewpointRay;一个将屏幕上的点击(X和Y坐标)转换成一条可供RaySceneQuery对象使用的射线的好用函数。
得到当前视角的中心的WorldGeometry的位置:
在鼠标移动时如果左键一直按下,移动新的Entity的位置:
结果,如下图:
四、实验数据及处理结果
结果均以截图给出,代码,工程附带。。。
五、思考讨论题或体会或对改进实验的建议
Ogre的能力取决你的想象力