坐标系统之间的转换
概要
这篇文章中,我们来聊聊 OpenGL 中的坐标系统以及它们之间的转换。
(⚠️阅读本文需要有线性代数基础。)
坐标变换原理
首先,我们需要运用一点线性代数的知识,了解不同坐标系统变换的原理。
由于本文针对的是三维坐标,所以讨论的空间是 空间。
在标准三维坐标系中,我们通常用一个向量 v=[x, y, z] 来表示一个点的位置。这里的 x、y、z 分别对应 x 轴、y 轴以及 z 轴三个方向的偏移,而标准三维坐标空间的基采用的是三个互相垂直的向量 , , 。但根据线性无关等知识,我们完全可以找出另外三个向量作为三维空间的基,只要这三个向量线性无关,同样能够张成 空间。
现在,假设坐标系 A 采用的基向量是 {},坐标系 B 采用的是{, , }。
那么,根据线性无关性,我们可以得到线性方程组:
用矩阵方程的形式表示为:
由于 , 都是三维空间的基,因此,对于三维空间内任意一个向量 ,、都可以通过线性组合的方式表示出 :
(这里的, 分别表示不同坐标空间的标量)。
结合前面 ,进一步得到:,
继而 :,。
好了,到这里,关键的东西就讲完了。所以坐标系统的变换很简单有木有!如果你在B坐标系(基向量为{, , })中有个向量 ,沿用上面的假设, 的坐标为 (即 ),这个时候,我们想求出它在 A 坐标系(基向量为{})的坐标表示(假设为),我们只需要求出矩阵 ,则:。
反之同理。
这个时候,有同学可能会问矩阵 怎么求?
假设一个坐标系统的基向量为{, , },而另一个系统采用标准向量{, , },假设存在关系:(这个式子的理解是:如果 是两个坐标系统的变换矩阵,那么两个系统内的任意向量可以通过这个矩阵相互转换,基向量只不过是特殊的向量,一样可以通过 进行转换),那矩阵 其实可以表示为 []。这个结果其实很好理解,只要换种写法:
,,可以发现,其实是一个单位矩阵。
而如果是非标准坐标系统之间的变换,则需要解一个线性方程组:,而且可以肯定,这个解存在且唯一。
尽管从上面的推论中我们可以得出,不同坐标系统可以通过一个唯一的 3*3 矩阵 来变换,但都是基于坐标原点相同的前提。如果原点也发生变化,这时就必须引入第四个维度来表示平移的偏移量,也就是常说的齐次坐标。
引入第四维后,,,我们再次用一个矩阵 来转换这两个坐标系统,不同的是,这里的 是一个 4*4 的矩阵:
除了多出一维外,齐次坐标与上面使用的三维坐标本质上没有区别,计算方法也基本一致,在对应到三维坐标系时,只需要舍弃第四个维度即可。
OpenGL中的坐标系统
OpenGL 的坐标系统有六种:
- Object (or model) coordinates
- World coordinates
- Eye (or camera) coordinates
- Clip coordinates
- Normalized device coordinates
- Window (or screen) coordinates
模型坐标系 (Object coordinates) 是每个模型在制作时特有的,如果要把模型放入世界,就需要将所有模型的坐标系转换成世界坐标系 (World coordinates)。世界中的场景需要通过相机被人眼观察,需要将世界坐标系转换成相机坐标系 (Eye coordinates)。从模型坐标系,到世界坐标系,再到相机坐标系的变换,通常称为 model-view transformation,通过 model-view matrix 来实现。
前三种坐标系统通常是由用户指定的,而后三种坐标系统一般都是在 OpenGL 管道中,由程序自己实现的。
而 OpenGL 中坐标系统转换的原理,其实就是上面所讲的那些,只不过在使用时,我们可以使用一些 API 来简化不少工作。
参考
- Interactive Computer Graphics - A Top-Down Approach 6e By Edward Angel and Dave Shreiner (Pearson, 2012)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异