Регулирование высоты террейна в скрипте

Speed Tree : Terrain & Trees.

Регулирование высоты террейна в скрипте

Сообщение Masancho 11 мар 2016, 08:24

Всем привет.
Нашел вот такой скрипт, и почему-то он в уже созданном террейне, допустим вытянул гору, так он при нажатии ЛКМ или ПКМ сначала сводит высоту в 0, а уже потом начинает увеличивать.
Почему? Ткните пальцем если не сложно, где ошибка...
Спасибо.

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections.Generic;

public class testTerrainData : MonoBehaviour {

    public Terrain ter;
    private float strength = 0.01f;
    private float[,] heights;

    // Use this for initialization
    void Start () {
        heights = ter.terrainData.GetHeights(0, 0, ter.terrainData.heightmapWidth, ter.terrainData.heightmapHeight);
    }
       
        // Update is called once per frame
        void Update () {
        TerrainUpdate();  
        }

    private void TerrainUpdate() //в зависимости от клавиши мыши и рейкаста.
    {
        RaycastHit hit;
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        //test;
        if (Physics.Raycast(ray, out hit))
            Debug.Log("ter.terdata.ray "+hit.collider + "@" + hit.distance + "@" + hit.point);

        if (Input.GetMouseButton(0))
        {
            if (Physics.Raycast(ray, out hit))
            {
                RaiseTerrain(hit.point);
            }
        }
        if (Input.GetMouseButton(1))
        {
            if (Physics.Raycast(ray, out hit))
            {
                LowerTerrain(hit.point);
            }
        }
    }

    private void RaiseTerrain(Vector3 point)
    {
        int mouseX = (int)((point.x / ter.terrainData.size.x) * ter.terrainData.heightmapWidth);
        int mouseY = (int)((point.z / ter.terrainData.size.z) * ter.terrainData.heightmapHeight);

        float[,] modifiedHeights = new float[1, 1];
        float y = heights[mouseX, mouseY];
        y += strength * Time.fixedDeltaTime;

        if (y > ter.terrainData.size.y)
            y = ter.terrainData.size.y;

        modifiedHeights[0, 0] = y;
        heights[mouseX, mouseY] = y;
        ter.terrainData.SetHeights(mouseX, mouseY, modifiedHeights);
    }

    private void LowerTerrain(Vector3 point)
    {
        int mouseX = (int)((point.x / ter.terrainData.size.x) * ter.terrainData.heightmapWidth);
        int mouseY = (int)((point.z / ter.terrainData.size.z) * ter.terrainData.heightmapHeight);

        float[,] modifiedHeights = new float[1, 1];
        float y = heights[mouseX, mouseY];
        y -= strength * Time.fixedDeltaTime;

        if (y < 0)
            y = 0;

        modifiedHeights[0, 0] = y;
        heights[mouseX, mouseY] = y;
        ter.terrainData.SetHeights(mouseX, mouseY, modifiedHeights);
    }
}
Masancho
UNIт
 
Сообщения: 51
Зарегистрирован: 05 мар 2016, 12:14

Re: Регулирование высоты террейна в скрипте

Сообщение Diab10 11 мар 2016, 09:07

Если я правильно понял вопрос, то так:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections.Generic;

public class testTerrainData : MonoBehaviour {

    public Terrain ter;
    private float strength = 0.01f;
    private float[,] heights;

    // Use this for initialization
    void Start () {

    }
       
        // Update is called once per frame
        void Update () {
        TerrainUpdate();  
        }

    private void TerrainUpdate() //в зависимости от клавиши мыши и рейкаста.
    {
        RaycastHit hit;
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        //test;
        if (Physics.Raycast(ray, out hit))
            Debug.Log("ter.terdata.ray "+hit.collider + "@" + hit.distance + "@" + hit.point);

        if (Input.GetMouseButton(0))
        {
            if (Physics.Raycast(ray, out hit))
            {
                RaiseTerrain(hit.point);
            }
        }
        if (Input.GetMouseButton(1))
        {
            if (Physics.Raycast(ray, out hit))
            {
                LowerTerrain(hit.point);
            }
        }
    }

    private void RaiseTerrain(Vector3 point)
    {
        heights = ter.terrainData.GetHeights(0, 0, ter.terrainData.heightmapWidth, ter.terrainData.heightmapHeight);

        int mouseX = (int)((point.x / ter.terrainData.size.x) * ter.terrainData.heightmapWidth);
        int mouseY = (int)((point.z / ter.terrainData.size.z) * ter.terrainData.heightmapHeight);

        float[,] modifiedHeights = new float[1, 1];
        float y = heights[mouseX, mouseY];
        y += strength * Time.fixedDeltaTime;

        if (y > ter.terrainData.size.y)
            y = ter.terrainData.size.y;

        modifiedHeights[0, 0] = y;
        heights[mouseX, mouseY] = y;
        ter.terrainData.SetHeights(mouseX, mouseY, modifiedHeights);
    }

    private void LowerTerrain(Vector3 point)
    {
        heights = ter.terrainData.GetHeights(0, 0, ter.terrainData.heightmapWidth, ter.terrainData.heightmapHeight);

        int mouseX = (int)((point.x / ter.terrainData.size.x) * ter.terrainData.heightmapWidth);
        int mouseY = (int)((point.z / ter.terrainData.size.z) * ter.terrainData.heightmapHeight);

        float[,] modifiedHeights = new float[1, 1];
        float y = heights[mouseX, mouseY];
        y -= strength * Time.fixedDeltaTime;

        if (y < 0)
            y = 0;

        modifiedHeights[0, 0] = y;
        heights[mouseX, mouseY] = y;
        ter.terrainData.SetHeights(mouseX, mouseY, modifiedHeights);
    }
}
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Re: Регулирование высоты террейна в скрипте

Сообщение Masancho 11 мар 2016, 10:13

Не взлетело:(

Подробнее, ровный ландшафт, вытягиваю кистью в редакторе гору, запускаю и в моем примере:
п1. Если тыкаю на возвышенности, то сначала высота после первого же тыка сводится в 0, а затем при втором тыке начинает отрабатывать как написано в скрипте, т.е. увеличивать высоту. п2. Если тыкаем на ровной поверхности, то отрабатывает опять же правильно.
Если изменить алгоритм как вы предложили, то п1. так же сначала высоту в 0, а последующих кликах, хоть закликайся, высота больше чем на чуть-чуть (маленькую горку делает, буквально 0.001) не дает увеличить.
Нид хелп!
Masancho
UNIт
 
Сообщения: 51
Зарегистрирован: 05 мар 2016, 12:14

Re: Регулирование высоты террейна в скрипте

Сообщение Masancho 12 мар 2016, 10:10

так и не получилось победить/понять в чем проблема.
сгенерировал ландшафт, вожу зажатой ЛКМ в рантайме, получается такая картина:
https://cloud.mail.ru/public/A885/2PjM1H9K5
вот пример, для тех у кого-нибудь будет желание помочь: https://cloud.mail.ru/public/AW6t/hpTTnv5q8
при много благодарен!
Masancho
UNIт
 
Сообщения: 51
Зарегистрирован: 05 мар 2016, 12:14


Вернуться в Земля и деревья.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2