对于使用菱形瓷砖的游戏来说,改变鼠标位置背后的数学原理是什么?

时间:2012-06-21 21:19:36

标签: java math transform isometric

我正在开发一种轴测(等长,但有角度视图)基于平铺的游戏。

我让磁贴系统工作正常,现在我正在继续处理输入问题。

瓷砖在视觉上不匹配(未对齐/偏移的菱形)与它们背后的逻辑(数组)。

在我用“google-fu”找到的许多方法之间,对输入应用转换(“旋转”)似乎是(代码量方面)易于实现以及良好性能的方法 - 明智的。

问题是,对于我发现的所有来源,我无法真正掌握哪些数字来自哪里,也不知道公式对它们做了什么。

所以,我想解释“仿射变换”的数学公式(如果这是它的名字,因为我不确定......)


@Yochai_Timmer对this question的回答是我想要使用的,但我不明白价值来自哪里(大多数是*),也不知道对它们做了什么。

[大多数*]:“28”是瓷砖宽度和全高的一半,“14”是半高,“56”是全宽......可能......但这几乎是我的全部得到它,所以正确与否,我仍然被卡住了。


如果它帮助你给我一个更清晰的答案,我自己的牌是80 width 46 height,我用相同的方法应用(渲染)它们(牌的右上角) 1x2y位于图块1x1y的中心,依此类推......)

另外,我使用的是Java,API是Slick2D。因此,如果您知道任何有助于公式数学的隐藏函数/类(例如:Math.sen()Math.cos(),...)或一般问题,欢迎您指出它们,因为它可能对我有很大帮助。

1 个答案:

答案 0 :(得分:3)

转换背后的关键思想是将瓷砖视为经过linear transformation的正常矩形。要理解这一点,假设您从正常的方块开始,如下所示:

  +-----+
  |     |
  |     |
  +-----+

考虑到这个方格,您可以想到两个vectors,它们通过占据广场的两边来定义“向上”和“向右”的含义:

  +-----+     ^
  |     |     |
  |     |     |
  +-----+     +----->

让我们称这些向量为i和j。您可以想象通过旋转和倾斜方块将此方块转换为菱形。如果你这样做,你可以考虑这两个向量i和j会发生什么:

   /\          ^
  /  \        /
 /    \      /
 \    /      \
  \  /        \
   \/          >

注意i和j是如何旋转和缩放的。

数学背后的技巧是确定一个点在投影下的正方形是试图扭转这个过程。你不是从正常的i和j矢量开始,而是以倾斜/旋转的矢量结束,而是从倾斜/旋转的i和j矢量开始,然后尝试在变换下将世界转换回漂亮的方形网格。你执行的计算是通过说“假设鼠标位于投影中的位置(x,y),如果我们解除这个转换,它将具有什么坐标(x',y')?”这背后的所有数学都是标准的线性代数,可以在两个坐标空间之间进行转换。有关如何执行此操作的说明,请阅读this Wikipedia article on transformation matrices,其中介绍了此过程的工作原理。

希望这有帮助!