实验五 游戏实体的鼠标选取

实验五 游戏实体的鼠标选取

一、实验内容:

1.     建立一个简单的游戏场景并在场景中建立一些游戏角色;

2.     使用射线场景查询阻止摄像机穿越地面;

3.     使用射线场景查询实现单个游戏角色的鼠标点选和拖放操作;

4.     使用手工对象创建矩形选取框;

5.     使用空间场景查询实现多个游戏角色的鼠标框选和拖放操作;

二、实验目的:

1.       了解射线场景查询的工作原理,熟悉RaySceneQueries类的使用方法及其场景选取中的应用。

2.       了解手工对象的创建方法,掌握ManualObjec类的使用方法。

3.       了解空间场景查询的工作原理,熟悉PlaneBoundedVolume类的使用方法及其场景选取中的应用。

三、实验步骤

1, 框架建立,目标

就参照Ogre的中文Wiki,定下几个目标:

首先,做一点小小的改进,因为每次都要确认初始化设备的窗口很是麻烦,查到了Root有restore这个方法,改进首先,我们想要将鼠标右键绑定到“鼠标观察”模式。不能使用鼠标四下看看是相当郁闷的,所以我们首先对程序增加鼠标控制(尽管只是在我们保持鼠标右键按下时)。

第二,我们想要让镜头不会穿过地表。这会使它更接近我们期望的样子。

第三,我们想要在地表上用鼠标左键点击一下,就在那里增加一个实体。

最后,我们想要能“拖拽”实体。即选中我们想要看到的实体,按住鼠标左键不放,将它移动到我们想要放置的地方。松开鼠标左键,就又会将它锁定在原地。

。。。

第一步很简单,照搬前面实验的框架。

2, 改进CeGUI联通:

使用了0.75版的CeGUI真可谓问题不断,首先建立自己的初始化CeGUI,

clip_image002

读取键位时转化为CeGUi的消息:

clip_image004

把quit的响应消息注册为App的quit函数(注册为监听器里的quit函数时会报错)

clip_image006

在监听器里把鼠标的消息注入CeGui:

clip_image008

Quit函数简单的用了一个m_bQuit变量

clip_image010

当m_bQuit为ture时就退出:

clip_image012

调试后的结果:

clip_image014

3, 地形碰撞检测,摄像机高度

以相机的位置发射一条向量,mRaySceneQuery,得到当前地面的高度,得出相机应处的位置RaySceneQueryResult

clip_image016

视角再不会出现穿刺地面的情况:

clip_image018

4, 地形选择

改正一个bug,在消息处理中最后注入CeGUI消息;

利用Ogre提供的Camera::getCameraToViewpointRay;一个将屏幕上的点击(X和Y坐标)转换成一条可供RaySceneQuery对象使用的射线的好用函数。

得到当前视角的中心的WorldGeometry的位置:

clip_image020

在鼠标移动时如果左键一直按下,移动新的Entity的位置:

clip_image022

结果,如下图:

clip_image024

四、实验数据及处理结果

结果均以截图给出,代码,工程附带。。。

五、思考讨论题或体会或对改进实验的建议

Ogre的能力取决你的想象力

原文地址:https://www.cnblogs.com/Zephyroal/p/1947516.html