位置: 编程技术 - 正文

OpenGL教程翻译 第十五课 相机控制(二)(opengl英文)

编辑:rootadmin

推荐整理分享OpenGL教程翻译 第十五课 相机控制(二)(opengl英文),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:opengl translate,opengl learning中文,opengl英文,opengl learning中文,opengl英文,opengl learning中文,opengl learning中文,opengl learning中文,内容如对您有帮助,希望把文章链接给更多的朋友!

OpenGL教程翻译 第十五课 相机控制(二)

原文地址: 1、它能够绕向量(0,1,0)进行度旋转,这个角度被称作水平角,而这个向量被称作纵轴;

2、它能够绕着一个平行于地面的轴向上或者向下旋转,这个动作是受限的,它并不能完整地旋转一整个圆,这个角度被称作俯仰角,而这个这个轴被称作水平轴。需要注意的是纵轴保持不变(一直是(0,1,0)),而水平轴则会随着枪进行旋转,并且一直与枪的目标向量垂直,这是获得正确计算公式的关键一点。

我们计划的是让相机随着鼠标的运动而运动,当我们鼠标左右移动时会改变水平角,而当鼠标上下移动时则会改变俯仰角。通过这两个角度我们希望能够计算出目标向量和up向量。

使目标向量转过水平角的方法很简单,使用最基本的三角法则我们会发现目标向量的Z分量是水平角向量的sin&#;,而X分量则是水平角向量的cos&#;(在这个阶段相机只是简单的直接朝向前方,所以其Y分量为0)。大家可以重温第七节中的示意图来理解这一点。

使目标向量转过俯仰角则会复杂的多,因为水平轴会随着相机旋转。水平轴可以通过纵轴和经过水平角旋转之后的目标向量的叉乘求出,但是沿着一个未知向量(将枪上下移动)进行旋转还是十分棘手的。

幸运的是我们有一个十分有用的数学工具——四元数来解决这个问题,四元数在年被爱尔兰数学家Willilam Rowan Hamilton发明出来,它是基于复数的,一个四元数‘Q’可以按下面的方式来定义:

上面等式中的i、j、k都是复数,并且它们满足下面的等式:在实际使用中,我们将四元数定义成一个四维向量,四元数‘Q’的共轭四元数我们定义成如下形式:

四元数的规范化与向量的规范化一样,接下来我们来描述通过四元数来实现将一个向量绕任意向量旋转的步骤。关于这些步骤的数学证明的更多细节能够在网上找到。

一般计算将一个向量‘V’旋转a角度后的四元数‘W’可以用下面的方法:

上面的‘Q’是一个旋转四元数,它可以按照如下方式定义:

在计算出‘W’之后,我们就能直接得到旋转之后的向量(W.x,W.y,W.z)。在计算四元数‘W’的过程中我们需要注意的是:首先我们需要将‘Q’乘上‘V’,这个是四元数与向量相乘,结果是一个四元数,之后我们需要进行一个四元数之间的运算(Q*V的结果与'Q'的共轭四元数相乘)。这两种乘法运算的类型并不相同,在math_3d.cpp文件中包含了这些乘法类型的具体实现。

当用户在屏幕中移动鼠标的时候我们需要不断地更新水平角和俯仰角,并且我们需要决定如何初始化这些&#;。逻辑上我们根据提供给相机构造函数的目标向量的来初始化他们。接下来让我们从水平角开始,首先我们从上俯视XZ平面得到下图:

图中目标向量为(x,z),我们想找出由图中α表示的水平角度(Y分量只与俯仰角有关)。由于图中圆的半径为1,所以我们很容易就能看出α的sin&#;就正好为z,所以计算z的arcsin&#;就能获得α角度的&#;。我们现在就完成了么?当然没有,因为z的范围是[-1,1],所以计算得到的α角度的范围为[-°,°],但是实际上水平角的范围是度。除此之外我们的四元数进行的是顺时针旋转,这意味着当我们使用四元数旋转度时,旋转之后向量与Z轴负方向重合并且其sin&#;为-1,但这刚好与度的sin&#;相反(sin = 1)。最简单的解决办法,就是我们只计算z的绝对&#;的arcsin&#;,之后将结果与向量所在的位置的四分之一圆相结合。例如,当我们的目标向量为(0,1)时,我们计算出1的arcsin&#;为,之后我们从度中减去它,结果为度,[0,1]范围之间的arcsin&#;对应[0,]度之间的角度,结合这个计算出来的角度以及已经确定的向量所处的四分之一圆,我们就能得到最终的水平角。

计算俯仰角则比较简单,我们将俯仰角的范围限定在-度(等于度——向上看)到&#;度之间(向下看)。这意味着我们只需要计算target向量的y分量的asin&#;,然后取反,例如Y=1时asin&#;为度,取反-度,此时看向上,Y=-1,为-度,取反,度,此时看向下

