使用flash10的Matrix3D类进行2D非仿射变换时,我一直非常烦人。基本上,我有一个精灵中的正方形和四个形成四边形的点,我想对精灵应用一个变换,使这些点成为精灵的顶点。
使用3x3矩阵解决这个数学问题没有太大问题,例如this case。问题是flash的本机变换Matrix类不执行非仿射变换 - 这意味着,无法访问Matrix类的u v w字段。
随着flash10对3D的原生支持,它引入了Matrix3D类,它允许非仿射变换,但是使用起来很麻烦。基本上,无论你在这个矩阵上应用什么,都不会出现在屏幕上,因为它将应用PerspectiveProjection类的强制投影矩阵。无法禁用此投影,此perspectiveProjection矩阵始终是不可逆矩阵(* 1)。这里描述的方法 - 在stackoverflow,关于flash10正交投影 - ,将fieldOfView属性定义为接近0,或者将focalLengh定义为一个巨大的数字,将无助于使用非仿射的边缘情况的透视投影无效2d转换。这意味着即使我们可以在使用Matrix3D的正常剪切/缩放/旋转时进行几乎正交投影,但具有非仿射2D变换的Matrix3D上的相同PerspectiveProjection仍将具有不期望的透视投影。有没有办法让这个perspectiveProjection无效?或者更好的方法呢?现在我正在使用一种解决方法,将平面分成两个三角形,并对它们应用两个仿射变换。
非常感谢你! Cauê
(* 1)当焦距等于1时,透视投影矩阵具有以下形式:
-- --
| 1 0 0 0 |
| 0 1 0 0 |
| 0 0 1 0 |
| 0 0 1 0 |
-- --
^ No, sadly this wasn't a typo!