HTML5 Canvas 翻译、旋转、缩放

Posted

技术标签:

【中文标题】HTML5 Canvas 翻译、旋转、缩放【英文标题】:HTML5 Canvas translate, rotate, scale 【发布时间】:2022-01-10 16:18:58 【问题描述】:

对于一个小游戏,我为 html5 画布编写了一个相机组件。您应该能够缩放(鼠标滚轮)、平移(鼠标左键)和旋转(鼠标右键)。如果您尝试向上移动,我的问题是旋转后方向错误并且图像向下移动。

我在这里准备了一个例子:

https://codepen.io/rogerbuecker/pen/yLzYqXq

我当前的绘制代码:

canvas.width = window.innerWidth
canvas.height = window.innerHeight
    
// Translate to the canvas centre before zooming - so you'll always zoom on what you're looking directly at
ctx.translate( window.innerWidth / 2, window.innerHeight / 2 )
ctx.rotate(cameraRotation*Math.PI / 180)
ctx.scale(cameraZoom, cameraZoom)
ctx.translate( -window.innerWidth / 2 + cameraOffset.x, -window.innerHeight / 2 + cameraOffset.y )

问候罗杰

【问题讨论】:

你所说的方向到底是什么意思?同样出于好奇,在第一次翻译之前调用ctx.save() 并在最后一次翻译之后调用ctx.restore() 是否可以解决问题? 将图像旋转 180 度后,当我想通过拖放向上移动图像时,它会向下移动。 ctx.save 和 restore 在这里没有帮助 【参考方案1】:

我找到了解决办法:

https://codepen.io/rogerbuecker/pen/yLzYqXq

错过了我 invertSelf 转换以获得位置的部分

var transform = ctx.getTransform();
const invMat = transform.invertSelf();

【讨论】:

平移有效,但非常有问题。旋转在 Chrome 中失控。【参考方案2】:

我对画布没有太多经验,但对 css 变换属性有一点经验。

尝试创建一个容器对象,在其中放置您现在拥有的任何东西。然后,当您需要移动图像或与持久方向相关的东西时,只需将您想要的任何东西移动或应用到大容器,然后旋转到其中的小容器。

让我知道它是否适合你。

【讨论】:

以上是关于HTML5 Canvas 翻译、旋转、缩放的主要内容,如果未能解决你的问题,请参考以下文章

HTML5 Canvas:我如何在旋转后处理反向翻译()?

HTML5 Canvas - 在不翻译上下文的情况下相对于对象的中心进行缩放

html5图像旋转缩放并上传

HTML5——Canvas 高级操作

如何旋转 HTML5 画布的现有内容?

HTML5:Canvas 标签