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


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

    一、实验内容:

    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的能力取决你的想象力

  • 相关阅读:
    JQuery的js写法
    Reapter 中客户端控件和服务器端控件的选择
    ASP.NET 中随时向页面输入数据
    SQL补充查询
    repeater项模版bottom事件获取该bottom所在行id为lblName的label控件的text
    微软Visual Studio 2010架构设计功能应用
    动态表格
    如何选中jsTree中已checked的Item的信息
    据说看完这21个故事的人,30岁前都成了亿万富翁。你是下一个吗?
    WebSocket编解码器
  • 原文地址:https://www.cnblogs.com/Zephyroal/p/1947516.html
Copyright © 2020-2023  润新知