位置: 编程技术 - 正文

OpenGL编程逐步深入(六)平移变换(opengl 编程)

编辑:rootadmin
准备知识

推荐整理分享OpenGL编程逐步深入(六)平移变换(opengl 编程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:opengl编程精粹,简述opengl的编程步骤,opengl编程基础,opengl 编程,opengl例程,opengl例程,opengl编程语言,opengl编程基础,内容如对您有帮助,希望把文章链接给更多的朋友!

从这一节我们开始接触3D对象各种各样的变换,使其显示在屏幕上看起来有深度的感觉。通常每一种变换都是通过矩阵来实现的,把这些变换矩阵逐个的乘起来,然后用乘积乘以顶点位置。在每个教程中,我们致力于研究一种变换。

这里我们看一下平移变换,它负责把一个对象沿着一个向量移动一定的方向和距离。比如说你想把三角形从左图的位置移动到右图的位置。

一种做法是在shader中提供一个uniform变量类型的偏移向量,本例中为(1,1),把它和每个待处理的顶点位置相加。然而,这中做法破坏了把一组变换矩阵逐个乘起来获得一个综合的变换矩阵的方法。另外,你將会看到平移变换通常不是第一步变换,因此在平移之前需要用一个矩阵乘以顶点位置的形式来表示该变换,然后和顶点位置相加。这样做显得比较麻烦,一种更好的做法是我们可以找到一个矩阵代表平移变换,然后用它乘上其他变换矩阵。但是你能找到一个矩阵,当乘以三角形左下角的点(0,0)使其结果变为(1,1)吗?事实上使用2维矩阵没法做到。一般来说我们需要一个矩阵M对于给定的一个点P(x,y,z)和一个平移向量V(v1,v2,v3)有M*P=P1(x+v1,y+v2,z+v3)。在P1中我们可以看到每一个分量是P中的分量与对应的V中分量的和。单位矩阵具有这样的性质:I * P = P(x,y,z)。我们需要在单位矩阵的基础上进行修改使得每个分量的结果类似于(…+V1, …+V2, …+V3),最终我们找到的矩阵形式如下:

从这个计算结果我们可以得到两个结论。 1.a,b,c,d,e和f必须为0,否则每两个分量都会对第三个分量有影响。 2.当x,y,z都为0时,结果也为0向量,也就是说我们没办法把(0,0,0)点通过这种方式平移到其他点。

我们想要找到一个矩阵使得右边具有以下的计算结果:

我们需要通过一种方法將v1,v3,v3加上去,这样a-f就可以为0了,因此我们需要在矩阵中添加第四列,由于3x4阶矩阵和3x1阶矩阵不能直接相乘,我们需要將平移向量中也添加一个分量,该分量的值最好为1,这样我们用v1,v2,v3和第四个分量相乘的时候值才不会变。我们目前的矩阵仍然不是最好的,我们通常用一个4x4阶矩阵作为变换矩阵。最终的变换矩阵如下图所示: (注意:原文对矩阵的描述中有一些错误,图也是错的,这里笔者更正了一下)

项目配置

参考前面的文章。

程序代码

清单1.主程序 tutorial.cpp代码

代码解读OpenGL编程逐步深入(六)平移变换(opengl 编程)

我们在上一节代码基础上进行修改,这里只对关键代码进行讲解。

该结构体在ogldev_math_3d.h头文件中定义,我们几乎所有的变换矩阵都用它表示。

我们用这个句柄访问shader中定义的uniform变量。

我们准备一个变换矩阵,將v2,v3值设为0,确保它在y/z方向上的位置不发生变换,將v1设为正弦函数的返回值,所以图形会在x方向做“单摆运动”。接下来我们需要將矩阵加载到shader中。

还有一组类似的 glUniform*函数用来將数据加载到shader的uniform变量中。上面这个特定的函数用于加载4x4阶矩阵,还有对应的2x2, 3x3, 3x2, 2x4, 4x2, 3x4 和 4x3版本。第一个参数是uniform变量的位置。第二个参数表明我们要更新矩阵的数量,这里我们只有一个矩阵,所以参数值为1。第三个参数对于新手来说会产生困惑,它表明矩阵是行主序还是列主序。行主序表明矩阵是从上到下一行一行的在内存连续区域存放,列也类似。c/c++语言中默认为行主序。这决定了二维数组元素在内存中的分布情况。

清单2. shader.vs代码

这里定义了一个表示4x4阶矩阵的uniform 类型变量。

三角形的顶点位置在顶点缓冲区中为3分量,我们需要第四个分量并将其值设为1。有两个选择:將顶点缓存区中放置四个分量的顶点或者在vertex shader增加一个分量。这里我们采用第二种,这样做效率也会更高。

编译运行

你將会看到三角形左右不停移动。

Android OpenGL ES绘图教程之四 :投影和相机视图变换 在OpenGLES环境中,投影和相机视图可以使被绘制的对象在某种方式上看起来更像实际的物体,这个模拟实际对象的场景是通过被绘制对象坐标的数学转换

Android OpenGL ES绘图教程之五 :加入运动 在屏幕上面绘制对象是OpenGL的一个非常好的基本功能,但是你也可以在其他的Android图形框架上面实现这些功能,比如Canvas和Drawable对象。OpenGLES提供了额

Android OpenGL ES绘图教程之六 :响应触摸事件 使对象根据预设的程序进行运动,比如旋转三角形,可以吸引人的注意力。但是如果你想让用户同你的OpenGLES图形进行交互会怎么样呢?使你的OpenGLES应

标签: opengl 编程

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

上一篇:Android OpenGL ES绘图教程之二 : 定义形状(android skia opengl)

下一篇:Android OpenGL ES绘图教程之四 :投影和相机视图变换(android opengles2.0教程)

  • 非营利组织免税资格认定申请表
  • 计提利息要计提手续费吗
  • 小规模公司的外汇业务
  • 公立幼儿园保育员好进吗
  • 季中转一般纳税人申报步骤
  • 电子税务局税种认定怎么操作
  • 税务等级低有什么影响
  • 企业统计报表怎么写
  • 设计服务需要交文化建设费吗
  • 委托加工物资属于在产品吗
  • 厂房房产税如何计算
  • 房地产出租是否缴纳土地增值税
  • 企业所得税扣除项目及标准
  • 现金折扣税前扣除
  • 工业企业哪些房子要交房产税
  • 稳岗补贴需要交个税吗
  • 喷绘制作费的税率
  • 房产税计税依据房产原值怎么算
  • 稳岗补贴需要缴税吗
  • 进项税的现金流怎么填
  • 工商年报员工人数怎么算
  • 资产评估溢价部分如何处理?
  • 以前年度记账错误
  • 工资非自然月怎么计算
  • 专票电话写错了怎么办
  • 车船使用牌照税收多少
  • 股份支付的会计处理?
  • 建安企业核定征收改查账征收后怎么处理账目
  • 企业以盈余公积转增资本,会引起所有者权益总额的变动
  • 苹果电脑安装中国银行控件用不了
  • 网页游戏玩着卡
  • 机械设备购置的程序是什么
  • SSDP Discovery Service 是什么可以禁用吗
  • 代理买卖证券款属于什么科目
  • 什么企业需要预缴所得税
  • 委托代销商品两种方式会计分录
  • 超图的应用举例
  • 集团对子公司拨款的规定
  • 专用发票抵扣联是什么意思
  • elasticsearch基本概念
  • 爬虫失败的原因
  • 金融资产的会计科目
  • 爬虫技术是做什么的
  • 发票已认证未抵扣,开红字发票信息表后,愿票需要退回吗
  • 累计净值是怎么计算的
  • 公司开发新产品的建议
  • 什么叫日常业务
  • 企业增值税包含哪些税项及税率
  • 增值税专票已经认证了还能退吗
  • 工程物资残料价值
  • 单位食堂用餐免费的账务处理
  • 建筑企业需要缴纳的税种
  • 进项大于销项会退税吗
  • 防伪公司应该选用什么目标市场策略
  • 在建工程账务处理问题有哪些
  • mysql的心得体会
  • win7系统IE浏览器打开跳转到360浏览器,怎么阻止
  • Win10预览版拆弹
  • linux pptp客户端
  • win7系统屏幕一直闪怎么办
  • ubuntu 4.10
  • u盘 macbook
  • centos7网卡强制千兆
  • ubuntu系统怎么用
  • win7英语
  • winxp截图快捷命令
  • win7电脑全屏
  • perl 获取数据库查询结果
  • unity项目怎么运行
  • 批处理命令教程
  • div-css
  • javascript教程推荐知乎
  • shell脚本wc
  • unity资源库
  • jquery遍历object
  • qrcode怎么生成
  • 个税申报系统如何增加新单位
  • 工商与税务合并了吗
  • 房产税江苏2021年征收标准
  • 网上办税服务厅
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设