OpenGL的几种空间和坐标系统及变换

      近来因工作需要使用OpenGL做了些实验验证开发,对OpenGL的空间和对应坐标及其变换关系做一些记录(下面有两张图片不是官网上的,是从网上其他OpenGL文章的作者那里复制来的,先在此表示感谢,抱歉因没有记录那些文章的地址暂时不好指出出处了,后面看到再补上出处链接,其他图片出自相关官网或opengl技术网站,例如OpenGL,坐标系和相关矩阵是自己画的,部分转换矩阵是自己琢磨后写的,如有错误欢迎指正)。

OpenGL的几种空间及坐标系统:

局部空间(也叫物体空间):物体自身的坐标空间,对应的坐标系叫局部坐标系(Local Coordinates)或物体坐标系(Object or Model Coordinates)。

世界空间:物体的顶点在世界中的坐标空间,对应的坐标系叫世界坐标系(World Coordinates)。

观察空间(也叫摄像机空间或视觉空间):以虚拟人眼或摄像机为原点的坐标空间,对应的坐标系统叫摄像机坐标系(Camera Coordinates)或观察坐标系/视坐标系(Eye Coordinates),物体顶点在观察空间的坐标可由世界空间下的坐标经平移和旋转得到,实际上就是自动驾驶领域经常做的世界坐标系到相机坐标系的变换。

裁剪空间:在观察空间里增加远面(Far Clip Plane)、近面(Near Clip Plane)以及视角(FOV)和宽高比(Aspect Ratio),或者近面的上下左右边离Z轴的距离值t、b、l、r等这些边界约束参数,得到一个视锥体空间(Frustum),在此视锥体空间内的物体可见,在其外的不可见,OpenGL不会画出来,对应的坐标系叫裁剪坐标系(Clip Coordinates)。

透视投影变换的相关原理和公式推导就不展开详述了,简单图示如下:

          OpenGL Projection Matrix

任何落在范围外的坐标都会被丢弃/裁剪,不会显示在你的屏幕上,例如,下面是在标准化设备坐标中的三角形:

屏幕空间: 在屏幕上绘图的坐标空间,取值范围由视口 (Viewport) 决定,视口坐标系以左下方顶点为原点,x轴以向右方为正,y轴以向上方为正。物体的顶点坐标变换到视口坐标系下就可以绘图了,视口的坐标由物体的NDC坐标数据根据视口设置的宽高(w,h)和原点坐标(x,y)以及NDC坐标系下的远近面值(f,n)经线性化(也叫视口变换(Viewport Transformation))变换得到。注意视口坐标系和屏幕坐标系是由区别的,经常有人搞混,把屏幕空间的视口坐标系叫屏幕空间的屏幕坐标系,实际上,屏幕坐标系(Window or Screen Coordinates)是不同于视口坐标系的,是真实屏幕上的坐标,以屏幕左上方顶点为原点,x轴以向右方为正,y轴以向下方为正,一般UI软件涉及到的窗口(Window)的位置和鼠标相关事件都是屏幕坐标系下的,通过鼠标事件获取到的鼠标当前的位置坐标需要转换成视口坐标后才能逆向计算出鼠标在屏幕上的当前像素位置对应的实际空间中的世界坐标系下的位置。而OpenGL绘图只需要将物体顶点坐标变换到视口坐标系下就可以绘图了,保存所绘制的2d图像内容到图片文件时进行的栅格化是从视口坐标下或者NDC坐标系下转换的而不是转到屏幕坐标系下再做栅格化!

 

      综上所述,如果物体顶点的初始数据是物体坐标系下的,OpenGL用透视形式对3D物体绘图的过程是:把物体顶点数据从物体坐标系数据换到世界坐标系下,然后从世界坐标系下转换到摄像机坐标系下,再根据设置的视锥体参数裁剪掉可能超出视锥体空间之外的部分后转到裁剪坐标系下,再对坐标数据做归一化转换到NDC坐标系下,然后再根据设置的视口(ViewPort)参数将坐标数据做线性变换转换到绘制图像的窗口坐标系下,整个过程如下图所示:

 

 

       点云数据是激光雷达扫描物体采集的,因此激光雷达的视野空间可以看成是OpenGL里的观察空间,所有点云的空间点可以看成是物体的顶点,因此点云数据已经是在观察空间下,在使用OpenGL绘图时不需要物体坐标系到世界坐标系到观察空间的摄像机坐标系的转换,但是需要把点云数据从激光雷达坐标系下的坐标转换到观察空间的摄像机坐标系(右手坐标系)下。如下所示,摄像机坐标系的x轴指向右侧,y轴指向天空,z轴指向后方: 

而激光雷达坐标系(Lidar Coordination)则是x轴指向前方,y轴指向左侧,z轴指向天空。激光雷达坐标系如下所示:

OpenGL会将观察者空间的摄像机坐标系下的数据通过透视投影转换成裁剪坐标系下再归一化到标准化设备坐标系下,而标准化设备坐标系是左手坐标系,和观察者空间的摄像机坐标系比较,从图像视觉直观看,z轴方向了发生翻转,z轴正向指向屏幕内(而摄像机坐标系的z轴正向指向屏幕外),和连续的多帧点云图像展示出的行车方向(自车前进方向也就是激光雷达坐标系下x轴正向的方向)一致。

 

  • 28
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arnold-FY-Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值