Code Walkthru

Camera的构造函数现在接受传入的窗口尺寸作为参数,这是因为我们需要将鼠标移动到屏幕的中心点。此外,注意Init()函数的调用,它完成了camera内部属性的设置。

在Init()函数中我们从计算水平角开始,我们新创建一个目标向量HTarget(水平目标)——真实目标向量在XZ平面上的投影。之后我们对其进行规范化(这是因为我们在之前的推导过程中就假设是在XZ平面上的一个单位向量)。接下来,我们会检测target向量在哪一个1/4圆里,并利用z分量的绝对&#;计算得到最后的水平角。接下来,我们计算俯仰角,这简单多了。

在camera类中我们新增了四个标记变量来表示鼠标是否处于屏幕的某一个边界上面,当我们鼠标处于某一个边界时,相机会自动朝着那个对应的方向转动,这使得我们能够进行度的旋转。我们将这个四个标记变量都初始化为FALSE,这是因为鼠标最开始是位于屏幕中心的。接下来的两行代码用于计算屏幕的中心坐标(基于屏幕的尺寸),而glutWarpPointer函数则用于移动鼠标。

这个函数用来将鼠标的移动信息通知相机,传入的参数x,y是鼠标在屏幕上的位置,delta是当前鼠标位置和上次鼠标位置的差,我们分别计算x和y方向的delta,计算完后,我们会把当前的鼠标位置保存在m_mousePos变量中以便下次调用。接下来,我们使用缩放之后的delta&#;来更新相机的水平角和俯仰角,这里我们使用的缩放因子对于我的电脑是刚好合适的,但是对于不同的电脑可能会需要不同的缩放因子。在后面的教程中当我们将帧速作为一个缩放因子时将会完善它。

OpenGL教程翻译 第十五课 相机控制(二)(opengl英文)

之后我们根据鼠标的位置来更新'm_On*Edge'标记变量,标记变量在默认情况下被设置为像素,当鼠标位于某一个边缘时,它就会触发我们的边缘动作。最后,我们调用Update()函数基于水平角和俯仰角来重新计算目标向量和up向量。

这个函数在主函数的渲染循环中被调用,我们需要在鼠标位于屏幕中的某一个边缘时并且不再移动时使用这个函数,在这种情况下,并没有鼠标事件发生但是我们却希望相机继续移动(直到鼠标离开边缘)。我们检查是否某一个标记变量被设置,并且更新对应的角度。而当鼠标离开窗口的时候我们在鼠标事件处理中会监听到这一事件并且清除标记变量。注意俯仰角的角度是限定在-到&#;之间的,这是为了防止我们向上或者向下旋转一整圈。

这个函数根据水平角和垂直角更新target和up向量。在开始之前我们就将view向量重置,这表示这个view向量平行于地面(俯仰角为0),并且指向右方(水平角为0)。我们将纵轴设置为竖直的指向上方,通过水平角使view向量绕纵轴旋转,由此得到结果总是大致指向要观察的物体,但摄像机指向的高度却不一定正确(比如位于XZ平面上),我们通过使用垂直轴和view向量做一个叉积,得到一个位于XZ平面上并且与view向量与纵轴所组成的平面垂直的向量,而这就是我们新的水平轴,现在我们就可以根据俯仰角使view向量绕着水平轴进行旋转了。最终的view向量就是我们的目标向量了,之后我们只要将其设置到相应的相机参数中即可。最后我们还要修正up向量,例如当相机向上翘起,那么up向量也需要向后翘起(up向量必须与目标向量成度)。就像我们抬头看天空时候,我们的头必须向后仰。新的up向量我们可以通过target向量和新的水平轴叉乘得到。如果俯仰角仍旧为0,那么目标向量还是会处于XZ平面上,并且up向量也仍旧是(0,1,0)。如果目标向量向上或者向下翘,那么up向量也会相应的向后或者向前。

(tutorial.cpp:)

glutGameModeString("x@");glutEnterGameMode();

这个glut函数使得我们能够在被称作的高性能模式“游戏模式”下进行全屏运行,这使得相机旋转度变得更加容易,因为我们所需要做的仅仅就是将鼠标移动到屏幕边缘即可。注意:分辨率和像素&#;式都是通过这个字符串定义的,每个像素位提供了渲染时的最大颜色数,

(tutorial.cpp:)

pGameCamera = new Camera(WINDOW_WIDTH, WINDOW_HEIGHT);

我们在此动态的创建一个相机对象,这是因为它要执行一个glut函数(glutWarpPointer),如果glut没有进行初始化,则此调用会失败。

(tutorial.cpp:)

