【问题标题】:Converting screen coordinates to isometric map coordinates将屏幕坐标转换为等轴测地图坐标
【发布时间】:2017-02-05 09:21:04
【问题描述】:

我正在使用菱形图案生成等距平铺地图:

tileWidth = 128;
tileHeight = 94;

for (var x = 0; x < rows; x++) {
  for (var y = 0; y < cols; y++) {
    var screenX = (x - y) * tileWidthHalf;
    var screenY = (x + y) * tileHeightHalf;
    drawTile(screenX, screenY);
  }
}

这可以正确渲染,但现在我无法将屏幕坐标(鼠标位置)转换回等距坐标。

我尝试过反转数学:

var x = _.floor(screenY / (tileWidth / 2) - (screenX / tileWidth / 2));
var y = _.floor(screenY / (tileHeight / 2) + (screenX / tileHeight / 2));

它适用于0, 0 磁贴,但之后无法产生正确的值。

我只是无法提出正确的数学 - 我错过了一些微不足道的事情还是我对这个过程完全错了?

【问题讨论】:

  • 未来访问者:Nico 的解决方案(公认的解决方案)是互联网上找到的许多不同解决方案中唯一适合我的解决方案。我正在关注文章clintbellanger.net/articles/isometric_math - 您必须按照 Nico 的回答中的建议将 screenX 替换为 (screenX - tileWidthHalf)。请参阅我在 Nico 的回答中的评论。一定要降低结果。
  • Nico 的解决方案是正确的,但请记住,screenx、screeny、tileWidthHalf 和 tileHeightHalf 必须使用 FLOATS,否则精度不够。我正在使用整数,但它无法正常工作。将这些更改为浮点数,并且效果很好。

标签: javascript math game-engine pixi.js


【解决方案1】:

我不明白你是如何想出这个解决方案的。您必须求解方程组,得到以下解:

x = 0.5 * ( screenX / tileWidthHalf + screenY / tileHeightHalf)
y = 0.5 * (-screenX / tileWidthHalf + screenY / tileHeightHalf)

如果您需要磁贴索引,请在代码中使用floor

我只能猜测您在坐标系中的瓷砖对齐方式是什么样的。但是从您在 cmets 中发布的屏幕截图来看,我假设您需要将 screenX(screenX - tileWidthHalf) 交换以获得准确的值。

【讨论】:

  • 我也试过这个,但它似乎为每个图块的左侧和右侧产生不同的值。我想知道差异是否来自精灵的锚点是左上角,而不是中心?
  • 我已经标记了磁贴以便于调试,但更改锚点并没有任何帮助。 puu.sh/rpOic/2782995e22.png - 图块 0,0 的左半部分报告为 -1,0,右半部分是正确的。瓦片的左半边1,0 报告为-1, 1,中间报告为1, 0,右侧报告为1, 2
  • 不知何故,除非您有非标准坐标系,否则此图像与您的公式不匹配。您的代码建议原点是左角,x 轴指向右上角,y 轴指向右下角。您是否尝试过舍弃四舍五入,看看您得到了什么值?我假设瓷砖是在两个轴的正方向上绘制的。
  • 我更新了新代码的解决方案。啊,我刚刚看到这正是博客文章中的解决方案。如果仅对部分图块成立,则这是一个枢轴和舍入问题。但由于你没有写任何关于这方面的东西,我无法告诉你可能出了什么问题。
  • 这是因为你的绘图和坐标系不匹配。您只需要记住,图块的位置实际上并不位于图块中。
【解决方案2】:

我写w 给你的tileWidthhtileHeight。使用这个符号,你基本上有

screenX = (x - y)*(w/2) = (w/2)*x + (-w/2)*y
screenY = (x + y)*(h/2) = (h/2)*x + (h/2)*y

这是一个线性变换,您也可以这样写成矩阵表示法:

⎛x⎞ ↦ ⎛w/2 -w/2⎞ ⎛x⎞
⎝y⎠   ⎝h/2  h/2⎠ ⎝y⎠

要反转操作,您需要反转它。有一个 simple formula 用于 2×2 矩阵的逆矩阵。交换左上角和右下角的条目。否定其他两个。将所有内容除以行列式。使用它,你就有了逆变换:

⎛x⎞ ↦ 2/ ⎛ h/2 w/2⎞ ⎛x⎞ = ⎛ 1/w 1/h⎞ ⎛x⎞
⎝y⎠   wh ⎝-h/2 w/2⎠ ⎝y⎠   ⎝-1/w 1/h⎠ ⎝y⎠

所以在你的符号中你得到

x = screenY / tileHeight + screenX / tileWidth
y = screenY / tileHeight - screenX / tileWidth

这本质上也是 Nico 所写的。将非整数坐标转换回整数取决于您为每个图块放置参考点的位置。

【讨论】:

  • 简单是一个相对术语,我需要一点时间才能理解。
  • @MvG 你能解释一下你是如何找到转换矩阵的吗?
  • @DRz 我已经扩展了我的答案以使这一步更清晰。
猜你喜欢
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多