我正在写一个等距瓷砖游戏。每块瓷砖的宽度是高度的两倍(w:h = 2:1)。地图中的所有图块大小相同,并且它们的宽度和高度是已知的(TileWidth 和 TileHeight)。
可以有任意数量的列 (>0) 和行 (>0)。
我正在努力想出一个公式来计算完全绘制的地图的宽度和高度。这需要是从最顶部到最底部以及从极左到极右的距离。由于列数和行数可以变化(因此地图并不总是完美的菱形),事实证明这非常困难!
我正在写一个等距瓷砖游戏。每块瓷砖的宽度是高度的两倍(w:h = 2:1)。地图中的所有图块大小相同,并且它们的宽度和高度是已知的(TileWidth 和 TileHeight)。
可以有任意数量的列 (>0) 和行 (>0)。
我正在努力想出一个公式来计算完全绘制的地图的宽度和高度。这需要是从最顶部到最底部以及从极左到极右的距离。由于列数和行数可以变化(因此地图并不总是完美的菱形),事实证明这非常困难!
好问题!有一个不太明显的答案,但很容易计算:
让我们称行轴“r”和列轴“c”,并考虑第一张图,其中沿 r 轴的范围为 5,沿 c 轴的范围为 3。
相对于绘图平面,沿 r 轴的单位增量为角度 +30 = (cos 30°, sin 30°) = (sqrt(3)/2, 0.5),沿 c 轴的单位增量为在 -30 = (cos 30°, -sin 30°) = (sqrt(3)/2, -0.5)。
您需要考虑等距矩形的两条对角线。在第一张图片中,这些对角线是 D1 = [+5*U 沿 r 轴,+3*U 沿 c 轴] 和 D2 = [+5*U 沿 r 轴,-3*U 沿 c 轴],其中 U 是等轴测平面中的瓷砖长度。当转换到绘图平面时,变为 D1 = ((5+3)*sqrt(3)/2*U, (5-3)/2*U) = (4*sqrt(3)*U, 1* U) 和 D2 = ((5-3)*sqrt(3)/2*U, (5+3)/2*U) = (sqrt(3)*U, 4*U)。因此,屏幕宽度和高度是两个范围中的最大值 = 4*sqrt(3)*U, 4*U。
这可以概括为:如果有 Nr 行 Nc 列,并且瓦片长度为 U,则矩形的对角线在绘图平面中的范围为 D1 = ((Nr+Nc)*sqrt(3)/2* U, (Nr-Nc)/2*U) 和 D2 = ((Nr-Nc)*sqrt(3)/2*U, (Nr+Nc)/2*U),因此屏幕宽度和高度, 是:
W = U*(Nr+Nc)*sqrt(3)/2
H = U*(Nr+Nc)/2
等轴测投影的角度为 60 度和 30 度。瓷砖的实际宽度和高度将是:
Wiso = TileWidth * Cos(30) + TileHeight * Cos(60)
Hiso = TileWidth * Sin(30) + TileHeight * Sin(60)
现在,您可以将这些数字乘以每行和每列的图块数来获得网格的大小。
编辑:看着你的图像,投影似乎不是等距的(至少不是我在学校学到的),并且两边的角度都是 60 度,所以替换Cos(60)
withCos(30)
和 the Sin(60)
withSin(30)
另一种看待它的方式:
Wgrid = TileWidth * Cos(30) * Ncols + TileHeight * Cos(30) * Nrows
Hgrid = TileWidth * Sin(30) * Ncols + TileHeight * Sin(30) * Nrows
如果您从底部开始向左侧走,则每列向上移动一半高度,然后每行向上移动一半高度。同样,如果您从左侧开始沿着底部边缘走,则每列向上移动一半的平铺宽度,然后每行移动一半的宽度。
所以地图的轴对齐边界框的宽度是(rows+columns)*TileWidth/2
,高度是(rows+columns)*TileHeight/2
为什么不使用如下旋转方程:
假设瓦片没有旋转,那么四个角的坐标如下:
(0, 0, 0)
(w, 0, 0)
(0, h, 0)
(w, h, 0)
在哪里
w = Number of Columns * Tile Width
h = Number of Rows * Tile Height
现在我假设你有投影矩阵,所以在应用它之后,你得到了 4 个 3D 点的 2D 屏幕坐标,你需要做的是:
从 2 中减去 1 得到宽度,从 4 中减去 3 得到高度。
这有帮助吗?
我认为你可以用毕达哥拉斯定理做到这一点:
halfWidth = tileWidth / 2;
halfHeight = tileHeight / 2;
h = Math.sqrt((halfWidth * halfWidth ) * (halfHeight * halfHeight));
rowLength = rowSize * h;
colLength = colSize * h;
我的数学不是很好,但h
应该是瓷砖一侧的长度,这样你就可以将它乘以瓷砖的数量。