我有一系列包含位图和文本的MovieClip。在应用了一些3D变换并在3D空间中移动后,我的文本和位图稍微模糊了。这是在我重置了所有3D坐标(即z = 0,rotationX = 0,rotationY = 0)之后发生的。 有其他人遇到过这种情况吗?是否有解决办法可以让我的文本和位图保持清晰?
我有一系列包含位图和文本的MovieClip。在应用了一些3D变换并在3D空间中移动后,我的文本和位图稍微模糊了。这是在我重置了所有3D坐标(即z = 0,rotationX = 0,rotationY = 0)之后发生的。 有其他人遇到过这种情况吗?是否有解决办法可以让我的文本和位图保持清晰?
这是一个非常有趣的错误。
出现的模糊实际上是不正确的抗锯齿或平滑处理,通常通过在边缘使用细颜色渲染字体来解决。但在本例中,它实际上是由3D转换引起的,可以通过在动画后将matrix3D
归零来解决:
myTextContainer.transform.matrix3D = null;
你也可以这样写:
myTextContainer.transform.matrix = new Matrix();
但使用这种方法,您将需要导入flash.geom.Matrix
。
这两个选项还会将动画显示对象的x
和y
坐标重置为零,并可能重置其他重要设置,因此您还需要将这些值分配给变量,并在将转换矩阵归零后重新应用它们。
似乎一旦字体被转换,就会失去这种精细的颜色调整。未经转换的字体具有这些色彩细节,而转换的字体则完全变得无色。
附上一个放大的12点字体细节图,展示了这种颜色细节的丢失。顶部字符串没有3D变换,而底部字符串是通过rotationY
动画添加到舞台上的。
这里是同一张图片饱和度为90%的版本,以更清晰地显示颜色:
这些颜色细节在灰色文本上更容易看到。
我认为自从Flash Player 9 / AVM2首次推出以来,这个错误就一直存在。此外,正确呈现的字体周围的精细颜色细节在Flash播放器的早期版本中更加饱和,这在我看来使字体看起来更好 - 尽管与像我这样的完美主义者不同的非完美主义者可能认为差异可以忽略不计。
你需要确保将应用了3D变换的任何对象的matrix3D属性设置为null。
/**
* Fixes the slight distortion that occurs when an object has a 3D transform associated with it.
* @param di:DisplayObject The DisplayOjbect to fix.
*/
public function fix3DBlur(di:DisplayObject):void {
di.scaleX = di.width / (di.width - 1);
di.scaleY = di.height / (di.height - 1);
}
这个函数设置了稍微偏移的scaleX和scaleY。听起来有点奇怪,但是当你使用任何3D属性对对象进行3D调整时,它可以防止模糊。你总是可以移除3D变换,但有时候你需要它保持在原地。
我把这个函数放在我自己的Utilities3D类中。
查找了另一篇关于3D问题的帖子,发现解决方案。 您需要通过应用新的transform.matrix来删除所有的3D转换。
var tempMatrix:Matrix = new Matrix(); this.transform.matrix = tempMatrix;