如何准确地绘制旋转的位图?

4
我有一个包含遮罩位图的容器。该容器在运行时更改缩放和旋转,我需要绘制遮罩位图,但无法找到适当的矩阵计算方法。
我的代码可以正确反映位置、缩放和居中偏移量,但未进行旋转时。当旋转后,角度是正确的,但位置不正确 - 我认为这是因为矩形在旋转时尺寸会发生变化。
请问有人能帮我解决这个位置调整问题吗?以下是一些代码:
 // Adjust the transformation matrix to account for the position of the container
        var tMatrix:Matrix = _imgContainer.transform.matrix;

        //Offset for container
        tMatrix.translate(this.x,this.y);

        //Offset for bounds centering
        tMatrix.translate(-_imgContainer.width/2,-_imgContainer.height/2);   

       // Compensate for rotation
       // ????

   var result_bitmap:BitmapData = new BitmapData(_maskedImg.width,_maskedImg.height,true,0x00FFFFFF);
   result_bitmap.lock();
   result_bitmap.draw(_maskedImg,tMatrix,null,null,null,true);
   result_bitmap.unlock();

感谢您提供的任何帮助。
编辑:如果我没有解释清楚,很抱歉,让我再试一次并附上图片支持。我在容器中有一个掩蔽位图,我正在使用它作为绘制新位图的源。用户可以在捕获之前在运行时缩放/旋转此容器。为了实现这一点,我根据容器矩阵传递了一个变换矩阵给绘制方法,并调整tx和ty值以考虑非零原点(由于居中)。到这个地步它工作得很好,捕获了我所期望的内容。
然而,一旦这个容器被旋转,捕获的位置又会偏移 - 可能是由于尺寸的改变,因此新尺寸的容器的tx/ty偏移量现在不正确。我只需要弥补这一点,但无法想出如何做到这一点。
有谁有变换矩阵的经验可以帮忙吗?再次感谢您的努力!

我不太明白你想做什么:你能发一张图片或截图吗? - Richard Inglis
已更新问题,提供更好的解释和2张参考图片 - 感谢您的努力。 - WillyCornbread
4个回答

1

针对可能遇到类似问题的任何人,提供一些信息。我通过明确设置转换矩阵值并按照 特定顺序 进行缩放、旋转和平移来解决了我的问题。

这是与从容器中复制转换矩阵不同的方法。

var tMatrix:Matrix = _imgContainer.transform.matrix;

我直接按照这个顺序设置数值:

tMatrix.scale (_imgContainer.scaleX, _imgContainer.scaleY);
tMatrix.rotate (_imgContainer.rotation * (Math.PI/180));
tMatrix.translate (_imgContainer.x, _imgContainer.y);

感谢您的努力 -

b


这个问题的出现是因为当你进行翻译时,旋转发生的点会根据该翻译而改变。 你在这里使用的操作顺序并不是一个通用解决方案;相反,它是特定于用户应用的变换顺序,你的捕获代码必须完全匹配(尽管具有不同的值)。 - Dustman
Dustman - 你声称翻译的顺序严格取决于用户转换源位图容器的顺序是不正确的。无论用户以何种顺序应用源的缩放、位置和旋转,上述代码中的变换顺序始终能够正确地呈现。-b - WillyCornbread

0
如果位图包含在容器内,应该将应用于容器的任何变换也应用于其中包含的内容。
我不会对位图应用任何变换,只会将它们应用于容器。

所有的变换都应用于容器,我的问题特别是关于绘制位图时的变换矩阵,以及如何在绘制过程中补偿旋转。 - WillyCornbread
旋转位图有什么不同之处呢?但是,我想旋转可能是以不同的“中心点”为基础的,所以您可能需要检查对齐方式。 - Daniel
问题不在于位图的旋转 - 当从源位图数据绘制新位图时,对源的变换(缩放、旋转等)不会被考虑。您需要传入一个变换矩阵来转换源。当源被旋转时,与 .tx 和 .ty 值相关的这个变换矩阵是我遇到的问题。谢谢。-b - WillyCornbread

0

我不确定我完全理解了你的问题,但值得注意的是,如果你将一个大小为100x200的对象旋转90度,它将会变成200x100的宽度和高度。

有很多方法可以解决这个问题,但我通常使用scaleX / scaleY,因为它们不受旋转的影响,并将其与剪辑的原始宽度/高度相乘。


0

我也没有完全理解你想做什么,但我明白你应用的旋转会改变应用变换矩阵时需要使用的tx/ty。

基于此,也许这可以帮助你:http://www.senocular.com/flash/tutorials/transformmatrix/ 查看“操作变换矩阵”部分,特别是关于使用deltaTransformPoint忽略平移值的部分。虽然是AS2,但希望这些原则能让你找到正确的方向。


谢谢 - 我会看一下。我将返回并重写其中一些内容,以查看是否可以简化我的测试用例并接近解决方案。如果我找到了解决方法,我会更新的... - WillyCornbread

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