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

投影矩阵 视图模型矩阵「建议收藏」
    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 ,)

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 什么叫侧面指纹识别_侧面指纹识别真的只是大法一家独有?

    什么叫侧面指纹识别_侧面指纹识别真的只是大法一家独有?好久不见~!,ZAKER科技的各位机友们,第14期《每周猜机》又跟大家见面了。每周猜机到14期了,这期间离不开各位同学的支持,也希望各位同学能继续关注这个栏目。先透漏这期的主题也是前两期前后指纹识别主题的延伸,请各位猜机大神再接再厉,接下这期猜机:前两期的每周猜机,师兄已经可以看出各位同学对于前后指纹识别都有自己的见解,两方僵持不下,那师兄这次就提出一个中立解决方案——侧面指纹识别,现…

  • vuedevtools使用_怎么下载vue_devtools

    vuedevtools使用_怎么下载vue_devtoolsCSDN首页首页博客程序员学院下载论坛问答代码直播电子书最牛小程序:想要的资源都能搜到?会员中心收藏动态消息15创作中心vue调试工具vue-devtools安装及使用(最新)清虚桂意2020-06-2310:27:29606已收藏4分类专栏:vue版权github克隆vue-devtools官方项目地址gitclone-bv5.1.1https://github.com/vuejs/vue-devtools.git1此处安装v5.1

  • 时钟周期,机器周期,指令周期的区别是什么_紫外分光吸光度大于1

    时钟周期,机器周期,指令周期的区别是什么_紫外分光吸光度大于1时钟周期     时钟周期也称为振荡周期,定义为时钟脉冲的倒数(时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时钟周期就是1/12us),是计算机中的最基本的、最小的时间单位。    在一个时钟周期内,CPU仅完成一个最基本的动作。时钟脉冲是计算机的基本工作脉冲,控制着计算机的工作节奏。时钟频率越高,工作速度就越快。     8051单片机把一个时钟

    2022年10月13日
  • python怎么表示取余_python如何实现取余操作

    python怎么表示取余_python如何实现取余操作python实现取余操作的方法:可以利用求模运算符(%)来实现。求模运算符可以将两个数相除得到其余数。我们还可以使用divmod()函数来实现取余操作,具体方法如:【divmod(10,3)】。在python中要实现取余操作可以使用求模运算符(%),该运算符可以将两个数相除得到其余数。(推荐教程:Python入门教程)如果一个数恰好能被另外一个数据整除,则余数为0,%运算后返回结果为0。可利用余数…

  • [UML] 类图介绍 —— 程序员(灵魂画手)必备画图技能之一

    [UML] 类图介绍 —— 程序员(灵魂画手)必备画图技能之一统一建模语言(UnifiedModelingLanguage,UML)可分类成:功能模型:从用户的角度展示系统的功能,包括用例图。对象模型:采用对象,属性,操作,关联等概念展示系统的结构和基础,包括类别图、对象图。动态模型:展现系统的内部行为。包括序列图,活动图,状态图。类图说到类图,它包含的东西确实有点多,你去网上看总能看到,同样都是类图,但是好像各有各家的章法,总让人摸不着头脑。要么少个箭头要么实线变成虚线了… 那这个类图到底有没有标准呢?别慌,有的,《大话设.

  • 02Windows日志分析[通俗易懂]

    02Windows日志分析[通俗易懂]计算机系统日志作用系统日志是记录系统中硬件、软件中的系统问题信息,同时还可以监视系统中发生的事件用户可以通过日志来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹Windows日志分类Windows系统日志(包括应用程序、安全、安装程序和转发的事件)服务器角色日志应用程序日志服务日志事件日志基本信息该日志主要记录行为当前的日期、时间、用户、计算机、信息来源、事件、类型、分类等信息事件类型及描述事件类型错误出现问题可能会影响触发事件的应用程序或组件外部

发表回复

您的电子邮箱地址不会被公开。

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