OpenGL的视图变换以及一些函数的实际意义

1.OpenGl规定了诸多坐标系 和 变换方法 以方便开发者能够愉快的变换

他们分别是:

模型坐标系

世界坐标系

相机坐标系

解释一下:

模型坐标系:是设计者设计模型时候的坐标点的集合,它的原点常常是物体的重心?

世界坐标系:是将模型放到一个坐标系中(对模型进行旋转放缩 或其他),这个坐标系可以放置很多的模型。

相机坐标系:这是以相机的视角的一个坐标系。原点是相机。注意只有一个点没有办法确定坐标系,还需要确定三个坐标轴。

glm:lookAt方法确定坐标轴的方式是通过 两个一个点 和两个垂直的向量来确定的 VPN 和 VUP (VPN是相机的镜头 是Z轴)

VUP是相机 (的垂直向上的方向【假设人手持相机】 相当于X轴)

 

需要了解的是:

模型坐标系的作用 其实就是为了确定模型的大小 状态

世界坐标系是 统一各个模型坐标系 然后人为将模型放在世界坐标系的位置 

相机坐标系:是为了能够在某个平面上显示出来所做的转换,方便最后一步“拍照”

 

如果还无法理解,可以想象,【在模型坐标系中】你就是模型,你以自己的身体中心 为原点建立了一个坐标系,比如头顶的高度是0.9m,脚底 的高度是-0.9m。【在世界坐标系中】,想象在地球坐标系上,以地心为原点,你的中心在球面上的(a,b,c)位置,

你的头顶的坐标可能就是(a,b,c+0.9)。【而在相机坐标系中】,假设你的前方有个相机,你在它镜头中的位置,就是相机坐标系中你的位置。

 

以上是非常的好理解的,即使你没看这篇文章,有一些三维的想象能力也很清楚了。

 

但是难点来了。在OpenGl中,如何考虑这些坐标系?

先暂时绝对的说,opengl需要什么。

在顶点着色器中,我们通常需要给gl_position赋值,以确定需要展示的点的位置,

需要知道的是gl_position的四维向量,第四个是齐次坐标,可以先默认为1,前三个是你传入的x,y,z.

在OpenGL的规格中,x,y,z 需要绝对值在1之间才能被显示出来,否则会被裁剪掉。

所以我们最终要传给顶点着色器的是绝对值小于1的x,y,z坐标 其中x=1 代表屏幕(显示区域)最右,y=1代表屏幕(显示区域)最上。

需要注意的是z的值为-1 和1 对在屏幕上显示的位置 没有影响,它所起的作用是同其他的点做比较,如果在相同的点有另一个模型也占据了,后面会根据z的大小决定谁遮挡了谁。

为了达到这个目的(归一化的直接决定屏幕显示的点),我们需要考虑以上坐标系,

因为我们有的就是一个模型,也就是,模型坐标系中的若干个点。

 

为了完成【模型上的点】--》【OpenGl着色器的点】的转化

我们需要根据以上几个坐标系的原理做一步步转化。

简化的步骤如下:

1.获取到了模型坐标的一系列点。

2.考虑模型坐标系要转换成世界坐标系,需要进行一系列平移或旋转【即产生矩阵,应用到模型坐标点上】

3.考虑世界坐标系到相机坐标系,需要进行坐标系转换【与2类似,就是坐标系直接的转化】

4.拍照!这不是三维坐标系的转化,而是将三维坐标转化为二维坐标,即把一个立体的东西拍扁拍成个面。【降维】【当然,最终它也是要用一个矩阵表示】

 

其中,齐次坐标这个东西可以保证以上4点能够顺利完成。

 

还需要注意的是,因为每一步都是矩阵,所以其实一切加起来就是完成了一个矩阵乘法,现在只是将这个乘法分为了好几步而已。

 

可参考 https://blog.csdn.net/wangdingqiaoit/article/details/51594408 里面的图来有更主观的理解。

 

posted @ 2018-05-24 16:21  lightverse  阅读(257)  评论(0编辑  收藏  举报