【转】投影矩阵的推导

原文:https://www.cnblogs.com/wonderKK/p/5695116.html 

博主: 这篇文章写得非常好,对投影矩阵的推导清晰明了,但有个错误:推导的全程是基于列矩阵,右手坐标系的,而不是作者文中说的左手坐标系

在DX中以LH结尾的函数表示left hand,即左手坐标系,这是DX默认的坐标系,在LH规则下,矩阵是行矩阵,向量与矩阵相乘是:向量X矩阵,即右乘

而GL中向量与矩阵相乘是:矩阵X向量

参考另一篇文章:https://blog.csdn.net/popy007/article/details/4091967

---------------------------------------------------------------------------------------------------------------------------------------

转自:

本文乃<投影矩阵的推导>译文,原文地址为:

,由于本人能力有限,有译的不明白的地方大家可以参考原文,谢谢^-^!

在3D图形程序的基本矩阵变换中,投影矩阵是其中比较复杂的。平移和缩放浏览一下就能理解,旋转矩阵只要掌握了三角函数知识也可以理解,但投影矩阵有点棘手。如果你曾经看过投影矩阵,你会发现你的常识不足以告诉你它是怎么来的。而且,我在网上还未看到许多关于如何推导投影矩阵的教程资源。本文的话题就是如何推导投影矩阵。

对于刚刚开始接触3D图形的人,我应该指出,理解投影矩阵如何推导可能是我们对于数学的好奇心,它不是必须的。你可以只用公式,并且如果你用像Direct3D那样的图形API,你甚至都不需要使用公式,图形API会为你构建一个投影矩阵。所以,如果本文看起来有点难,不要害怕。只要你理解了投影矩阵做了什么,你没必要在你不想的情况下关注它是怎么做的。本文是给那些想了解更多的程序员的。

        概述: 什么是投影?

计算机显示器是一个二维表面,所以如果你想显示三维图像,你需要一种方法把3D几何体转换成一种可作为二维图像渲染的形式。那也正是投影做的。拿一个简单的例子来说,一种把3D对象投影到2D表面的方法是简单的把每个坐标点的z坐标丢弃。对立方体来说,看上去可能像图1:

【转】投影矩阵的推导

图1: 通过丢弃Z坐标投影到XY平面

当然,这过于简单,并且在大多数情况下不是特别有用。首先,根本不会投影到一个平面上;相反,投影公式将变换你的几何体到一个新的空间体中,称为规范视域体(canonical view volume),规范视域体的精确坐标可能在不同的图形API之间互不相同,但作为讨论起见,把它认为是从(-1, -1, 0)延伸至(1, 1, 1)的盒子,这也是Direct3D中使用的。一旦所有顶点被映射到规范视域体,只有它们的x和y坐标被用于映射到屏幕上。这并不代表z坐标是无用的,它通常被深度缓冲用于可见度测试。这就是为什么变换到一个新的空间体中,而不是投影到一个平面上。

注意,图1描述的是左手坐标系,摄像机俯视z轴正方向,y轴朝上并且x轴朝右。这是Direct3D中使用的坐标系,本文中我都将使用该坐标系。对于右手坐标系系统来说,在计算方面没有明显差异,在规范视域体方面有一点区别,所以一切讨论仍将适用即使你的图形API使用与Direct3D不同的规定。

现在,可以进入实际的投影变换了。有许多投影方法,我将介绍最常见的2种:正交和透视。

        正交投影(Orthographic Projection)

正交投影,之所以这么称呼是因为所有的投影线都与最终的绘图表面垂直,是一种相对简单的投影技术。视域体,也就是包含所有你想显示的几何体的可视空间——是一个将被变换到规范视域体的轴对齐盒子,见图2:

【转】投影矩阵的推导

图2: 正交投影

正如你看见的,视域体由6个面定义:

【转】投影矩阵的推导

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzffzw.html