唧唧歪歪之OpenGL坐标系

Posted 鲨鱼小猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了唧唧歪歪之OpenGL坐标系相关的知识,希望对你有一定的参考价值。

不懂坐标系,死在第一步…

  • (1)刚开始绘制一个物体,代码设置这个物体的坐标是针对屏幕(屏幕不是计算机的整个屏幕,这里的屏幕是开辟的窗口)的中心建立坐标系而言(说白了就是针对世界坐标系建模,世界坐标系的原点在屏幕中心)

  • (2)然后对物体进行模型变化(平移,旋转等),而设置的代码可以2种理解:假定我们是先进行一次平移、然后进行一次旋转,那么我们设置的平移、旋转代码可以理解:
    ①把物体放在世界坐标系中先平移、再旋转(注意物体变化了,那么物体自身的局部坐标系相对原来局部坐标系也是变化的),也就是说设置的代码仍然是针对世界坐标系(也可以说全局坐标系)。
    ②代码是争对物体的局部坐标系,但是!!!是在局部坐标系中先旋转,在平移。得到的最终效果和上面的(1)是一样的。同时需要注意Opengl中实际上进行模型变换时候就是针对局部坐标系,(当然写代码时候,还是理解成这些代码争对世界坐标系,好理解一点)

  • (3)视点坐标系(又称为眼坐标系、相机坐标系),也就是我们使用的gluLookAt函数(当然这个是视点变换,不是坐标系),我们进行视点变换,也是基于世界坐标系而言,把眼睛放在哪里。得到的效果完全可以理解为与模型变化一样。一个是眼睛不动,物体动。一个是眼睛动,物体不动。唯一的区别就是视点坐标系动的是眼睛,所以物体没有变,所以物体仍然在以前世界坐标系中的老位置,并且物体的局部坐标系针对之前的局部坐标系没有变。

  • (4)投影变换就是从视点(就是前面照相机的位置)出发进行投影,然后投影到一个窗口中,这个窗口称为投影窗口,(没有变换过的视点,默认在这个投影窗口的原点,也就是中心),没有进行视点变换时候(也就是从来没移动眼睛的时候),视点默认是与世界坐标系的中心(原点)重合。所以综上,没有进行视点变换时候,进行投影,投影的窗口的原点,与世界坐标系的原点重合。

  • (5)视口变换,就是在我们的窗口中开辟一个视口,开辟这个视口时候,是针对屏幕(就是我们实验课黑黑的窗口)而言,并且视口坐标系的原点与我们这个黑窗口的左下角重合。把我们投影窗口的内容,放进去。当2个窗口不成比例,但是就会变形!你应该能想象的,上学期的图形学附录也有解释。这个时候解释一下为什么(4)中投影窗口放在世界坐标系中不变型呢,要注意前者是把有限的内容(投影窗口)放在一个窗口,然后把窗口放在一个无线的坐标系中,当然不变型,后者是把有限的内容(投影窗口)放在另外一个有限的窗口,不成比例,当然会变形。

  • 综上,总结:写的变换方面代码(平移、旋转等)理解为争对屏幕(开辟的窗口)的中心而言。一但进行视点坐标系、投影变换、视口变换,脑袋中要时刻想象出这几个坐标系就好。

以上是关于唧唧歪歪之OpenGL坐标系的主要内容,如果未能解决你的问题,请参考以下文章

SharpGL之透视投影和摄像机

三维渲染引擎设计与实践

Opengl视点转换如何gluLookAt

OpenGL ES总结OpenGL坐标变换之平移及旋转

opengl导入一个3维物体,如何修改其局部坐标系?

OPENGL之矩阵