Canvas四点绘制图像:旋转后图像与轮廓错位问题排查
问题原因分析与修复方案
核心问题原因
你用this.body.bounds.min作为绘制基准坐标是错位的根源:bounds.min是matter.js为旋转后的物体生成的轴对齐包围盒(AABB)的最小坐标点,这个点会随着物体旋转不断偏移,并不是物体自身的旋转中心(质心)。而matter.js中所有物理物体的旋转都是围绕质心进行的,你以包围盒偏移后的点加半宽半高作为旋转原点,必然导致图像旋转中心和物理引擎的旋转中心不一致,最终出现错位。
修复方案
1. 替换坐标存储逻辑
放弃使用包围盒坐标,改用物体的质心位置作为基准坐标,这是matter.js物体旋转的真正原点:
this.coordinates = [this.body.position.x, this.body.position.y];
2. 调整绘制逻辑
以质心为旋转原点,结合相机偏移计算绘制位置,同时简化上下文恢复逻辑(save/restore会自动帮你回滚变换,无需手动反向操作):
var x = this.coordinates[0] - camera[0]; var y = this.coordinates[1] - camera[1]; var rotation = this.body.angle; ctx.save(); // 平移到相机偏移后的质心位置 ctx.translate(x, y); // 围绕质心执行旋转 ctx.rotate(rotation); // 以图像中心为锚点绘制,偏移负半宽半高 ctx.drawImage(this.source, -this.width / 2, -this.height / 2, this.width, this.height); // 恢复画布初始状态 ctx.restore();
内容的提问来源于stack exchange,提问作者SoJS
相关产品推荐
相关产品推荐

