本文主要是介绍LearnOpenGL笔记5变换、坐标系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
变换、坐标系统
- 齐次坐标(Homogeneous Coordinates)
- 旋转
- 数学库GLM
- 坐标系统
- 透视投影
- 3D-缓冲
齐次坐标(Homogeneous Coordinates)
向量的w分量也叫齐次坐标。想要从齐次向量得到3D向量,我们可以把x、y和z坐标分别除以w坐标。我们通常不会注意这个问题,因为w分量通常是1.0。使用齐次坐标有几点好处:它允许我们在3D向量上进行位移(如果没有w分量我们是不能位移向量的),而且下一章我们会用w值创建3D视觉效果。
如果一个向量的齐次坐标是0,这个坐标就是方向向量(Direction Vector),因为w坐标是0,这个向量就不能位移(译注:这也就是我们说的不能位移一个方向)。
旋转
1、欧拉角表示
沿x轴旋转:
沿y轴旋转:
沿z轴旋转:
每一次旋转变换就代表着有一个 Gimbal(通常译为万向节或者平
衡环架).所以,在这里我们一共有固定的三个 Gimbal.我们可以改变每
次旋转的角度,但是不论怎么变化角度这个旋转的顺序都是不能改变的。当旋转过程中一个自由度丢失,意味着产生了万向锁问题。
2、任意轴旋转、旋转矩阵
数学库GLM
这个是只有头文件的库。直接用就行。
注意的是glm中角度是弧度制。
这个库可以实现随着时间旋转。
尽管在代码中我们先位移再旋转,实际的变换却是先应用旋转再是位移的。明白所有这些变换的组合,并且知道它们是如何应用到物体上是一件非常困难的事情。只有不断地尝试和实验这些变换你才能快速地掌握它们。
坐标系统
OpenGL希望在每次顶点着色器运行后,我们可见的所有顶点都为标准化设备坐标(Normalized Device Coordinate, NDC)。
局部空间(Local Space,或者称为物体空间(Object Space))
世界空间(World Space)
观察空间(View Space,或者称为视觉空间(Eye Space))
裁剪空间(Clip Space)
屏幕空间(Screen Space
model、view、projection,顶点坐标起始于局部空间(local space)
模型矩阵实现局部到世界坐标系;
观察空间是摄像机空间,观察矩阵实现世界坐标系到相机坐标系;
裁剪空间,OpenGL期望所有坐标在一个特定范围,其他都被裁减掉;投影矩阵实现从相机坐标系到裁剪空间。
如果只是图元(Primitive),例如三角形,的一部分超出了裁剪体积(Clipping Volume),则OpenGL会重新构建这个三角形为一个或多个三角形让其能够适合这个裁剪范围。
投影矩阵创建的观察箱称为平截头体,范围内的坐标都会出现在用户屏幕上。
透视除法(Perspective Division)将会执行,在这个过程中我们将位置向量的x,y,z分量分别除以向量的齐次w分量;透视除法是将4D裁剪空间坐标变换为3D标准化设备坐标的过程。这一步会在每一个顶点着色器运行的最后被自动执行。最终的坐标将会被映射到屏幕空间中(使用glViewport中的设定),并被变换成片段。
透视投影
perspective透视:远的东西越来越小。
正射投影没有使用透视,远处的物体不会显得更小,所以产生奇怪的视觉效果。由于这个原因,正射投影主要用于二维渲染以及一些建筑或工程的程序,在这些场景中我们更希望顶点不会被透视所干扰。
3D-缓冲
OpenGL存储深度信息在一个叫做Z缓冲(Z-buffer)的缓冲中,它允许OpenGL决定何时覆盖一个像素而何时不覆盖。通过使用Z缓冲,我们可以配置OpenGL来进行深度测试。
深度值存储在每个片段里面(作为片段的z值),当片段想要输出它的颜色时,OpenGL会将它的深度值和z缓冲进行比较,如果当前的片段在其它片段之后,它将会被丢弃,否则将会覆盖。这个过程称为深度测试(Depth Testing),它是由OpenGL自动完成的。
这篇关于LearnOpenGL笔记5变换、坐标系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!