【问题标题】:Using "Matrix" to rotate two "Bitmap"使用“矩阵”旋转两个“位图”
【发布时间】:2012-11-09 05:26:40
【问题描述】:

我有一个Canvas 和一个Bitmap。我必须在画布上绘制位图两次并旋转它们。这是我的代码:

Bitmap bitmap = ... ;
Matrix matrix = new Matrix();
Camera camera = new Camera();
camera.save();

// First drawing:
camera.rotateX(x_rotate_angle);
camera.rotateY(y_rotate_angle);
camera.getMatrix(matrix);
matrix.postTranslate(0, 0);
matrix.postScale(3, 3);
canvas.drawBitmap(bitmap, matrix, null);
camera.restore();

// Second drawing:
camera.rotateX(x_rotate_angle);
camera.rotateY(y_rotate_angle);
camera.getMatrix(matrix);
matrix.postTranslate(10, 10 + bitmap.getHeight());
matrix.postScale(3, 3);
canvas.drawBitmap(bitmap, matrix, null);

旋转前的结果:

当位图只旋转X轴时,一切都很好。在这种情况下,结果如下所示:

在上面的两个图像中,您可以看到所有边缘都是parallel。但是当位图旋转Y轴时,边缘将不平行(顶部位图的底部边缘穿过底部位图的顶部边缘) :

我做错了什么吗?

【问题讨论】:

    标签: android matrix rotation android-canvas


    【解决方案1】:

    您没有做错任何事,只是您没有理解您将从代码中获得的结果。您使用的相机是 3D 相机,您会看到在 3D 空间中移动相机的结果。旋转相机时,平行线通常不会保持平行。您在绕 y 轴旋转时注意到了伪影,但它也出现在 x 轴旋转的插图中。请注意,对于 x 轴,左右两侧不平行;左侧比右侧更接近垂直。

    Android canvas 对象具有缩放、倾斜、平移和旋转操作。如果您需要的是 2D 操作,您可以完全放弃 camera 对象。

    【讨论】:

    • 感谢您的回复。这似乎合乎逻辑,我猜是这样,但它有一个挑战:当我在 (0,0) 中绘制没有旋转的位图时,然后将相机转换为 (0,0 ,0),然后旋转它并用 (0,0) 中的新矩阵再次绘制位图,在 3D 世界中,我们期望旋转位图的顶部完全被未旋转位图的顶部覆盖,但结果不是。看起来即使您将相机转换为 (0,y0,0) 并旋转 Y 轴,然后在画布中以原点 (x0,y0) 绘制一个圆,圆将在原点 (x1,y1) 绘制,即 y1 y0 而不是 y1 = y0.
    • 您似乎期望 3D 变换表现得像 2D 变换,但事实并非如此。如果这是您想要的,请放弃您正在使用的 3D 界面并使用提供 2D 变换的界面。
    • 你的回复是真的,但是我不明白你最近评论的逻辑。所以我在这里再问一个问题。请看这个问题:stackoverflow.com/q/13438032/1043882
    猜你喜欢
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2014-01-13
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多