网站大量收购独家精品文档,联系QQ:2885784924

OpenGL初学者用C#做个3D吞食鱼(一)第一人称视角的实现4WindowsLive.pdf

OpenGL初学者用C#做个3D吞食鱼(一)第一人称视角的实现4WindowsLive.pdf

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
OpenGL初学者用C#做个3D吞食鱼(一)第一人称视角的实现4WindowsLive

OpenGL 入门暨用C#做个3D 吞食鱼(一)第一人称视角的 实现 废话少说先上图: 图表 1 第一人称视角效果图 源代码在文末。 为了学OpenGL,尝试各种代码示例是不错的选择。但是我就经常因为视角不合适又他妈不 能动而看不到画出来的东西!那么做一个类似CS 里面那样第一人称视角的走动功能(前后 左右走,上下走,左右旋转和上下旋转)就是大势所趋啊。 1. 开发环境 本人就喜欢C# 的智能提示、控件和各种自动生成的代码,最适合学OpenGL 、编译原理之类 的新东西用了。于是学OpenGL 也找了C#版的。在codeproject 上有这个SharpGL 的介绍(在 这里),超好用的OpenGL 封装,看一眼就知道是我的菜,我想要的都有了。用法太简单了, 不再具体介绍。 2. 目标 具体的说,我们要实现下面的功能:按键盘的WSAD 或上下左右键,可以实现前后左右移动; 按Q 键,上升(CS 里爬楼梯上楼);按E 键,下降;按住鼠标左键左右移动,镜头跟着左右 旋转;按住鼠标左键上下移动,镜头跟着上下翻转。这是基本功能,具体到工程实现时还会 陆续添加一些必要的辅助功能,到时候再说。 3. 前提条件 问:我们的线索是什么呢? 答:OpenGL 有一个 gluLookAt 函数,是用来设定眼睛、目标和“上方向”的。简单来说, 它的作用就是告诉OpenGL,我们的眼睛在哪儿,眼睛往哪个点看,我们站立的时候从脚到 头是哪个方向。想象一下,你站立在一个地方,眼睛注意看某处一个点,这时,整个映入眼 帘的画面就是OpenGL 要呈现给你的画面了。(额,貌似不需要想象,不是瞎子就行了) 在SharpGL 这个类库里,当然有与之对应的OpenGL.LookAt 函数。所以我们只需要弄清楚在 移动、旋转的时候如何计算眼睛、目标和上方向的三维坐标就行了。 好消息是,上方向(用向量表示)永远设定为(0,1,0)就行了,不需要改变。在SharpGL 里我 们默认Y 轴为上方,X 轴和Z 轴组成了地面。在这个吞食鱼游戏里,游戏地图是从Y 轴正半 轴向上的一小块地方。这就是世界环境的设定了。 如下图表 2SharpGL.LookAt 模型所示,红色(向右的)箭头为X 轴,绿色(向上的)箭头为 Y 轴,蓝色(斜向下的)为Z 轴。黑色箭头的头部表示看向的目标(center ),箭尾为眼睛所 在的位置。为方便起见,我们在后文把黑色箭头都称为“视线”。 图表 2SharpGL.LookAt 模型 PS:虽然视线不是无穷的指向远处的,但这不妨看到碍箭头后面的部分。设定看到的范围的 函数是gluPerspective (SharpGL 里对应OpenGL.Perspective 方法),这不是本文重点,请自行 上百度Google 之。 毫无疑问,第一人称的功能,无非就是设定eye 和center 的值,然后调用一下OpenGL.LookAt 函数就行了。下面我们将详细说明如何实现的。 三维世界少不了三元组这个数据结构,我们先在这里定义出来,省得下文啰嗦。 public struct TriTuple { public double X; public double Y; public double Z; public TriTuple(double x, double y, double z) { // TODO: Complete member initialization this.X = x; this.Y = y; this.Z = z; } public override string ToString() { return string.Format({0:f2},{1:f2},{2:f2}, X, Y, Z); } internal void Add(TriTuple diff) { this.X = this.X + diff.X; this.Y = this.Y + diff.Y;

文档评论(0)

yaocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档