开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 14 天
1 概述
坐标系是一个精确定位对象位置的框架,所有的图形变换都是基于一定的坐标系进行的。对于从事计算机图形学的研究者,掌握图形变换是不可或缺的,因此,理解坐标系非常重要。
笔者一直认为,一个三维图形工作者可以认为自己站在一定的坐标系中,通过自己的想法来操控模拟的虚拟环境。
无论何时何地,只要确定原点和坐标轴的方向,都可以非常方便地建立坐标系,通常来说,任何一个三维坐标系都能表示空间中的所有点,因为坐标轴可以无限延伸。但为了方便处理各种问题,习惯上常定义多种坐标系。这些坐标系在本质上没有好坏之分,只是在不同的情况下处理问题的简化程度不同。
三维坐标系总体上可以分为两大类,即左手坐标系和右手坐标系,相信读者对这两种坐标系都有所了解,这里就不再介绍。常用的坐标系有世界坐标系、物体坐标系和摄像机坐标系,下面分别进行介绍。
2 世界坐标系
世界坐标系是一个特殊的坐标系,它建立了描述其他坐标系所需要的参考框架。从另一方面说,能够用世界坐标系来描述其他坐标系的位置,而不能用更大的、外部的坐标系来描述世界坐标系。世界坐标系也被广泛地称为全局坐标系或宇宙坐标系。
世界坐标系描述的是整个场景中的所有对象,可以理解为绝对坐标系,所有对象的位置都是绝对坐标。从整体上考虑,它为所有对象的位置提供一个绝对的参考标准,从而避免了物体之间由于各自独立的物体坐标系而导致的坐标系混乱。 世界坐标系通常描述的问题是一些对象的初始位置及场景中对象的变换过程,对象主要包括摄像机和绘制的物体。
3 物体坐标系
物体坐标系是针对某一特定的物体而建立的独立坐标系。每一个物体都有自己的坐标系,当物体发生变换时,实际上是它本身的坐标系相对于世界坐标系发生变换的过程则。
物体坐标系对于描述特定的物体非常方便,假设所有的物体都用一个世界坐标系来描述,则一个物体进行任何变换的计算量都非常大,包括顶点坐标变换等。定义物体坐标系之后,非常容易即可实现物体的变换,只需要对物体坐标系相对世界坐标系发生变换即可,如果用世界坐标系来描述一个人,很难确定人的各个器官的精确坐标,从而人体模型的建立就非常困难,这时可以充分体现物体坐标系描述特定物体的优势。
物体坐标系通常描述的问题是特定物体的内部对象,主要包括物体的顶点、物体的法向量和物体的方向。
4摄像机坐标系
摄像机坐标系是和观察者密切相关的坐标系。摄像机坐标系和屏幕坐标系相似,差别在于摄像机坐标系处于3D空间中,而屏幕坐标系在2D平面里。摄像机坐标系可以被看作是一种特殊的物体坐标系,该物体坐标系就定义在摄像机的屏幕可视区域。
摄像机坐标系描述的是物体是否绘制渲染,并且在屏幕上显示出来。可以这样认为,即使视野再宽广,也无法一眼看到整个世界,这样读者就会发现摄像机坐标系的意义所在。
摄像机坐标系描述的问题是哪些物体应该绘制渲染并且显示在屏幕上,主要包括物体是否在摄像机坐标系区域内、物体的渲染顺序和物体的遮挡绘制。
因此,摄像机坐标系描述的问题是非常复杂的,一个好的虚拟引擎在这方面的表现肯定会非常突出,如区域裁剪、物体的遮挡渲染等。
对于坐标系基本了解以后,读者可能会发现其中并没有涉及OSG,这是因为前面讲解的都是一些基本的概念,只有了解了这些基础知识后才能够轻松理解后面的内容。
OSG对于上面所描述的3种坐标系都有比较好的应用,具体实现可参见源代码。OSG采用的世界坐标系是左手坐标系,这点与OpenGL是保持一致的。值得注意的是它们之间的坐标轴方向不一样。
- OSG:X正方向向右,Y正方向朝里,Z正方向朝上。
- OpenGL:X正方向向右,Y正方向朝上,Z正方向朝外。
OSG的坐标系统可以理解为OpenGL坐标系统绕X轴顺时针旋转90°,读者需牢记并理解坐标系,以后经常会遇到按一定的要求进行图形变换的情况。
下图形象地描述了两个坐标系,其中,左侧的为OSG的坐标系,右侧的为OpenGL的坐标系。