从标准X,Y坐标获取等距网格坐标

时间:2012-05-21 11:55:13

标签: math cocos2d-iphone isometric

我正在尝试使用cocos2d中的Objects将sprite添加到等距Tiled TMX地图中。问题是来自TMX对象的X和Y元数据是标准的2d格式(像素x,像素y),而不是等距网格X和Y格式。通常你只需将它们除以图块大小,但是等长需要某种变换。

例如,在尺寸为40的64x32等距瓷砖地图上,按40个瓷砖,(20,21)坐标处的对象显示为(640,584)

所以问题真的是公式从(640,584)获得(20,21)?

2 个答案:

答案 0 :(得分:1)

直接来自cocos2d的CCTMXLayer源代码:

-(CGPoint) positionForIsoAt:(CGPoint)pos
{
    CGPoint xy = {
        mapTileSize_.width /2 * ( layerSize_.width + pos.x - pos.y - 1),
        mapTileSize_.height /2 * (( layerSize_.height * 2 - pos.x - pos.y) - 2),
    };
    return xy;
}

答案 1 :(得分:0)

Wikipedia's isometric projection article是你的朋友。在数学部分:

cx   | 1  0  0 |  | c' 0 -s' |  ax
cy = | 0  c  s |  | 0  1  0  |  ay
cz   | 0 -s  c |  | s' 0  c' |  az

其中c是通过旋转一个角α(第一个矩阵)然后β(第二个矩阵)得到的矢量,s = sin(alpha),c = cos(alpha),s'= sin(beta) ,c'= cos(beta)。然后通过预乘c:

将其投影到2d
vx   | 1 0 0 |  cx
vy = | 0 1 0 |  cy
vz   | 0 0 1 |  cz

将所有这些矩阵变换合并为一个:

vx   | c'  0  -s' |  ax
vy = | ss' c  sc' |  ay
vz   | 0   0   0  |  az

要获得数字变换,请使用您自己的alpha和beta值来生成系数。