Получение координат изометрической сетки из стандартных координат X,Y

В настоящее время я пытаюсь добавить спрайты на изометрическую карту Tiled TMX, используя объекты в cocos2d. Проблема заключается в том, что метаданные X и Y из объекта TMX находятся в стандартном формате 2d (пиксели x, пиксели y), а не в формате изометрической сетки X и Y. Обычно вы просто делите их по размеру плитки, но для изометрии требуется какое-то преобразование.

Например, на изометрической тайловой карте 64x32 размером 40 на 40 тайлов объект с координатами (20,21) выглядит как (640 584)

Итак, вопрос в том, какая формула получает (20,21) из (640,584)?


person RSH1    schedule 21.05.2012    source источник
comment
Вы не занимаетесь 3D? Просто изометрический вид чего-то плоского?   -  person phkahler    schedule 21.05.2012


Ответы (2)


Прямо из исходного кода 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;
}
person LearnCocos2D    schedule 21.05.2012
comment
Как это используется? Если я попытаюсь [UIAppDelegate.tileMap.layer positionForIsoAt:tilePos], он скажет: «Запрос на членский слой в чем-то, а не в структуре или объединении», и метод не отображается в CCTMXLayer.h. - person RSH1; 23.05.2012

статья об изометрической проекции в Википедии — ваш друг. В математическом разделе:

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 — вектор, который вы получаете, поворачивая a на некоторый угол альфа (первая матрица), а затем бета (вторая матрица), s = sin (альфа), c = cos (альфа), s' = sin (бета), c' = потому что (бета). Затем вы проецируете это на 2d, предварительно умножив c:

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

Чтобы получить преобразование в числах, используйте свои собственные значения альфы и беты, чтобы сгенерировать коэффициенты.

person Phil H    schedule 21.05.2012