位置: 编程技术 - 正文

OpenGL教程翻译 第十四课 相机控制(一)(opengl learning中文)

编辑:rootadmin

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

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

OpenGL教程翻译 第十四课 相机控制(一)

原文地址: vector和 up vector都不受影响。

控制键盘我们用到另一个GLUT API:glutSpecialFunc()。当一个“特定”键被敲击的时候,这个函数就会注册一个因之触发的回调。这些特定的键包括:功能键、方向键和PAGE-UP/PAGE-DOWN/HOME/END/INSERT键。如果你想要捕获常规键(字符或者数字),那么请使用glutKeyboardFunc()。

Code Walkthru

相机的功能封装在相机类内。这个类存储相机的属性,并且可以通过接收到的移动事件改变这些属性。管线类获取这些属性并通过它们产生变换矩阵。

(Camera.h)

class Camera

{public: Camera(); Camera(const Vector3f& Pos, const Vector3f& Target, const Vector3f& Up); bool OnKeyboard(int Key); const Vector3f& GetPos() const const Vector3f& GetTarget() const const Vector3f& GetUp() constprivate: Vector3f m_pos; Vector3f m_target; Vector3f m_up;};

这是相机类的声明。它存储着定义相机类的三个属性——位置向量、target vector 和up vector。有两个构造函数。默认的那个构造函数简单地将相机摆放在从原点看向Z轴正方向,up向量指向“天空”(0,1,0)点位置。我们还可以选择创建一个具有特定属性&#;的相机。OnKeyboard()函数给相机类提供了键盘事件。它返回一个布尔&#;用来显示该事件是否由相机类接受。如果点击的按键与我们定义的响应事件相关,则返回true,否则返回false。这样,你可以建立一条客户端链用来接收键盘事件,在获取响应特定事件的第一个客户端后停止。

(Camera.cpp:)

