跳到主要内容

Core Graphics和OpenGL里的矩阵运算

· 阅读需 2 分钟

总结下iOS和OpenGL里的矩阵计算

iOS (Core Graphics)

iOS里面的矩阵用行向量表示,所以是矩阵右乘向量.

Quartz 2D举例平移,因为是2d所以是一个3x3的矩阵,3d就是4x4

补充:有朋友问我这里为什么变成了3x3的矩阵?3d则是4x4?

这里使用的齐次坐标。图形学引入齐次坐标的目的主要是合并矩阵运算中的乘法和加法,表示为p' = p*M的形式。即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。

http://localhost:3000

[xy1][ab0 cd0 txty1]=[ax+cy+txbx+dy+ty1]\begin{bmatrix} x&y&1 \end{bmatrix} \cdot \begin{bmatrix} a&b&0 \\\ c&d&0 \\\ t_x&t_y&1 \end{bmatrix} = \begin{bmatrix} ax+cy+t_x&bx+dy+t_y&1 \end{bmatrix}

所以CGAffineTransform CGAffineTransformMakeTranslation ( CGFloat tx, CGFloat ty );是上面的公式中的 a=d=1b=c=0

也就是矩阵

http://localhost:3000

[100 010 txty1]\begin{bmatrix} 1&0&0 \\\ 0&1&0 \\\ t_x&t_y&1 \end{bmatrix}

如果我们把这个公式用于3d 则是CATransform3D

http://localhost:3000

[xyz1][m11m12m13m14 m21m22m23m24 m31m32m33m34 m41m42m43m44]=[xyz1]\begin{bmatrix} x&y&z&1 \end{bmatrix} \cdot \begin{bmatrix} m11&m12&m13&m14 \\\ m21&m22&m23&m24 \\\ m31&m32&m33&m34 \\\ m41&m42&m43&m44 \end{bmatrix} = \begin{bmatrix} x'&y'&z'&1 \end{bmatrix}

m34可以影响投影矩阵设置为1d-1 \over d表示向z=d的平面进行透视投影

OpenGL

OpenGL使用列向量表示,所以是矩阵左乘向量.

http://localhost:3000
[abcd efgh ijkl mnop][x y z w]=[ax+by+cz+dw ex+fy+gz+hw ix+jy+kz+lw mx+ny+oz+pw]\begin{bmatrix} a&b&c&d \\\ e&f&g&h \\\ i&j&k&l \\\ m&n&o&p \end{bmatrix} \cdot \begin{bmatrix} x\\\ y \\\ z \\\ w \end{bmatrix} = \begin{bmatrix} ax+by+cz+dw \\\ ex+fy+gz+hw \\\ ix+jy+kz+lw \\\ mx+ny+oz+pw\end{bmatrix}

OpenGL的透视投影计算可以参考这篇文章