• JP Lee

简单整理了 SD里使用的数学算法。

比起深入理解,大概理解成是用这种数学形态做出的工具会事更好的学习方向。

理解 Transform2D Node 的行列。 利用 2X2 旋转行列进行 2D 旋转和尺寸的变更

线性变化(Linear transformation)

两个vector空间之间的变换 f和任意常数 c, 两个vector α, β满足以下条件的话, f就是线性变换。

f(α+β)=f(α)+f(β)
f(cα)=cf(α)

先看下 SD 的 Transformation 2D 的 inspector 。


标记的是 Transform matrix ,包含旋转和拉伸(大小,变皱,对称) 。

点一下 Matrix 键。


可以看到显示的是 2X2 行列式。

通常使用 matrix 的时候不会依赖于特殊计算,优点是可以快速处理。

但是也有缺点,旋转图片的时候像素间就不能做 Interpolation 。

这种现象在 0度 , 90度 , 180度等对称型的时候没有大问题,但是非对称的其他角度会有该问题。


通常图片在 Resizing 的时候会 dithered pixel sampling 所以做高分辨率贴图的时候不是很明显。


满足线性变换的具有代表性的变换就是旋转,放大、变皱、对称、投影也属于这部分。


不管是先旋转θ然后再旋转 ω,还是先旋转 ω再旋转 θ, 结果如果是 (θ+ω)的话,就可以知道旋转是线性变换。

移动不是线性变换。所以为了用一个行列表现变换, 会使用利用齐次坐标(Homogeneous coordinates)的仿射变换(Affine transformation)。

现在就可以推算出, SD 提供的 Transformation 2D 的旋转和大小变更(Scale)是使用 2X2 transform matrix ,Offset 是使用仿射变换(Affine transformation)。


反推

先把基底vector (1,0)(1,0)和 (0,1)(0,1)旋转θ。


如图片所示,把 (1,0)旋转 θ 就是(cosθ,sinθ) 然后把 (0,1)旋转 θ就是 (−sinθ,cosθ)。



然后旋转行列 R是线性变换,所以以下是成立的。



这里 R(1,0)和 R(0,1)就是 (cosθ,sinθ), (−sinθ,cosθ)所以代入后反推就结束了。



相应 0 度的旋转行列是单位矩阵(Identity matrix)。

2X2 旋转行列在除了 0度和 180度外的其他角度里,因为固有值和固有vector会因为非对称性表现成复数的形态。

© 2014 by LEEGOONZ HOME.