bool Camera::OnKeyboard(int Key){ bool Ret = false; switch (Key) { case GLUT_KEY_UP: { m_pos &#;= (m_target * StepSize); Ret = true; } break; case GLUT_KEY_DOWN: { m_pos -= (m_target * StepSize); Ret = true; } break; case GLUT_KEY_LEFT: { Vector3f Left = m_target.Cross(m_up); Left.Normalize(); Left *= StepSize; m_pos &#;= Left; Ret = true; } break; case GLUT_KEY_RIGHT: { Vector3f Right = m_up.Cross(m_target); Right.Normalize(); Right *= StepSize; m_pos &#;= Right; Ret = true; } break; } return Ret;}

OpenGL教程翻译 第十四课 相机控制(一)(opengl learning中文)

这个函数根据键盘事件移动相机。GLUT定义了与方向键相应的宏命令,而上面的switch语句正是基于此。不幸的是,这些宏定义的类型都是只是“int”类型,而不是枚举类型。

向前向后的移动是最简单的。因为移动总是沿着target vector,我们就只需要让当前位置加上或者减去target vector就可以了。target vector本身不改变。注意,在加上或者减去target vector之前,我们用一个叫做“StepSize”的常数来缩放它。对所有的方向键,我们都做如此处理。StepSize提供了一个改变速度的中心点(在后面我们也许将会把这个&#;添加到类属性中)。为使步长一致,我们要确保我们总是乘上单位长度的向量(即我们必须确保目标和up向量是单位长度的)。

向侧面移动有些复杂。这是一种沿着垂直于target vectors和 up vectors所确定的平面的矢量的移动。这个平面将三维空间分成了两个部分,并且有两个向量垂直于它,这两个向量方向相反。我们称其中的一个向量为“left”,另一个为“right”。这两个向量是由target vectors和 up vectors的叉积的两种可能的组合分别产生的——target vectors×up vectors和up target vectors×target vectors(叉积运算没有交换律——也就是说,在叉积运算中,改变参数的顺序会得到不同的结果)。得到left/right向量之后,我们用StepSize常量将其规范化,用StepSize放缩,最后添加到position(可以将相机向左右方向移动)上。此外,target vectors和up vectors没有受到影响。

注意,这个函数的内部操作里使用了一些新的运算符,比如被添加到Vector3f类中的“&#;=”和“-=”。

(tutorial.cpp:)

static void SpecialKeyboardCB(int Key, int x, int y){ GameCamera.OnKeyboard(Key);}static void InitializeGlutCallbacks(){ glutDisplayFunc(RenderSceneCB); glutIdleFunc(RenderSceneCB); glutSpecialFunc(SpecialKeyboardCB);}

这里,我们注册一个新的回调函数来处理特殊的键盘事件。在按键被触发的时候,回调函数接收按键和鼠标的位置信息。我们忽略鼠标的位置,并且把这个事件传递给成相机类的一个实例,这个实例早已分配给该文件的全局部分。

(tutorial.cpp:)

p.SetCamera(GameCamera.GetPos(), GameCamera.GetTarget(), GameCamera.GetUp());

以前,我们在管线类中用硬编码的向量初始化相机参数。现在,我们不再使用这些向量,而是从Camera类直接获取相机属性。

OpenGL--动作管理 目前,我在做一个计算机图形学的project,要求做一个可以移动控制的简易机器人。因而开始学习OpenGL。今天,先来研究一下如何给2D/3D图形添加动作。

GLUT函数说明 注:本文转自:

[转]OpenGL学习网站及资料 --7阅读评论0原文出处:

标签: opengl learning中文

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

上一篇:opengl的初始化(VS2013 MFC)(初始化opengl时出错)

下一篇:OpenGL--动作管理(opengl控制物体移动)

  • 电动三轮车发票和合格证丢了怎么上牌照
  • 自来水适用高税率吗
  • 金融债券的利息收入
  • 付国外专利费用需办什么手续
  • 五月份有啥节日2020
  • 定期定额不开票违法吗
  • 个人承包工程如何避税
  • 项目固定资产投资强度
  • 利润表中的其他综合收益
  • 小规模纳税人的增值税账务处理
  • 企业给职工交的养老金哪里去了
  • 股权转让涉及房屋产权变更怎么办
  • 平销返利如何开红字发票
  • 应付账款不用付怎么处理
  • 融资贷款保险费计算公式
  • 收到报废车款要交什么税
  • 一个人有多份工作
  • 个体工商户地税没有申报罚款多少
  • 承包学校的食堂如何纳税
  • 个人所得税承租承包经营所得
  • 提高主营业务收入的意义
  • 残疾人保障金中上年在职职工人数怎么计算
  • 土地增值税允许扣除的评估价
  • 这个月只开了销项负数怎么办
  • 新注册的公司用不用开公户
  • 遇到境外网络勒索敲诈怎么办
  • 派遣员工发生工伤这钱谁出
  • 小规模企业记账软件哪个好
  • 不能取得发票的财务费用怎么做明细好一点
  • u盘安装pe系统
  • php可以连接access吗
  • 域名服务费属于什么会计科目
  • win10怎么清理剪切板
  • 采用销售百分比法预测对外
  • 固定资产更新改造支出计入什么科目
  • 子公司之间能否相互承包工程
  • 在php中,字符串有哪些表示形式
  • php文本分割
  • 阿尔比恩洞的级别
  • 专家评审费可以由中标人支付吗
  • 第一章 使用layui的表格和表单
  • CV攻城狮入门VIT(vision transformer)之旅——VIT原理详解篇
  • css面试题及答案
  • Diffusion models代码实战:从零搭建自己的扩散模型
  • idea 创建maven项目读取pom报错
  • php数据表
  • 航天金税盘维护费什么时候交
  • 银行的抵债资产是否需要缴纳房产税
  • 债权资产包括哪些会计科目
  • phpcms模板制作教程
  • 公司出现质量问题员工怎么处理
  • 还款利息
  • 会计凭证分为几个部分包括哪些内
  • 公司开普票和专票税率一样吗
  • mysql配置怎么调出来
  • 企业注册资本的规定
  • 收到政府补助的会计分录
  • 房地产企业沙盘模拟
  • 会计工资标准
  • 实缴出资未注明投资款
  • 专票错误已认证需要退回吗?
  • 来料加工企业的辅助材料自购怎开销售发票
  • sqlserver解锁用户命令
  • SQL Server 2005/2008 用户数据库文件默认路径和默认备份路径修改方法
  • 跨服务器访问数据库
  • 微软9月22
  • 服务器控制电脑
  • Win8系统网络SSID怎么设置?Win8设置网络SSID的方法
  • xp系统怎么打开开机启动项
  • linux012
  • unity软件设计
  • javascript的核心
  • OpenGL图元管理
  • [置顶]公主大人接下来是拷问时间31
  • jquery轮播代码
  • 河北省税务总局电话
  • 异地如何拨打12393
  • 竣工交付的资产有哪几种
  • 四川成都离剑门多远
  • 深圳国税咨询电话是多少
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设