OpenGL中各种变换的原理以及对应的OpenGL函数

先看看上周学了什么?

1.OpenGL的默认坐标系、默认视点位置、单位:
OpenGL中各种变换的原理以及对应的OpenGL函数_第1张图片
(1)右手坐标系
(2)默认视点在原点,也就是屏幕中央,说白了屏幕中央就是你的眼睛,你在向屏幕里面看。
(3)OpenGL中并无绝对单位,只有相对大小!!!相对于视椎体大小来设定物体大小。 这句话对于理解OpenGL函数参数以及参数的赋值极为重要。

2.OpenGL中变换的四个步骤及其相关的OpenGL函数:
(1)几何变换:通过平移旋转缩放让视点和物体放在相对合适的位置。
(2)投影变换:光打到三维物体上在投影平面产生的二维图像。
(3)裁剪:投影的过程中调整图元的大小、形状。。。下图中我们发现可以三角形投影到视口上时只剩下下半部分,那是因为投影到投影窗口中的三角形的上半部分已经在外面了。
(4)视口变换:把投影窗口中的图像投影到视口中。
OpenGL中各种变换的原理以及对应的OpenGL函数_第2张图片
上面这个图还有几处细节没说:
(1)视椎体:
就是从视点到投影平面的这个四棱锥。
我们要投影到平面上的物体要放在这个视椎体里面。
(2)近平面、远平面:
初中在学眼睛的时候都学过人眼可视范围有一个近点有一个远点,离太近离太远都会看不清。图中画的很清楚,近平面和远平面就是这个原理,只有在这两个平面里物体才会被投影到平面。
(3)为什么不直接把三维物体投到屏幕上?
刚开始看了别的那些学校图形学的慕课,说实话,都在徐徐而谈那些理论的东西,只有这个老师在结合理论剖析对应代码的细节基础。
言归正传,那他是闲得蛋疼才弄投影窗口的吗?不是,因为对于不同的设备、操作系统…,它都有不同的屏幕设置,而OpenGL想尽可能的跨平台,如果直接投在屏幕上那太局限了。所以OpenGL在投到屏幕前把主要的事情都做完,因此就模拟了投影平面这样一个虚拟的空间。

1.几何变换

通过平移旋转缩放让视点和物体放在相对合适的位置。

(1)平移变换Translation:

平移一个物体实质就是把它的每个顶点都平移就行了
OpenGL中各种变换的原理以及对应的OpenGL函数_第3张图片

(2)缩放变换Scaling:

实质就是物体的每一个分量都乘以对应的缩放因子即可。
Sx、Sy、Sz分别是xyz对应的缩放系数。
OpenGL中各种变换的原理以及对应的OpenGL函数_第4张图片

(3)旋转变换Rotate:

OpenGL中各种变换的原理以及对应的OpenGL函数_第5张图片
对应沿z轴旋转的矩阵:
OpenGL中各种变换的原理以及对应的OpenGL函数_第6张图片
同样自己去推导沿y、x轴的旋转
OpenGL中各种变换的原理以及对应的OpenGL函数_第7张图片
OpenGL中各种变换的原理以及对应的OpenGL函数_第8张图片
说白了还是矩阵的运算,相关步骤图形学的书上都有,可以去看看。
但这一切都可以用一个简单的函数来实现:
沿向量(x,y,z)旋转angle度。
在这里插入图片描述
{fd}的意思是选一种数据类型(float或者double)使用。

以上这些东西都是由矩阵实现的,很容易理解,函数的使用也很方便,但是关键在于这些函数应用到程序中去操作的实际情况可能和我们的思维有差别。下面的内容以及在、https://blog.csdn.net/derbi123123/article/details/104643819中我通过周末的作业总结了在程序中这些函数到底是怎样运行的,理解这件事才能真正的写好OpenGL的程序。

(4)我们要用栈来管理矩阵(变换):

理解这里首先要理解所有的变换都是基于矩阵的!!!
上面讲的是几何变换中用到的函数,有时候变换很复杂,有些变换只应作用于某些图元,涉及到一个更新和管理的问题。OpenGL正是用栈(先进后出)来管理矩阵(变换)的:
用到的函数:
glLoadIdentity();
load的意思是装载,identity的意思是单元,表明让当前矩阵变成一个单位矩阵(就是对角线都是1,其他都是0),相当于初始化或者重载。
glPushMatrix();
通过将栈顶矩阵复制一份入栈来保护调用此函数之前的变换。
glPopMatrix();
恢复调用glPushMatrix();之前的环境。
上面都是我自己的理解,可能直接看很难理解,我们来看一个例子:
OpenGL中各种变换的原理以及对应的OpenGL函数_第9张图片
上面的Transformation是变换、Primitive是画图,都是伪码描述,I是单位矩阵。
我们可以就把变化理解为矩阵的乘法运算(其实本来就是),主要是结合栈的变化体会这三个管理矩阵的函数是怎样起作用的!!!
根据上面这个过程我们还可以看出OpenGL程序的一个特殊之处:OpenGL是先对物体进行操作(先罗列一堆变换等函数),再画这个物体

2.模型变换与视点变换(Model-View Transformation):

Model Transformation——视点不变变物体
View Transformation——物体不变变视点
glMatrixMode(GL_MODELVIEW);
这个函数用来设置矩阵模型,不同类型的变换由不同的栈来管理,写成GL_MODELVIEW就是再告诉GPU我们要进行模型、视点变换了。所以每次用到不同类型的变换都要先用该函数声明不同的栈。
其实再怎么变变的也都是相对位置,以我们自己为中心变物体更容易,所以一般情况可以认为视点不变变物体。
但是,如果你就是想坐着飞机观察地球,那只能变视点了。glu库中提供了这样一个函数:
void gluLookAT(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz);
这个函数有九个参数,参数类型统一即可,所以我没有写,前三个用来表示视点位置,中间三个表示眼睛看的点的位置,后三个表示头向上的方向。当然这个函数的本质也是通过矩阵来完成的。

3.全局变换和局部变换:

Global transformation 全局坐标系变换模式、固定坐标系模式、图形模式
——以视点为中心进行变换
Local transformation 局部坐标系变换模式、活动坐标系模式、空间模式
——以物体自身坐标系变换
我们需要关心的是OpenGL中的变换是全局变换还是局部变换?
我们先来想一个情景,如果我们要模拟一个机器人的手臂,其上臂的运动要相对于肩部来进行,其下臂的运动是相对于肩部计算吗?显然那太难了,一定是相对于上臂来变换的。然而我们也知道世界上不可能只有一个坐标系,事物都是相对而言的,不可能所有东西都按照世界上的某一个点为原点变换的,所以为了计算方便,OpenGL采用的是局部变换。
说白了,就是OpenGL中所有物体的变换都以他自己的中心为原点,只不过有时候他自己的中心恰好在默认的原点。
举个栗子:
OpenGL中各种变换的原理以及对应的OpenGL函数_第10张图片
不用管glBegin,glEnd,这两个是用来画图的,看前面的三个函数。想想经过平移10个单位和旋转45度之后是下面哪种情况呢?
OpenGL中各种变换的原理以及对应的OpenGL函数_第11张图片
是后者,因为OpenGL中所有物体的变换都以他自己的中心为原点!!!

4. 投影变换、视口变换

已经写太多了换一篇写,请看https://blog.csdn.net/derbi123123/article/details/104654458

你可能感兴趣的:(计算机图形学学习总结)