3D变换后文字和位图略微模糊。

3

我有一系列包含位图和文本的MovieClip。在应用了一些3D变换并在3D空间中移动后,我的文本和位图稍微模糊了。这是在我重置了所有3D坐标(即z = 0,rotationX = 0,rotationY = 0)之后发生的。 有其他人遇到过这种情况吗?是否有解决办法可以让我的文本和位图保持清晰?

4个回答

2

这是一个非常有趣的错误。

出现的模糊实际上是不正确的抗锯齿或平滑处理,通常通过在边缘使用细颜色渲染字体来解决。但在本例中,它实际上是由3D转换引起的,可以通过在动画后将matrix3D归零来解决:

myTextContainer.transform.matrix3D = null;

你也可以这样写:

myTextContainer.transform.matrix = new Matrix();

但使用这种方法,您将需要导入flash.geom.Matrix

这两个选项还会将动画显示对象的xy坐标重置为零,并可能重置其他重要设置,因此您还需要将这些值分配给变量,并在将转换矩阵归零后重新应用它们

似乎一旦字体被转换,就会失去这种精细的颜色调整。未经转换的字体具有这些色彩细节,而转换的字体则完全变得无色。

附上一个放大的12点字体细节图,展示了这种颜色细节的丢失。顶部字符串没有3D变换,而底部字符串是通过rotationY动画添加到舞台上的。

enter image description here

这里是同一张图片饱和度为90%的版本,以更清晰地显示颜色:

enter image description here

这些颜色细节在灰色文本上更容易看到。

我认为自从Flash Player 9 / AVM2首次推出以来,这个错误就一直存在。此外,正确呈现的字体周围的精细颜色细节在Flash播放器的早期版本中更加饱和,这在我看来使字体看起来更好 - 尽管与像我这样的完美主义者不同的非完美主义者可能认为差异可以忽略不计。


这在Adobe Animate - Flash player 25中仍然是一个问题........感谢您的解决。 - Zze

1

你需要确保将应用了3D变换的任何对象的matrix3D属性设置为null。


好的,听起来不错,但是这样你就失去了你的3D变换。 - user562566
这会破坏您可能需要的3D变换。 - earl3s

0
一个更好的解决方案是使用这个修复方法。这是我以前经常使用的方法。
    /**
     * 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类中。


0

查找了另一篇关于3D问题的帖子,发现解决方案。 您需要通过应用新的transform.matrix来删除所有的3D转换。

var tempMatrix:Matrix = new Matrix(); this.transform.matrix = tempMatrix;


模糊可能是由于矩阵数学中的累积舍入误差引起的。我也在Silverlight中注意到了类似的效果。 - ChrisF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接