我正在尝试使用2D渲染上下文在HTML5 Canvas中制作一种相机。如下图所示,这是我想要实现的目标:
(编辑:更改了转换对象为ctx以进一步简化代码。)
可通过输入更改变量worldRotate和worldPos进行测试。
编辑:这是一个真实的示例,其中绘制了问题,使我更加清楚地了解到我要实现的内容。
尝试将其向右或向左移动,看看会发生什么。然后尝试向右旋转相机,使红色框与x轴对齐,然后移动相机,看它如何完美地像我想要的相机一样工作。
(注:建议使用IE10、最新的Chrome、最新的Firefox、最新的Opera和桌面Safari 5+进行测试)。 问题是,当我移动相机(通过更改worldPos,使红色框远离相机),进行旋转(使用worldRotate),然后再次移动相机时,红色物体始终朝着紫色箭头而不是橙色箭头移动。我希望红色框无论如何旋转相机的中心,都能朝向橙色箭头移动。 编辑:据我所知,很明显旋转会导致翻译出错,因为旋转改变了红色框的坐标系,但我仍然不知道如何处理它,至少让翻译像橙色箭头一样进行,而不管它当前旋转后的坐标系。
有关此问题的解决方案吗?谢谢。
- 假设黑色方块是相机的眼睛,我希望它能够随着画布(如图片中的绿色箭头)移动,并且看起来像是环绕物体旅行,就像红色方块一样(我认为这是视差效果)。
- 每当我环绕物体旋转相机时,我希望它围绕相机中心旋转(见蓝色旋转)。
*Within the requestAnimationFrame (game loop)*
...
ctx.canvas.width = window.innerWidth;
ctx.canvas.height = window.innerHeight;
ctx.clearRect(0, 0, window.innerWidth, window.innerHeight);
ctx.save();
// draw camera eye.
ctx.lineWidth = 3;
ctx.fillStyle = "black";
ctx.beginPath();
ctx.moveTo(ctx.canvas.width / 2 - 50, ctx.canvas.height / 2);
ctx.lineTo(ctx.canvas.width / 2 + 50, ctx.canvas.height / 2);
ctx.moveTo(ctx.canvas.width / 2, ctx.canvas.height / 2 - 50);
ctx.lineTo(ctx.canvas.width / 2, ctx.canvas.height / 2 + 50);
ctx.stroke();
// Rotate by camera's center.
ctx.translate(ctx.canvas.width / 2, ctx.canvas.height / 2);
ctx.rotate(worldRotate);
ctx.translate(worldPos.x, worldPos.y);
//
// ADD WORLD ENTITIES BELOW to be viewed by the camera.
//
ctx.fillStyle = "red";
ctx.fillRect(-5, -5, 10, 10);
ctx.restore();
...
(编辑:更改了转换对象为ctx以进一步简化代码。)
可通过输入更改变量worldRotate和worldPos进行测试。
编辑:这是一个真实的示例,其中绘制了问题,使我更加清楚地了解到我要实现的内容。
尝试将其向右或向左移动,看看会发生什么。然后尝试向右旋转相机,使红色框与x轴对齐,然后移动相机,看它如何完美地像我想要的相机一样工作。
(注:建议使用IE10、最新的Chrome、最新的Firefox、最新的Opera和桌面Safari 5+进行测试)。 问题是,当我移动相机(通过更改worldPos,使红色框远离相机),进行旋转(使用worldRotate),然后再次移动相机时,红色物体始终朝着紫色箭头而不是橙色箭头移动。我希望红色框无论如何旋转相机的中心,都能朝向橙色箭头移动。 编辑:据我所知,很明显旋转会导致翻译出错,因为旋转改变了红色框的坐标系,但我仍然不知道如何处理它,至少让翻译像橙色箭头一样进行,而不管它当前旋转后的坐标系。
有关此问题的解决方案吗?谢谢。