深入理解opengl坐标系统

文章详细阐述了OpenGL渲染管线中的坐标变换过程,包括模型变换、视图变换和投影变换。模型变换调整物体在场景中的位置,视图变换模拟相机视角,投影变换将3D坐标转换到2D空间。重点讨论了透视投影和正交投影的区别,以及如何通过投影矩阵将坐标映射到剪裁空间和NDC空间。

内容参考songho.ca/opengllearnopengl

坐标变换流程

坐标变换主要发生在顶点处理阶段,外加光栅化进行一次视口变换

各个阶段变换说明:

  1. Model 变换,指模型本身的调整,比如一个人物模型,建模的时候原点放在腰上,放到场景中,一半在平面坐标系下面了,要把脚和地平面对齐,Model变换加一个向上的平移
  2. VIEW 变换,opengl本身没有相机的概念,场景视角默认冲着屏幕里,即-z轴。相机的变换是通过对场景做逆变换实现的,比如相机旋转30°,则实际是将场景旋转-30°
  3. Projection 变换,空间中的坐标最后都要在二维的平面上绘制,Projection就是将3D的坐标变换到2D(不太准确,下面会深入projection原理)

看下图,3.View Space到4.CLIP SPACE的区别,经过透视投影到剪裁空间后,物体符合近大远小的视觉效果,立方体背面的xy坐标变小了,更靠近原点,右边锥体的尖儿也相对的远离原点了(尖儿更靠前)

 from learning opengl

整个渲染过程涉及5个坐标系,坐标范围如下,参考下图

坐标系 坐标范围 说明
Object/Local Coordinate [-∞, +∞] 空间任意值
Eye/View Coordinate [-∞, +∞] 空间任意值
Clip Coordinate [-∞, +∞] x、y在近平面的宽高范围内
NDC coordinate [-1, +1] 投影变换之后,除以齐次坐标W得到
Screen Space [0, 宽/高] 窗口宽高范围内

注:opengl是右手坐标系,拇指、食指、中指分别指向x、y、z轴正方向

注,Divide by w这一步是opengl管线自己做的,开发者只要按要求计算好齐次坐标的w值。

齐次坐标理解参考:Homogeneous Coordinates

model view projection变换,我们一般简称为mvp变换,mv相对简单,重点看看projection变换实现

投影矩阵

投影分两种:

  • 透视投影(Perspective Projection),会渲染成近大远小
  • 正交投影(Orthographic Projection),长宽按照1:1渲染,不会缩放

正常情况下,场景的渲染使用透视投影,一些特殊的场景会选择正交投影,比如游戏中人物的血条,平行光的阴影图(shadow map)

projection变换后得到clip space坐标P( x c , y c , z c , w c x_c, y_c, z_c, w_c xc,yc,zc,wc)

opengl管线会根据clip坐标进行剪裁,在camera视锥范围外的顶点会被丢弃,判断计算:

如果出现裁剪,OpenGL会在网格的裁剪处进行重建

透视投影(Perspective Projection)

透视投影

透视变换中,假设人眼/相机看到的是一个被裁剪的金字塔锥体,3D坐标投影变换后,映射到单位立方体空间内[-1, 1],

  • x轴范围[l, r] ==> [-1, 1]
  • y轴范围[b, t] ==> [-1, 1]
  • z轴范围[-n, -f]==> [-1, 1]

右手坐标系下,camera看向-z方向,这里n、f > 0,所以前面加负号

理解透视变换的关键在于,要凑出一个矩阵,使得点 ( x e y e , y e y e , z e y e , w e y e ) (x_{eye}, y_{eye}, z_{eye}, w_{eye}) (xeye,yeye,z

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值