矩阵变换的种类
旋转 缩放 平移 镜像 切换 投影(平行投影) 投影(透视投影) 可逆 等角 正交 刚体
2D旋转矩阵
public void Rotate(int degrees)
{
float angle = (float)(degrees / 360.0f * Math.PI);
float newX = (float)(a.X * Math.Cos(angle) - a.Y * Math.Sin(angle));
float newY = (float)(a.X * Math.Sin(angle) + a.Y * Math.Cos(angle));
a.X = newX;
a.Y = newY;
newX = (float)(b.X * Math.Cos(angle) - b.Y * Math.Sin(angle));
newY = (float)(b.X * Math.Sin(angle) + b.Y * Math.Cos(angle));
b.X = newX;
b.Y = newY;
newX = (float)(c.X * Math.Cos(angle) - c.Y * Math.Sin(angle));
newY = (float)(c.X * Math.Sin(angle) + c.Y * Math.Cos(angle));
c.X = newX;
c.Y = newY;
}
2D缩放矩阵
2D平移
3D旋转矩阵
下图展示的是延不同轴旋转的一个计算方法
3D缩放矩阵
3D平移
下图展示的是3D旋转和平移相结合的矩阵如何计算
利用旋转矩阵我们可以把任意位置向量沿一个单位旋转轴进行旋转。也可以将多个矩阵复合,比如先沿着x轴旋转再沿着y轴旋转。但是这会很快导致一个问题——万向节死锁(Gimbal Lock,可以看看这个视频(优酷)来了解)。在这里我们不会讨论它的细节,但是对于3D空间中的旋转,一个更好的模型是沿着任意的一个轴,比如单位向量$(0.662, 0.2, 0.7222)$旋转,而不是对一系列旋转矩阵进行复合。这样的一个(超级麻烦的)矩阵是存在的,见下面这个公式,其中(Rx,Ry,Rz)(Rx,Ry,Rz)代表任意旋转轴: