【问题标题】:Canvas image scaling, rotating, drawing画布图像缩放、旋转、绘图
【发布时间】:2012-12-20 10:56:12
【问题描述】:

对于一个游戏项目,我使用文件名、位置、比例、旋转等属性绘制图像。

这是绘制的部分:

this.context.save();
this.context.translate(item.position.x, item.position.y);
if (item.rotation > 0) {
    this.context.rotate(item.rotation * (Math.PI / 180));
}
if (item.scale.x !== 1 || item.scale.y !== 1) {
    this.context.scale(item.scale.x, item.scale.y);
}
var width = item.imageSize.width * item.scale.x;
var height = item.imageSize.height * item.scale.y;
this.context.drawImage(this.assets.image[item.fileName], -(width / 2), -(height / 2), width, height);
this.context.restore();

(别介意奇怪的定位,不重要)

这很好用,但有一点我不明白:

可以通过两种不同的方式进行旋转和缩放:首先缩放然后旋转,或者其他方式。从逻辑上讲,人们会认为先缩放然后旋转是正确的,但由于某种原因,它只有在我先旋转然后缩放时才能正常工作。

这样做的正确方法是什么?

【问题讨论】:

  • 哇,时髦!我希望顺序对于这些类型的转换无关紧要......

标签: javascript canvas


【解决方案1】:

您的对象的原点在哪里? x/y 是左上角吗?如果是这样,那可能会导致问题。

Demo Scaling Then Rotating

ctx.translate(box.x, box.y);
ctx.scale(2,2);
ctx.rotate(box.angle);

Demo Rotating Then Scaling

ctx.translate(box.x, box.y);
ctx.rotate(box.angle);
ctx.scale(2,2);

如果您注意到无论我何时执行缩放和旋转,这两个演示都可以正常工作。然而,我的原点(我翻译到的地方)位于方框的中心。

要回答(或尝试)您的问题,没有正确或错误的方法,您可以先缩放或先旋转,这实际上只是一个偏好问题。

【讨论】:

  • 如果你对 x 和 y 进行同样的缩放,那么它们的结果是一样的,但是如果你对 x 和 y 进行不同的缩放...参见jsfiddle.net/sekhk/3jsfiddle.net/sekhk/4
  • @Lukas 说得好,但是我只是把它当作常识,所以我没有提到它,但这很可能是他的问题。
  • Arg,不能编辑上面的评论,意味着常识而不是常识……这有点粗鲁。
【解决方案2】:

“正确的方法”实际上取决于您要做什么。对您而言,这似乎是旋转然后缩放会产生您所期望的结果。

这是一个小提琴,它显示了旋转然后缩放和缩放然后旋转之间的区别:http://jsfiddle.net/HYbC7/3/

让我意想不到的是缩放然后旋转。如果你 scale(x, y) 其中 xy 不相等,则旋转,那么沿 x 轴的旋转将不同于沿 y 轴的旋转,并且生成的网格将倾斜。

【讨论】:

  • 这是由于画布如何与翻译等一起工作。想象一个橡胶方块,你只能从南北拉,所以如果拉的时候它不旋转,它看起来会高一点,但是如果你转动它然后拉它,你可能会以一个角度抓住它的侧面这将使它看起来歪斜。缩放总是从 x-y 轴开始,所以如果你先旋转然后缩放不均匀的量,你会得到奇怪的倾斜。
猜你喜欢
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
相关资源
最近更新 更多