繁体   English   中英

根据相机位置和旋转计算相对项目位置

[英]Calculating relative item positions based on camera position and rotation

对于2D游戏,我有以下概念:

  • 阶段:放置物品和照相机的容器。
  • 项目:位于世界某个点上,从中心锚定的可见实体。
  • 相机:一个看不见的实体,用于生成相对于世界的图像,位于世界的某个点上,从中心锚定。

在插图中,您可以看到它们之间的关系以及最终结果。

图片1图片2

这是我的代码:(将其简化以使其易于阅读)

注意1:这不是在画布上发生的,因此我不会使用画布平移或旋转(即使那样,我也不认为这会使问题变得更容易)。

注2:项目和摄像机位置为中心坐标。

var sin = Math.sin(rotationRad);
var cos = Math.cos(rotationRad);

var difX = item.x - camera.x;
var difY = item.y - camera.y;
var offsetX = camera.width / 2;
var offsetY = camera.height / 2;

var view.x = (cos * difX) - (sin * difY) + _Ax + _Bx;
var view.y = (sin * difX) + (cos * difY) + _Ay + _By;

这应该通过以下方式计算项目新职位:

  • 通过围绕相机中心旋转来计算物品的新位置
  • (_A *)通过偏移相机位置来调整项目位置
  • (_B *)通过偏移相机尺寸来调整项目位置

我在这里尝试了几种用于_A *和_B *的不同解决方案,但是它们都不起作用。

正确的方法是什么?如果可能,解释是什么?

首先从对象位置减去新的原点位置。 然后,按相反​​的方向旋转它。 新原点可以是视口左上角的相机位置。 当然,如果您知道视口中心,则其左上角是通过减去其尺寸的一半来计算的。

像这样:

var topLeft = Camera.Position - Camera.Size / 2;

var newPosition = Object.Position - topLeft;

newPosition = Rotate(newPosition, -camera.Angle);

旋转非常简单:

rotatedX = x * cos(angle) - y * sin(angle)
rotatedY = y * cos(angle) + x * sin(angle)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM