Очень давно я не писал тут, решил вспомнить прошлое))
Никогда не работал с изометрией, только когда то очень давно разбирался с тьюториалом на
demiart'e
основные свои знания по этому предмету я почерпнул оттуда. Недавно решил ковырнуть сей предмет снова и сразу споткнулся на таком моменте - как позиционировать на тайловой сетке крупные предметы (крупные в смысле состоящие из нескольких тайлов).
В приведенном тьюториале для позиционирования однотайловых кубиков по клику используется такой код:
Код AS3:
private function onWorldClick(event:MouseEvent):void
{
var box:DrawnIsoBox = new DrawnIsoBox( TILE_SIZE, Math.random() * 0xffffff, BUILDING_HEIGHT);
var pos:Point3D = IsoUtils.screenToIso(new Point(_world.mouseX, _world.mouseY));
pos.x = Math.round(pos.x / TILE_SIZE) * TILE_SIZE;
pos.y = Math.round(pos.y / TILE_SIZE) * TILE_SIZE;
pos.z = Math.round(pos.z / TILE_SIZE) * TILE_SIZE;
box.position = pos;
_world.addChildToWorld(box);
}
На всякий случай привожу функцию пересчета координат в iso из тьюториала
Код AS3:
/**
* Из двухмерного пространства в трехмерное, высота у равна нулю.
* @arg point точка в двухмерном пространстве.
*/
public static function screenToIso(point:Point):Point3D
{
var xpos:Number = point.y + point.x * .5;
var ypos:Number = 0;
var zpos:Number = point.y - point.x * .5;
return new Point3D(xpos, ypos, zpos);
}
и он прекрасно работает, и четко вписывает кубик в основание тайла по координатам клика мыши. Но если задать размер кубика в виде size * TILE_SIZE (допустим размером 2 на 2 тайла) то я получаю такую картину:
У синего объекта, размером 2х2 экранные координаты выставлены в 0, 0 (т.е. он должен вписываться в крайний верхний квадрат 2х2 тайлов) но наблюдается смещение которое меняется в зависимости от размера объекта. Бьюсь уже весь вечер и формулу нащупать не получается, даже непонятно какая из этих двух функций виновата, и даже не знаю что почитать.
Заранее спасибо за помощь,
проект прикрепляю (сделан в FB 4.7)