常规。一些警示:
你可能发现我们这里给的知识点和其它的网上或者书本上的有点不一样。这些知识当然是一样的,知识矩阵的参数的顺序或者是符号有点不同。这是因为不同的作者或者程序,使用不同的习惯表达。为了能过跟上这个逻辑而不用关注其它的档案里面说的。这篇文章和下篇文章我们会准确地介绍一些书本上或者是代码实现上的一些习惯使用。
(1)点和矩阵相乘
这片教程中,我们会把之前我们学习的点,向量,矩阵,坐标系统全部结合起来。最后,你会学习到矩阵是如何工作的。在之前的篇章中,我们提到了两个矩阵相乘需要有相关的行列限制。比如,一个矩阵的大小是m × p,另一个矩阵的大小是p × n那么这两个矩阵就可以相乘。我们同时也在之前的文章中提到了计算机图形,我们会主要处理4 × 4矩阵。
一个点或者是向量是一个三个数字的序列,出于这一点它们可以写成一个1 × 3的矩阵,
点可以写成矩阵的这种形式 P = [xyz].
这里的技巧就是,如果我们把点或者向量写成[1 × 3]的矩阵,我们可以将它们和其它的矩阵相乘。记住,m x p可以和p x n相乘得到的矩阵是m x n。如果第一个矩阵我们可以写成 m = 1 p = 3,那么也就意味这p x n的第二个矩阵就是 3 x n,这里的n可以是大于1的任何数字。在理论上,[1 × 3]的矩阵的后面相乘的矩阵可以是[3 x 1][3 × 2][3 ×3][3 x 4]等等,这里举了一个[1 x3][3x4]的例子:
有两件事情是需要记住的,也是下面我们要解释的。第一就是一点和矩阵相乘会将这个点移动到一个新的位置。点和矩阵相乘得到的还是点。如果它不是,我们就不会使用矩阵来变换点。第二点需要我们记住的是m x p和 p x n相乘得到一个m x n的矩阵。如果我们把我们的点看做是1 x 3的矩阵,那么我们需要得到一个 1 x 3的点的矩阵,那也就是说我们需要一个3 x 3的矩阵和点相乘。1 x 3的点和3x3的矩阵相乘得到一个点,像下面的样子。
在CG中,我们通常使用的是4x4的矩阵而不是3x3的矩阵,我们不久后就会解释原因。但是现在,我们坚持使用3x3的矩阵一段时间。为了完成这个章节,我们会写一些伪代码来表示一个点P和一个3x3的矩阵相乘得到另一个点Pt.如果你需要重新复习矩阵的乘法,请看之前的章节。记住对于新矩阵的每个参数,记着你需要左边的矩阵每排中的数和右边的矩阵每列的数相乘得到的结果再相加。在伪代码中像下面这个形式(不久之后我们会给出4×4的样式):
// multiply coeffs from row 1 with coeffs from column 1
Ptransformed.x = P.x * c00 + P.y * c10 + P.z * c20
// multiply coeffs from row 1 with coeffs from column 2
Ptransformed.y = P.x * c01 + P.y * c11 + P.z * c21
// multiply co