Перспективные координаты для 2D Hex Grid

Вот тупица...

Портируя старый код, я получил эту 2D-шестигранную сетку, визуализируемую в 2.5D: введите здесь описание изображения

Y-масштаб и положение плиток рассчитываются для перспективы, но я хотел бы также масштабировать и располагать их для перспективы по горизонтали (мультяшки в верхней части доски выглядят сплющенными). Вот текущий код:

const SCALE_X = PixiStages.game._width * 0.0012;
const SCALE_Y = PixiStages.game._height * 0.0018;

this.scale.x = SCALE_X;
this.scale.y = SCALE_Y * ( 0.5 + 0.5 * gamePiece.y / Game.TILE_ROWS );

const getStageXFromBoardX = ( board_x ) => {
    const tileWidth = SCALE_X * 38;
    return board_x*tileWidth;
}

const getStageYFromBoardY = ( board_y ) => {
    const tileHeight = SCALE_Y * 44;        
    return board_y*tileHeight/4 + board_y*board_y*tileHeight / (8*Game.TILE_ROWS);
}

Простое изменение масштаба x на this.scale.x = SCALE_X * ( 0.5 + 0.5 * gamePiece.y / Game.TILE_ROWS ); выглядит так: введите здесь описание изображения

... так что, думаю, мне просто нужно уравнение, чтобы правильно установить их x-позицию.

Любые идеи или ссылки? Спасибо!


person Robert Lombardo    schedule 21.04.2016    source источник


Ответы (1)


Обратите внимание, что координата X после преобразования перспективы зависит как от исходных координат X, так и от исходных координат Y. Общее выражение

XPersp = (A * X + B * Y + C) / (G * X + H * Y + 1)

Для вашего случая (перспективный взгляд по центральной оси) преобразование прямоугольника с углами (XCenter-W,0)-(XCenter +W, H) в трапецию с центром вертикально в XCenter, смещенную вверх по YShift, будет: введите здесь описание изображения

XPersp = XCenter + (X - XCenter) / (H * Y + 1)
YPersp = (YShift +  E * Y) / (H * Y + 1)

где H, E — некоторые коэффициенты, адаптированные для хорошего вида.

Варьируйте E (определяет высоту трапеции) около 0.5-2.0, H (определяет наклон трапеции) около 0.005

person MBo    schedule 21.04.2016
comment
это потрясающий ответ - большое спасибо ... теперь просто обдумать это ... - person Robert Lombardo; 22.04.2016