投影矩阵 视图模型矩阵「建议收藏」

投影矩阵 视图模型矩阵「建议收藏」
    OpenGL在设置场景时,要用到两个矩阵:投影矩阵和模型视图矩阵通过glMatrixMode来指定下面的矩阵操作是针对哪一个矩阵进行的。
    gluLookatup,glTranslate,glRotate,glScale,glOrtho,gluPerspective等函数只根据其参数计算出一个矩阵M,然后与当前的栈顶元素T相乘;但这些函数本身不能自动找到应该对应的矩阵堆栈,你可以将它们放在任何矩阵堆栈操作中,比如可以将gluLookatup放在glMat

大家好,又见面了,我是你们的朋友全栈君。

     OpenGL在设置场景时,要用到两个矩阵:投影矩阵 和 模型视图矩阵通过glMatrixMode来指定下面的矩阵操作是针对哪一个矩阵进行的。

     gluLookatup,glTranslate, glRotate, glScale, glOrtho ,gluPerspective 等函数只根据其参数计算出一个矩阵M,然后与当前的栈顶元素T相乘;但这些函数本身不能自动找到应该对应的矩阵堆栈,你可以将它们放在任何矩阵堆栈操作中,比如可以将gluLookatup放在glMatrixMode(GL_PROJECTION)的后面,则视点矩阵与投影矩阵堆栈的当前栈顶元素相乘得到一个新的投影矩阵,这样在某些情况下也可以得到正确的结果,但之后可能出错,若设置glMatrixMode(GL_MODELVIEW);glLoadIdentity();

本应该将视图模型矩阵单位化,即消除之前视点矩阵所产生的视点变换,但是之前的视点矩阵保存到了投影矩阵中,所以此时视点矩阵变换仍会产生作用。

因此,最好按照Red Book中的规定,将glOrtho,gluPerspective放在投影矩阵中,gluLookatup,glScale等放在视图模型矩阵中。

在代码中,视图(点)变换应该出现在模型变换之前,令模型变换首先作用于顶点,即

因为实际的变换顺序与代码的顺序是相反的,设顶点v

模型视图矩阵的顺序依次为 I, E, ET, ETS, ETSR, 经过变换的顶点是ETSRv,因此,顶点变换就是E(T(S(R.v))),顶点顺序是按照相反顺序发生的,而不是按照它的指定顺序(实际上,一个顶点与模型视图矩阵的乘法只出现一次,E,T,S,R,在应用于v之前已经与一个矩阵相乘)。(OpenGL为列主序矩阵,转置)

但可以在绘图之前的任何时候执行投影变换和视口变换。

视锥体的设置:

投影变换创建了一个六面体,位于视锥体内的模型才能被看到,而外面的模型则被裁剪掉。

gluPerspective , gpOrtho的参数均是相对于视点(eye)位置及视线方向(at-eye)的,即将视点位置是做(0,0,0)视线方向指向Z轴负方向,Up为Y轴正方向,参数为相对这些坐标的相对位置值。

gluPerspective的参数比较好理解,其near 和 far 值必须都为正,且far 大于 near值。

对于glOrtho的参数表示近侧裁剪面的左下角点(left, bottom, -near) 和 右上角(right, top , -near),远侧裁剪平面上的左下角点(left, bottom, -far) 和 右上角点(right, top , -far)。注意near far 的符号。

near far 可以为正值或负值,或一正一负,一负一正,或为0,当应该取不同的值。

对于平行投影(glOrtho)视点(eye)的位置既可以位于视锥体内,同样也可以位于视锥体的前面或者后面,而且由near平面到far平面的方向也不一定与视线方向一致,可以相反。near far 平面中的任意一个可以位于视点的前面,后面或者视点处,只要模型位于视锥体内就可以看到,而视点此时只是确定了观察的方向,及确定了视锥体在空间中的位置,除此外,不影响观察的结果。

如视点位于(0,0,5),at点位于(0,0,10),up不变,near 为 -2 ,far 为 -5,则此时的观察方向为Z轴正向,视锥体在三维空间中的实际near far 平面为 Z = 3, Z = 0,此时Z坐标位于(0,3]的点均可以被看见,而此时视点位于视锥的外面,near到far平面的方向与视线方向相反。(相对于(0,0,0),near平面为Z = 2, far平面为Z = 5,变换到视点位置(0,0,5),near 平面为Z =  3, far平面为Z = 0 ,)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/146613.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Mybatisplus 相关操作之 IService BaseMapper ServiceImpl 简单应用

    本篇主要介绍mybatisplus的简单应用这里对mybatisplus中配置遇到的问题及extent、implement所导入的包也为大家方便引入依赖1引入相关依赖依赖只是参考,每人的仓库不同,代码块内容仅作参考<dependencies><dependency><groupId>org.springframework.boot</groupId><artifac

    2022年4月8日
    89
  • 惠普硬盘型号怎么看_惠普电脑序列号查询真伪

    惠普硬盘型号怎么看_惠普电脑序列号查询真伪大家都知道电脑使用起来非常方便,但遇见硬盘序列号怎么看的时候就非常头疼了,如果你是第一次遇到硬盘序列号怎么看,怎么样才能快速解决硬盘序列号怎么看带来的烦恼呢?小编为大家收集了很多关于硬盘序列号怎么看问题的解决方法,下面请看具体的解决方法步骤:如何查看电脑硬盘序列号问:惠普电脑的XP系统答:第一步单击【开始】→【运行…】,输入cmd第二步输入diskpart,按回车键第三步输入list…

    2022年8月13日
    14
  • java typereference_记录一下jackson中TypeReference的使用

    java typereference_记录一下jackson中TypeReference的使用今天在看到项目中有一段代码是将string字符串转化成对象,需要被转化成对象的类加了TypeReference,随即去百度了下。TypeReference是一个抽象类,继承了Comparable接口。里面的Type是一歌接口。贴上代码:mapper.readValue(station.getGasPrice(),newTypeReference>(){});TypeReference可以…

    2022年6月16日
    31
  • 逆向 Framework.jar

    逆向 Framework.jar

    2021年12月15日
    45
  • scipy安装_scipy安装成功了就是用不了

    scipy安装_scipy安装成功了就是用不了1.最后正确的方法:pip升级后安装pipinstall–upgradepippipinstallscipy2.中间的报错及尝试方法:尝试1:pipinstallscipy问题1:numpy.distutils.system_info.NotFoundError:NoBLAS/LAPACKlibrariesfound.Note:Accelerateisnolongersupported.尝试2:gitclonehttps://gi

    2025年8月9日
    5
  • kong笔记——认识kong

    kong笔记——认识kong背景最近公司打算重构API网关,给定的硬性条件是支持lua脚本,kubernetes可部署,可解析lua,另外需要支持身份认证,IP黑白名单,限流,负载均衡等一些功能,为此,在技术选型上锁定了kong以及APISIX,最终选择了kong。(原因:稳定性第一,性能第二,拓展性第三,社区未来发展第四)为什么选择kong其实抛开lua的支持,kong的一些功能点还是很吸引我的,比如天生支持API网关的基本特性(权限控制,安全,负载均衡,请求分发,监控等等),即开箱即用。如果我们选择了zuul,当需要为应

    2022年6月26日
    120

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号