2015-08-23 2 views
2

Теперь я знаю, что этот вопрос задан и ответил несколько сотен раз на этом веб-сайте и многих других, но я не могу найти объяснения, почему работают вычисления, и как я могу реально изменить это для моих нужд.World point to Isometric point - Нужна помощь в понимании

Это моя текущая функция:

//Converts X, Y from the 2D World to a Point in the Isometric Grid 
public static Vector2 WorldToIsometric(float x, float y, int scale) 
{ 
    Vector2 point = new Vector2(x, y); 
    Vector2 iso_point = new Vector2(point.x, point.y); 
    float half_scale = scale/2; 

    iso_point.x = point.x - (point.y * 2) + half_scale; 
    iso_point.y = point.x + (point.y * 2) - half_scale; 

    iso_point.x /= scale; 
    iso_point.y /= scale; 

    iso_point.x = Mathf.Floor (iso_point.x); 
    iso_point.y = Mathf.Floor (iso_point.y); 

    return iso_point; 
} 

Ключ:

 x = mouse x in world 
     y = mouse y in world 
    scale = width of isometric tile 
    point = mouse point in world 
iso_point = mouse point on isometric grid 

То, что я хочу, выход выглядеть следующим образом:

enter image description here

Что выход на самом деле выглядит :

enter image description here

Я просто не могу обернуть мою голову вокруг концепции изменения кода, я, вероятно, был на это ушло давно и было слишком много кофе, но все, что я могу изменить это просто не похоже на работу как я думал.

Не стесняйтесь связывать подробный учебник о том, как он работает математически, но я не могу найти ничего, что действительно поможет мне понять, как изменить код.

Приветствия заранее

ответ

2

Если бы поставить всю формулу вместе,

iso_point.x = point.x/scale - (point.y + 1)/(scale/2); 

В вашем случае, point.x/масштаба является то, что увеличивает X, как вы переместите мышь к правильно. Если вы переместите мышь вверх, вы увидите, что iso_point.x будет уменьшаться на point.y/(scale/2).

масштаб/2 исходит из того, что высота плитки в = ширине/2

Как вы хотите, чтобы увеличить iso_point.x и как point.x и увеличение point.y, вы хотите что-то вроде

iso_point.x = point.x + (point.y * 2) - half_scale; 

Таким же образом, iso_point.y будет возрастать по мере point.x уменьшается и увеличивается point.y:

iso_point.y = -point.x + (point.y * 2) - half_scale; 
+0

Я собираюсь дать это испытание, это очень поздно, и я имею работали над этим так долго, но это si полное объяснение делает полный смысл ... читать сложные математические объяснения до сих пор – pathurs

+0

совершенным, я, наконец, понимаю в своем мозгу, как все это работает – pathurs