Как сделать raycast в позиции мыши, а затем получить координаты для использования на местности? - PullRequest
0 голосов
/ 25 января 2019

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

Я пробовал исходную позицию мыши, которая была лишь немного неточной, а затем я попытался Input.GetAxis() иCamera.main.ScreenPointToRay().

void Update () 
{
    if (Input.GetMouseButton(0))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        print("Got Ray" + ray.ToString());
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit))
        {
            if (hit.collider.gameObject.GetComponent<Terrain>())
            {
                Terrain terrain 
                hit.collider.gameObject.GetComponent<Terrain>();
                TerrainData data = terrain.terrainData;
                float height = data.GetHeight(
                    (int)Math.Round((double)Camera.main.ScreenToWorldPoint(Input.mousePosition).x), 
                    (int)Math.Round((double)Camera.main.ScreenToWorldPoint(Input.mousePosition).y));

                data.SetHeightsDelayLOD((int)Math.Round(
                    (double)Camera.main.ScreenToWorldPoint( Input.mousePosition).x), 
                    (int)Math.Round((double)Camera.main.ScreenToWorldPoint(Input.mousePosition).y), 
                    new float[3, 3] 
                    { 
                        { height + 1.0f / 240000.0f, height + 1.0f / 240000.0f, height + 1.0f / 240000.0f }, 
                        { height + 1.0f / 240000.0f, height + 1.0f / 240000.0f, height + 1.0f / 240000.0f }, 
                        { height + 1.0f / 240000.0f, height + 1.0f / 2400.0f, height + 1.0f / 2400.0f } 
                    });

                terrain.ApplyDelayedHeightmapModification();
            }
        }
    }
}

Я ожидал, что местность будет расти в позиции мыши, но она вообще не растет.

1 Ответ

0 голосов
/ 25 января 2019

Данные о местности. Вес по высоте :

xBase : Первый x index образцов карты высот для извлечения.

-> GetHeight не ожидает мировых координат, но индексы данных!


Вы должны рассчитать, какой индекс находится в точке попадания луча (а не в позиции мыши):

if (Input.GetMouseButton(0))
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    print("Got Ray" + ray.ToString());
    RaycastHit hit;
    if (Physics.Raycast(ray, out hit))
    {
        if (hit.collider.gameObject.GetComponent<Terrain>())
        {
            Terrain terrain 
            hit.collider.gameObject.GetComponent<Terrain>();

            TerrainData data = terrain.terrainData;

            //
            // !!! Mouse position to terrain coordinates
            //
            var point = hit.point;
            var xResolution = data.heightmapWidth;
            var zResolution = data.heightmapHeight;
            var terX =(int)((point.x / data.size.x) * xResolution);
            var terZ =(int)((point.z / data.size.z) * zResolution);

            var height = data.GetHeight(terX, terZ);

            // Same when you set values
            var newValues = new float[3, 3] 
            { 
                { height + 1.0f / 240000.0f, height + 1.0f / 240000.0f, height + 1.0f / 240000.0f }, 
                { height + 1.0f / 240000.0f, height + 1.0f / 240000.0f, height + 1.0f / 240000.0f }, 
                { height + 1.0f / 240000.0f, height + 1.0f / 2400.0f, height + 1.0f / 2400.0f } 
            };
            data.SetHeightsDelayLOD(terX, terZ, newValues);
            terrain.ApplyDelayedHeightmapModification();
        }
    }
}

( Источник )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...