代码之家  ›  专栏  ›  技术社区  ›  pathurs

世界点到等距点-需要帮助理解

  •  2
  • pathurs  · 技术社区  · 10 年前

    现在我知道这个问题在这个网站和其他网站上已经被问了几百次,但我找不到一个解释,解释为什么这些计算是有效的,以及我如何根据自己的需要来改变它。

    这是我当前的功能:

    //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

    我只是无法理解更改代码的概念,我可能已经花了很长时间,喝了太多咖啡,但无论我做了什么更改,似乎都不像我想象的那样奏效。

    请随意链接一个详细的关于它如何在数学上工作的教程,但我找不到任何实际帮助我理解如何修改代码的东西。

    提前干杯

    1 回复  |  直到 10 年前
        1
  •  2
  •   Propolys    10 年前

    如果你必须把整个公式放在一起,

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

    在你的情况下,指出。x/scale是当您向右移动鼠标时增加x的值。如果向上移动鼠标,可以看到iso_point。x将减少一个点。y/(比例/2)。

    比例/2来源于平铺的高度=宽度/2

    如您所需的iso_point。x作为两个点增加。x和点。y增加,你会想要

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

    同样,iso_point。y必须增加为点。x减小并指向。y增加:

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