glutPassiveMotionFunc(PassiveMouseCB);glutKeyboardFunc(KeyboardCB);

在这里我们注册了两个glut回调函数,其中一个是为了捕捉鼠标事件,另一个则是为了常规的键盘按键捕捉(特殊按键回调函数用于捕捉方向键以及功能键事件)。Passive运动表示鼠标只是进行移动而没有任何按键事件发生。

现在我们使用全屏模式,退出程序则变得比较困难了。按键回调函数会捕捉‘q’键的按下事件并使的程序退出,鼠标回调函数则仅仅是将鼠标位置传递给相机。

(tutorial.cpp:)

static void RenderSceneCB(){ pGameCamera->OnRender();

无论何时,我们进入主循环的时候必须通知相机,这使得我们的相机能够在鼠标处于屏幕边缘并且不移动的时候继续旋转。

VS OpenGL 配置 VSOpenGL配置(--::)转载▼标签:vsopengl配置glutit分类:C来源:

Windows 7 OpenGL配置,解决“无法启动此程序,因为计算机中丢失glut.dll。” OpenGL的配置相信在网上搜索一下会有很多相关的信息,大多是VC6.0或者位VS下的设置。简单陈述如下:系统:windows7旗舰版(位/位)开发环境:VS

二 OpenGL的VS环境配置 网上有不少教程都说要把下载下来的库放到系统中,像我这样有代码洁癖的人,是不容污染系统库的,所有就有了下面这篇博客。一下载地址:

标签: opengl英文

本文链接地址:https://www.jiuchutong.com/biancheng/369558.html 转载请保留说明!

上一篇:一 OpenGL数据类型和简单绘制(opengl数据类型)

下一篇:VS2008 OpenGL 配置(在vs中搭建opengl环境)

  • 税务师考试考几门几年考完
  • 售卖会卡,达标返现,怎么进行账务处理
  • 缓交的社保费,包括个人部分
  • 收到红字进项发票需要认证么
  • 电子税务局怎么添加购票人
  • 代扣代缴境外企业增值税
  • 房屋租赁费属于什么会计分录
  • 营改增账务处理实例
  • 销售的行为
  • 实收资本印花税是一年一交吗
  • 补去年的税款怎么做账
  • 企业股东变更需要哪些手续
  • 企业注销后款项怎么结算
  • 未开票收入可以填写负数吗
  • 单位买酒报销如何做账
  • 事业单位开发成本占比
  • 速动资产不包括存货和预付账款
  • 经营租赁中出租人发生的初始直接费用是指
  • 是否所有监控设备都录像
  • 工会账户销户
  • 财务费用余额在借方是正数还是负数
  • windows11下载后怎么安装
  • 如何编制处置固定资产
  • 多计提的房产税怎么做分录
  • 开票的附加税是多少
  • win11任务管理器怎么没有了
  • 公积金提取条件和标准
  • 库存现金的含义及特点
  • 安代驾给我发短信
  • 未分配利润进行利润分配分录
  • umi ts
  • win7系统笔记本无线网络找不到
  • 用tomcat部署web项目
  • vuemvvm模式
  • lvm 创建
  • vports命令
  • 视同销售收入税法处理?
  • 购买图书可以开增值税专票么?
  • 无偿划转的资产交什么税收
  • 收到的免税苗木发票必须当月抵扣么
  • 国家税务总局关于营改增后土地增值税
  • 混合销售如何做会计分录
  • 社保减免财务账务处理
  • 营业外支出的内容包括
  • 税务申报残保金
  • 下列项目的进项税额可以从销售税额中抵扣的是
  • 合同权益如何进行转让
  • 其他应付款转出的会计分录
  • 当期免抵税额和免抵退税额的区别
  • 社保计提少了怎么办
  • 固定资产核算的内容主要包括
  • 贴现凭证如何做账务处理
  • 股权转让如何办理
  • 外贸企业面对人民币升值应该采取什么的避险措施
  • 工会经费计提按照应发工资还是实发工资
  • 年平均资金占用额公式
  • 资产负债表中的应交税费包括什么
  • windows10x预览版
  • xp系统百度
  • centos6安装yum源
  • ubuntu20.10安装教程
  • 如何打开mac系统终端
  • seg是什么文件
  • linux windows转linux
  • win10系统附件在哪里
  • win7怎么禁止程序自启动
  • Linux VPN 出现 807 错误的解决办法
  • java 解析javascript
  • pycharm远程调试linux
  • perl pi
  • 引用javascript外部脚本的正确写法
  • thread python
  • unity怎么弄游戏小地图
  • node cgi
  • shell脚本 -ne 0
  • jquery trigger实现联动的方法
  • python魔法方法有啥用
  • js获取图片的宽高
  • 无锡税务局领导
  • 税务管理工作检讨书范文
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设