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

投影矩阵 视图模型矩阵「建议收藏」
    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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 记1024

    记1024等我写一个重磅级的博客。。。

    2022年6月24日
  • TOMCAT启动错误:严重: Error filterStart「建议收藏」

    TOMCAT启动错误:严重: Error filterStart「建议收藏」在tomcat启动的时候报严重:ErrorfilterStart这样的错误的原因有很多种,比如你在web.xml的配置语句写漏或写错或缺少某些jar包等等都有可能发生,子猴这里给出的不是针对某一具体错误如何解决,而是给出如何查找出错原因?我发现网上很多朋友都碰到过这样的错误信息而束手无策,往往花费很多时间,而归根结底是不知道如何得知错误是怎么产生的,因为tomcat(往往都是使用的tomca

    2022年7月11日
  • JQuery学习—JQuery-Validation 使用

    JQuery 的学习之 JQuery—Validate验证功能

    2022年2月24日
  • java三种单例模式的实现[通俗易懂]

    java三种单例模式的实现[通俗易懂]java三种单例模式的实现一、单例模式介绍单例模式是最基础的程序设计模式之一,在java上表现为,单例模式下,一个单例对象的类只能存在一个,其职责只能由这个类产生的单例完成。优点:显而易见只用一个实例可以节省系统资源,对于一些需要经常创建销毁的对象而言,使用单例模式提高了系统性能缺点:获取单例对象时不能直接通过其构造方法获取,而是要通过它开放的创建方法来获取,可读性会稍差一点使用案例:比如加载某配置文件的程序对象可以是单例的,该对象在获取了配置信息后,其他需要信息的对象可以通过该单例对象获取到信息

    2022年7月9日
  • 检索学位论文的检索式_怎么用谷歌学术查文献

    检索学位论文的检索式_怎么用谷歌学术查文献学位论文(简称大论文)文献检索格式和平时发表的期刊论文(简称小论文)文献格式往往不一样。小论文归拢大论文的时候,格式调起来很麻烦,很繁琐。而且很多同学并没有使用文献管理软件的习惯。这时候怎么办?答案:谷歌学术搜索。1、把你的文献名粘贴到谷歌学术搜索(注意是http://scholar.google.hk/)搜索,如下图所示2、注意所查文献下方“引用”的链接,点击

    2022年10月11日

发表回复

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

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