opengl编程指南笔记(四)第三章 视图

opengl编程指南笔记(四)第三章 视图_第1张图片

opengl编程指南笔记(四)第三章 视图_第2张图片




在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,我们称这种矩阵为单位矩阵.它是个方阵,除左上角到右下角的对角线(称为主对角线)上的元素均为1以外全都为0。对于单位矩阵,有AE=EA=A
视图变换相当于把照相机固定在三脚架上并是他对准场景。
如果不调用gluLookAt(),那么照相机就被设置为默认的位置和方向:照相机位于原点,指向z轴负方向,朝上向量为(0,1,0)


模型变换的目的是设置模型的位置和方向。
通过试图变化把相机位置设置在(0,0,5)和通过模型变化移动模型到(0,0,-5),两种变换效果相同,所以在实际应用中要同时考虑这两种类型的变换,这也是把两种变换组合为模型视图矩阵的原因。

模型变换就是移动模型,视图变换是移动相机,他们的移动方向总是相反的


投影变换的目的是确定视野(或视景体),并因此确定哪些物体位于视野之内以及他们能够被看到的程度。这个操作相当于为照相机选择镜头:广角镜头、标准镜头、长焦镜头等。广角镜头使场景范围远大于使用长焦镜头,但长焦镜头可以使远处的物体看上去比实际上更靠近相机。
除了考虑视野,投影变换还决定了物体时如何投影到屏幕上的(就像他的名称提示的那样)。投影变换有两种基本类型:透视投影(类似日常生活看到的景象:远处的物体看上去小一些)和正投影(把物体直接映射到屏幕上,而不影响他们的相对大小。正投影一般用于建筑和CAD中,要反映物体的实际大小,而不是看上去的样子)

从照相机延伸的直线(即视线)表示视景体,也就是照相机的视野
正射投影,又叫平行投影。这种投影的视景体是一个矩形的平行管道,也就是一个长方体。
透视投影的视景体类似于一个顶部和底部都被切除掉的棱椎,也就是棱台。

opengl编程指南笔记(四)第三章 视图_第3张图片

opengl编程指南笔记(四)第三章 视图_第4张图片

opengl编程指南笔记(四)第三章 视图_第5张图片
opengl编程指南笔记(四)第三章 视图_第6张图片
opengl编程指南笔记(四)第三章 视图_第7张图片

视口指定了场景在屏幕上所占据的区域,因此把视口变换看成是定义了最终经过处理的照片的大小和位置。
视窗和视口:视窗是整个屏幕,视口是某一个照片显示的位置(类似一个未全屏程序在pc窗口上杯托放的位置),所谓窗口,现有窗后有口


modelview 模型视图矩阵,用来表示物体的位置变化和观察点的改变
projection 投影矩阵描述如何将一个物体投影到平面上
texture 纹理坐标矩阵,用于描述纹理坐标的动态变化
color 颜色矩阵,用于对颜色的操作





转置是行变成列列变成行,没有本质的变换
逆矩阵是和这个矩阵相乘以后成为单位矩阵的矩阵

这个是一个本质的变换,逆矩阵除了一些显然的性质以外还有一些很特殊的性质,例如无论左乘还是右乘原矩阵,都是单位矩阵。


程序所调用的最后一个变换矩阵实际上是最先应用到定点的:I(N(M(Lv))),所以代码中乘法执行顺序和真正的乘法执行顺序是相反的


glScale*(x,y,z)会改变物体大小和形状:参数>1就拉伸,<1就收缩,=-1就沿着相应的轴反射这个物体,=0就把所有沿这个轴的物体坐标收缩为0


glLoadIdentity()函数的目的是隔离各个变换的效果,防止连续变换产生的累积效果。


视图变换用于修改观察点的位置和方向。要记住视图变换函数必须在调用任何模型变换函数之前调用,以确保首先作用于物体的是模型变换。
默认的观察点位置是原点,方向是z轴的负方向。


投影变换的目的是定义一个视景体。视景体有两个用途:一是视景体决定一个物体时如何映射到屏幕上的(透视投影还是正投影),二是视景体定义了哪些物体或物体的一部分被裁剪到最终的图像之外(裁剪掉视景体之外的物体)。


视口变换对应于选择被冲洗相片的大小这个阶段。在计算机图形中,视口是一个举行的窗口区域(视口相当于一个未全屏显示的应用程序的矩形显示范围),图像就是在这个区域中绘制的。视口是用窗口坐标测量的,窗口坐标反映了屏幕上的像素相对于窗口左下角的位置。


opengl编程指南笔记(四)第三章 视图_第8张图片



视口的纵横比一般和视景体的纵横比相同,如果不同,当图像投影到视口时就会变形。


在opengl中,与x和y窗口坐标不同,z坐标总是被认为位于0.0~1.0范围之间


所谓的当前矩阵就是堆栈顶部的那个矩阵
glPushMatrix()复制一份当前矩阵,并把这份复制添加到堆栈的顶部。


模型视图矩阵堆栈至少可以包含32个4x4的矩阵。投影矩阵堆栈的深度一般只有2层。


除了视景体的6个裁剪平面,还可以再指定最多6个其他裁剪平面。每个裁剪平面的平面方程是Ax+By+Cz+D=0
glClipPlane()函数所执行的裁剪是在视觉坐标中完成的,而不是在裁剪坐标中。



你可能感兴趣的:(OpenGL)