初步观察
等距平铺网格只是一个规则的矩形网格,x 坐标移动,具体取决于有多少行。
Rectangular Grid (y,x)
v length (L)
+_____+xxxxx+xxxxx+
x x x x
No offset>+xxxxx+xxxxx+xxxxx+
x x x x
+xx|xx+xxxxx+xxxxx+
x | x x x
+xx|xx+xxxxx+xxxxx+
^ height (H)
+: corners
每个图块的长度边是L
px,垂直于该边的高度是H
px。每行的等距像素偏移量为O
px。
Isometric Grid (y,x)
V length (L) is the same as above
height ......+_____+xxxxx+xxxxx+
dependent >_____x 0,0 x x x
offset ....+xxxxx+xxxxx+xxxxx+
(O) ...x x x 1,2 x
..+x|xxx+xxxxx+xxxxx+
.x | x x x
+xxx|x+xxxxx+xxxxx+
^ height (H) is the same as above
+: corners
符号
t(ty,tx)
指垂直位于ty
和水平位于tx
p(i,j)
指像素位置(以像素为单位)
MAX_Y
指瓦片行数
(所有位置总是首先列出垂直分量。)
例子
前任。1
如果您数数,您会注意到 的角t(0,0)
位于以下像素位置:
p(0, 3O)
: 左上方
p(H, 2O)
: 左下方
p(0, 3O+L)
: 右上
p(H, 2O+L)
: 右下角
这四个点中的每一个也是其他图块的角。
前任。2
我们可以看到t(1,2)
另一个例子。它们的角位于以下像素位置:
p(H, 2O+2L)
: 左上方
p(2H, O+2L)
: 左下方
p(H, 2O+3L)
: 右上
p(2H, O+3L)
: 右下角
一般情况
每增加一个单位tx
(从t(ty,tx)
到t(ty,tx+1)
),角的水平像素位置就会改变L px
.
每增加一个单位ty
(从t(ty,tx)
到t(ty+1,tx)
),角的水平像素位置变化 ,角-O px
的垂直像素位置变化H px
。
概括地说,瓦片的角t(ty,tx)
(其中行数为Y_MAX
,因此对于我们的示例,Y_MAX = 3
)位于以下像素位置:
p( ty*H, (Y_MAX-ty)*O + tx*L) - top left
p((ty+1)*H, (Y_MAX-ty-1)*O + tx*L) - bottom left
p( ty*H, (Y_MAX-ty)*O + (tx+1)*L) - top right
p((ty+1)*H, (Y_MAX-ty-1)*O + (tx+1)*L) - bottom right
您可以插入上面的示例以显示这些是正确的位置。
像素到平铺
垂直位置
对于瓷砖t(ty,tx)
和p(i,j)
, ty*H <= i < (ty+1)*H
。
ty*H <= i < (ty+1)*H
ty <= i/H < ty+1
ty = floor(i/H)
因此,ty = floor(i/H)
.
水平位置
水平位置稍微复杂一些,因为偏移量以及水平位置取决于像素的垂直位置。我们可以看到偏移量从O*Y_MAX px
顶部开始并线性减小0
到底部的 px。
在 tilet(ty,tx)
和 pixel的顶部p(i,j)
,(Y_MAX-ty)*O + tx*L <= j < (Y_MAX-ty)*O + (tx+1)*L
.
在 tilet(ty,tx)
和 pixel的底部p(i,j)
,(Y_MAX-ty-1)*O + tx*L <= j < (Y_MAX-ty-1)*O + (tx+1)*L
.
两者之间的差异是线性的,总计O px
。
要找出我们在瓷砖上的距离,我们可以使用frac(i/H)
的小数部分i/H
。例如,在 处p(80,0)
,如果每个瓦片都有一个高度H=30
,我们将frac(80/30) = 20 px
相对于瓦片的顶部;换句话说,下降了三分之二。我们从上面看到ty
实际上floor(i/H)
是 的整数部分i/H
。因此,ty+frac(i/H) = i/H
.
因此,对于 tilet(ty,tx)
和 pixel p(i,j)
,(Y_MAX-i/H)*O + tx*L < j < (Y_MAX-i/H)*O + (tx+1)*L
(Y_MAX-i/H)*O + tx*L <= j < (Y_MAX-i/H)*O + (tx+1)*L
tx*L <= j-((Y_MAX-i/H)*O) < (tx+1)*L
tx <= (j-((Y_MAX-i/H)*O))/L < tx+1
tx = floor((j-((Y_MAX-i/H)*O))/L)
因此,tx = floor((j-((Y_MAX-i/H)*O))/L)
.
解决方案
对于任何一点p(i,j)
,瓷砖t(ty,tx)
都在t(floor(i/H),floor((j-((Y_MAX-i/H)*O))/L))
。
您的具体案例
出于您的目的,L = 2H
可能O = H
是参数;采用上述解决方案并替换O
并将L
结果减少到一个依赖项H
。