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

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


相关推荐

  • SPI接口扫盲 SPI定义/SPI时序(CPHA CPOL)

    SPI接口扫盲 SPI定义/SPI时序(CPHA CPOL)SPI接口扫盲为何要写这篇文档?百度上找出来的SPI接口中文描述都说的太过简略,没有一篇文档能够详尽的将SPI介绍清楚的。wikipedia英文版[注释1]中,SPI接口介绍的很好,但是毕竟是英文版,读起来终究不如母语舒服,所以我结合自己的工作经验,对其进行了汉化、整理。个人SPI接口相关经验:1.参与过国产某芯片SPI接口样品验证、SPI接口服务DEMO开发(C语言)。2.使

  • Matlab中meshgrid的用法简介

    Matlab中meshgrid的用法简介meshgrid:网格1、主要使用的函数为[X,Y]=meshgrid(xgv,ygv);meshgrid函数生成的X,Y是大小相等的矩阵,xgv,ygv是两个网格矢量,xgv,ygv都是行向量。X:通过将xgv复制length(ygv)行(严格意义上是length(ygv)-1行)得到Y:首先对ygv进行转置得到ygv’,将ygv’复制(length(xgv)-1)次得到。…

  • centos7.4安装docker_centos安装python3.6

    centos7.4安装docker_centos安装python3.6前言当我们在一台电脑上搭建了python3.6的环境,下次换台电脑,又得重新搭建一次,设置环境变量等操作。好不容易安装好,一会提示pip不是内部或外部命令,一会又提示pip:commandno

  • windows平台下,TensorFlow的安装、卸载以及遇到的各种错误

    windows平台下,TensorFlow的安装、卸载以及遇到的各种错误本人在安装TensorFlow过程中,遇到了很多问题,现将安装成功过程中,遇到的问题以及解决方法总结如下:TensorFlow安装要求:windows系统64位、python3.5版本、TensorFlow1.1或TensorFlow1.2;安装的具体过程:1、安装anaconda:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archiv…

  • SQLPrompt关闭联网

    SQLPrompt关闭联网一、介绍1.1、SQLPromptSQLPrompt是一款SQL开发智能提示和补齐插件,方便查询表结果,避免了开发人员一个个敲查询语句、执行语句等,但是插件收费。1.2、SQLSearch同时还推荐一个同系列同公司推出的SQLSearch插件,这个插件免费,这款插件可以在库里快速查找关键字,包括表名、列名、字段名、函数或存储过程及索引等中出现的关键字,也是一个极为有用的插件利器。…

  • NodeJs:Happy代码生成器,重构了代码,更新了文档,完善了示例,欢迎下载使用…

    NodeJs:Happy代码生成器,重构了代码,更新了文档,完善了示例,欢迎下载使用…

发表回复

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

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