Бесшовный динамический террайн (Terrain) WorldMachine2

Speed Tree : Terrain & Trees.

Re: Бесшовный динамический террайн (Terrain) WorldMachine2

Сообщение alexmarch 23 окт 2012, 03:54

да да все так тока ... но почему то (незнаю, не могу объяснить) если я перемножаю элементы массива на коэффициент приводит к тому что сумма этих элементов >1 или <1 наверно из за погрешности float
вот если прибавлять к элементу массива тогда картинка выглядит нормализованной но по факту это тоже не так... короче баги отлавливаю пока не могу разобраться где косячу.
вот пример:
Скрытый текст:
splatarray <1, коэффициент: (1.080508) всего слоев: (5) сумма весов этих слоев: (0.9254902)слой 1: (0.003921569) слой 2: (0.4627451) слой 3:(0.4) слой 4: (0) слой 5: (0.05490196)
splatarray <1, коэффициент: (2.161017) всего слоев: (5) сумма весов этих слоев: (0.4627451)слой 1: (0.2313726) слой 2: (0) слой 3:(0) слой 4: (0) слой 5: (0)
splatarray <1, коэффициент: (1.094421) всего слоев: (5) сумма весов этих слоев: (0.9137255)слой 1: (0.03921569) слой 2: (0.8352941) слой 3:(0) слой 4: (0) слой 5: (0)
После нормализации :)
splatarray >1, коэффициент: (0.4622335) всего слоев: (5) сумма весов этих слоев: (2.163409)слой 1: (0.6692914) слой 2: (0.3307087) слой 3:(0) слой 4: (0) слой 5: (0)
Аватара пользователя
alexmarch
UNITрон
 
Сообщения: 286
Зарегистрирован: 04 май 2009, 19:54

Re: Бесшовный динамический террайн (Terrain) WorldMachine2

Сообщение Egoor 24 окт 2012, 16:26

alexmarch, можно тогда тебя попросить привести кусочек кода из твоего скрипта, где подгружаются хаймапы и накладываются на террейн?
Everybody Lies
Аватара пользователя
Egoor
UNец
 
Сообщения: 47
Зарегистрирован: 10 июн 2012, 11:11

Re: Бесшовный динамический террайн (Terrain) WorldMachine2

Сообщение alexmarch 25 окт 2012, 00:05

Egoor писал(а):alexmarch, можно тогда тебя попросить привести кусочек кода из твоего скрипта, где подгружаются хаймапы и накладываются на террейн?

Я уже говорил не однократно что работаю над этим и пока не реализовал то что задумал, поэтому и пачкую тут форум своими высказываниями, но если так хочется вот пожалуйста
Синтаксис:
Используется csharp
//Применяем полученый SplatMap на терейн дату
    private void LoadSplats(string xvalue, string yvalue, ref TerrainData tdata)
    {

        if (_splats.Count > 0)
        {
            float[, ,] splatarray = new float[(int)_heightmapsize.x, (int)_heightmapsize.y, _splats.Count];
            SplatPrototype[] prototypes = new SplatPrototype[_splats.Count];

            for (int k = 0; k < _splats.Count; k++)
            {
                LoadSplat(_splats[k], k, xvalue, yvalue, ref prototypes, ref splatarray);
                // Прогресс бар (тормазим работу <img src="./images/smilies/1.gif" alt=":)" title="Happy" />
                EditorUtility.DisplayProgressBar("Importing Splat", ((k + 1)).ToString() + " Splat Files", 1);

                if (_splats.Count - k == 1)
                {


                    /*
                 * Идея alexz
                 *  http://www.unity3d.ru/distribution/view ... a&start=30
                 *  46.- А у меня друг сломал сервер за пять минут!!!
                 *  - Он что, хакер???
                 *  - Нет. Он - мудак!!!
                 */


// Нормализум то что не нормализованно
// Нормализация (normalization) — приведение к единичному размеру.
// Термин «Normalization» также переводится как «Нормировка», смысл которой сосотоит в приведении чего-либо к эталонному,
// единичному виду. Например, отнормировать последовательность означает умножит ее члены на такую величину,
// чтобы максимум (по модулю) этой последовательности стал равен единице.

                    if (_optionSplatMix)
                    {

                        for (int y = 0; y < _heightmapsize.y; y++)
                        {
                            for (int x = 0; x < _heightmapsize.x; x++)
                            {
                                float tsum = 0;
                                // Наберм слои в массив
                                for (int layer = 0; layer < _splats.Count; layer++)
                                {
                                    tsum += splatarray[x, y, layer]; // запишим сумму весов всех слоев
                                }

                                for (int layer = 0; layer < _splats.Count; layer++)
                                {
                                    if (tsum == 0)
                                    {
                                        Debug.LogError(
                                            string.Format(
                                                "Запись внутри цыкла ДО записи:, коэффициент: ({0}) всего слоев: ({1}) сумма весов слоев: ({2}) № слоя ({3}), вес слоя ({4})",
                                                1/tsum, _splats.Count, tsum, layer, splatarray[x, y, layer]));

                                    }

                                    if (tsum > 1.000000001f) // короче если больше 1 нормализум
                                    {
                                        splatarray[x, y, layer] *= 1/tsum;
                                    }
                                    else if (tsum == 0 || tsum < 0.000000000001f) // если равняеться нулю
                                    {
                                        splatarray[x, y, layer] += 1/_splats.Count;
                                    }

                                    if (x == 1 && y == 0)
                                    {
                                        //Debug.LogError(string.Format("Запись внутри цыкла ПОСЛЕ записи:, коэффициент: ({0}) всего слоев: ({1}) сумма весов слоев: ({2}) № слоя ({3}), вес слоя ({4})", 1 / tsum, _splats.Count, tsum, layer, splatarray[x, y, layer]));

                                    }
                                    //splatarray[x, y, layer] += (1 - tsum)/_splats.Count; // Вычисляем среднее значение и прибовляем к каждому слою
                                }

                            }


                        }

                        // К удалению чисто проверка, весь ЭТОТ БЛОК УДАЛИТЬ!!!!
                        int asd = 1;
                        for (int y = 0; y < _heightmapsize.y; y++)
                        {
                            for (int x = 0; x < _heightmapsize.x; x++)
                            {

                                float tsum = 0;
                                // Наберм слои в массив
                                for (int layer = 0; layer < _splats.Count; layer++)
                                {
                                    tsum += splatarray[x, y, layer]; // запишим сумму весов всех слоев
                                }


                                if (tsum > 1.1 && asd == 1)
                                {
                                    asd = 2;
                                    Debug.LogError(
                                        string.Format(
                                            "splatarray >1,  коэффициент: ({0}) всего слоев: ({1}) сумма весов этих слоев: ({2}) x: ({8}) y: ({9})" +
                                            "слой 1: ({3}) слой 2: ({4}) слой 3:({5}) слой 4: ({6}) слой 5: ({7}) ",
                                            1/tsum, _splats.Count, tsum, splatarray[x, y, 0], splatarray[x, y, 1],
                                            splatarray[x, y, 2], splatarray[x, y, 3], splatarray[x, y, 4], x, y));
                                }
                            }
                        }
                        //УДАЛИТЬ!!!!
                    }
                }
                //конец блока нормализации

            }

            tdata.splatPrototypes = prototypes;
            tdata.SetAlphamaps(0, 0, splatarray);
            prototypes = null;
            splatarray = null;
            System.GC.Collect(0);

        }
    }

    //Загружаем файлы SplatMap-a в массив
    private void LoadSplat(SplatMapInfo2 splat, int k, string xvalue, string yvalue, ref SplatPrototype[] prototypes, ref float[,,] splatarray)
    {

       // Load splatmap file
        string splatfile = string.Format(splat.Filemask, xvalue, yvalue); //Get Name Files, x and y size
        string[] splatfiles = System.IO.Directory.GetFiles(_imagesPath, splatfile + ".*"); // масив файлов
        byte[] imagebytes = System.IO.File.ReadAllBytes(splatfiles[0]); // чтение из сплайта по байтам
        Texture2D t = new Texture2D(1, 1); // создадим пустой обект t
        t.LoadImage(imagebytes); // загрузим в t массив байтов сплайта
        imagebytes = null; //чистим память
        System.GC.Collect(0);// чистим
        Color[] imagecolors = t.GetPixels();// передадми дату в масив imagecolors
        int imagewidth = t.width;
       
        DestroyImmediate(t); // укакошим t

        for (int v = 0; v < _heightmapsize.y; v++) // будем крутить пока Y  _heightmapsize  не закончится
        {
            for (int u = 0; u < _heightmapsize.x; u++) // крутим _heightmapsize по X
            {
                splatarray[u, v, k] = imagecolors[((imagewidth - 1) - u)*imagewidth + v].r; // загрузим
            }
        }


        imagecolors = null;
        System.GC.Collect(0);
        // Set splat prototype for this splat layer
        SplatPrototype prototype = new SplatPrototype();
        prototype.texture = splat.Texture;
        prototype.tileOffset = new Vector2(splat.TileOffsetX, splat.TileOffsetY);
        prototype.tileSize = new Vector2(splat.TileSizeX, splat.TileSizeY);
        prototypes[k] = prototype;

        }
Последний раз редактировалось waruiyume 25 окт 2012, 00:15, всего редактировалось 1 раз.
Причина: Спойлер ломает подсветку кода
Аватара пользователя
alexmarch
UNITрон
 
Сообщения: 286
Зарегистрирован: 04 май 2009, 19:54

Re: Бесшовный динамический террайн (Terrain) WorldMachine2

Сообщение alexmarch 25 окт 2012, 00:30

Вообще был бы премного благодарен за ИДЕЮ как из WorlMachina2(WM2) передать маски для текстур.
Я понимаю что нормальные люди для этого используют альфакарты (splatmap-ы), но таким способом я могу передать только 4 текстуры.
Как опять же всем доподлинно известно это делается так:
В WM2 создаем террайн и разукрашиваем его(это несложно) после чего к выходным данным Heightfield подключаем Channel Spliter он нам разделит карту на RGB и 4 канал это альфа, все это сливаем в png
вуаля splatmapa готова. потом просто ее подгружаем к нужному террайну. (на форуме где то я этот скрипт выкладывал)
Но вот незадача мне нужно выгрузить 5 масок под моих 5 текстур. И вот тут начинаются пляски с бубном.
Я нечего лучше не придумал как сливать все в разные каналы и под каждую текстуру создаю отдельно файл png после чего подгружаю его в Unity и юнити уже сама генерит splatmap.
Все вроде хорошо. Но есть одно НО.
Когда WM2 записывает в битмар 4 канала ARGB (о которых я писал выше) все проходит хорошо и все каналы между собой имеют общую сумму 1.
А вот когда я это разделяю на отдельные файлы. То этого не происходит и входящие данные то и дело имеют либо >1 либо 1<
sshot-2.png
У вас нет доступа для просмотра вложений в этом сообщении.
Аватара пользователя
alexmarch
UNITрон
 
Сообщения: 286
Зарегистрирован: 04 май 2009, 19:54

Re: Бесшовный динамический террайн (Terrain) WorldMachine2

Сообщение alexmarch 25 окт 2012, 00:38

Эпилог:
И вот я ищу способ как соединить в юнити грамотно 5 и более масок текстур или
как создать в WM2 маски так что бы при выгрузке и соединении они по всем слоям имели бы, жирную, единицу!
Аватара пользователя
alexmarch
UNITрон
 
Сообщения: 286
Зарегистрирован: 04 май 2009, 19:54

Re: Бесшовный динамический террайн (Terrain) WorldMachine2

Сообщение Guyver 25 окт 2012, 07:59

http://snipd.net/2d-and-3d-vector-norma ... ation-in-c

примеры кода (с++) нормализации 2д и 3д вектора...

если в крации, каждую компоненту вектора делим на длинну вектора.
где длинна вектора - корень квадратный из суммы квадратов компонент вектора.
Xcombat: 3D шутер на летающих тарелках!
Аватара пользователя
Guyver
UNIверсал
 
Сообщения: 392
Зарегистрирован: 21 июл 2010, 08:04
Откуда: Челябинск

Re: Бесшовный динамический террайн (Terrain) WorldMachine2

Сообщение yursiv 25 окт 2012, 10:23

alexmarch писал(а):Эпилог:
И вот я ищу способ как соединить в юнити грамотно 5 и более масок текстур или
как создать в WM2 маски так что бы при выгрузке и соединении они по всем слоям имели бы, жирную, единицу!

А может не стоит так усложнять и где-то допустить ручную настройку? Подумайте сколько времени займут операции создания террейна(не для пробы, а финального качества) и сколько - операции его импорта, сшивания, настройки и т.д.? Будет ли оно того стоить?

З.Ы. Особо в проблему не вникал - только предположения.
Аватара пользователя
yursiv
UNIт
 
Сообщения: 130
Зарегистрирован: 09 ноя 2010, 11:51
Откуда: Харьков

Re: Бесшовный динамический террайн (Terrain) WorldMachine2

Сообщение Egoor 25 окт 2012, 17:07

alexmarch писал(а):
Egoor писал(а):alexmarch, можно тогда тебя попросить привести кусочек кода из твоего скрипта, где подгружаются хаймапы и накладываются на террейн?

Я уже говорил не однократно что работаю над этим и пока не реализовал то что задумал, поэтому и пачкую тут форум своими высказываниями, но если так хочется вот пожалуйста
Синтаксис:
Используется csharp
//Применяем полученый SplatMap на терейн дату
    private void LoadSplats(string xvalue, string yvalue, ref TerrainData tdata)
    {

        if (_splats.Count > 0)
        {
            float[, ,] splatarray = new float[(int)_heightmapsize.x, (int)_heightmapsize.y, _splats.Count];
            SplatPrototype[] prototypes = new SplatPrototype[_splats.Count];

            for (int k = 0; k < _splats.Count; k++)
            {
                LoadSplat(_splats[k], k, xvalue, yvalue, ref prototypes, ref splatarray);
                // Прогресс бар (тормазим работу <img src="./images/smilies/1.gif" alt=":)" title="Happy" />
                EditorUtility.DisplayProgressBar("Importing Splat", ((k + 1)).ToString() + " Splat Files", 1);

                if (_splats.Count - k == 1)
                {


                    /*
                 * Идея alexz
                 *  http://www.unity3d.ru/distribution/view ... a&start=30
                 *  46.- А у меня друг сломал сервер за пять минут!!!
                 *  - Он что, хакер???
                 *  - Нет. Он - мудак!!!
                 */


// Нормализум то что не нормализованно
// Нормализация (normalization) — приведение к единичному размеру.
// Термин «Normalization» также переводится как «Нормировка», смысл которой сосотоит в приведении чего-либо к эталонному,
// единичному виду. Например, отнормировать последовательность означает умножит ее члены на такую величину,
// чтобы максимум (по модулю) этой последовательности стал равен единице.

                    if (_optionSplatMix)
                    {

                        for (int y = 0; y < _heightmapsize.y; y++)
                        {
                            for (int x = 0; x < _heightmapsize.x; x++)
                            {
                                float tsum = 0;
                                // Наберм слои в массив
                                for (int layer = 0; layer < _splats.Count; layer++)
                                {
                                    tsum += splatarray[x, y, layer]; // запишим сумму весов всех слоев
                                }

                                for (int layer = 0; layer < _splats.Count; layer++)
                                {
                                    if (tsum == 0)
                                    {
                                        Debug.LogError(
                                            string.Format(
                                                "Запись внутри цыкла ДО записи:, коэффициент: ({0}) всего слоев: ({1}) сумма весов слоев: ({2}) № слоя ({3}), вес слоя ({4})",
                                                1/tsum, _splats.Count, tsum, layer, splatarray[x, y, layer]));

                                    }

                                    if (tsum > 1.000000001f) // короче если больше 1 нормализум
                                    {
                                        splatarray[x, y, layer] *= 1/tsum;
                                    }
                                    else if (tsum == 0 || tsum < 0.000000000001f) // если равняеться нулю
                                    {
                                        splatarray[x, y, layer] += 1/_splats.Count;
                                    }

                                    if (x == 1 && y == 0)
                                    {
                                        //Debug.LogError(string.Format("Запись внутри цыкла ПОСЛЕ записи:, коэффициент: ({0}) всего слоев: ({1}) сумма весов слоев: ({2}) № слоя ({3}), вес слоя ({4})", 1 / tsum, _splats.Count, tsum, layer, splatarray[x, y, layer]));

                                    }
                                    //splatarray[x, y, layer] += (1 - tsum)/_splats.Count; // Вычисляем среднее значение и прибовляем к каждому слою
                                }

                            }


                        }

                        // К удалению чисто проверка, весь ЭТОТ БЛОК УДАЛИТЬ!!!!
                        int asd = 1;
                        for (int y = 0; y < _heightmapsize.y; y++)
                        {
                            for (int x = 0; x < _heightmapsize.x; x++)
                            {

                                float tsum = 0;
                                // Наберм слои в массив
                                for (int layer = 0; layer < _splats.Count; layer++)
                                {
                                    tsum += splatarray[x, y, layer]; // запишим сумму весов всех слоев
                                }


                                if (tsum > 1.1 && asd == 1)
                                {
                                    asd = 2;
                                    Debug.LogError(
                                        string.Format(
                                            "splatarray >1,  коэффициент: ({0}) всего слоев: ({1}) сумма весов этих слоев: ({2}) x: ({8}) y: ({9})" +
                                            "слой 1: ({3}) слой 2: ({4}) слой 3:({5}) слой 4: ({6}) слой 5: ({7}) ",
                                            1/tsum, _splats.Count, tsum, splatarray[x, y, 0], splatarray[x, y, 1],
                                            splatarray[x, y, 2], splatarray[x, y, 3], splatarray[x, y, 4], x, y));
                                }
                            }
                        }
                        //УДАЛИТЬ!!!!
                    }
                }
                //конец блока нормализации

            }

            tdata.splatPrototypes = prototypes;
            tdata.SetAlphamaps(0, 0, splatarray);
            prototypes = null;
            splatarray = null;
            System.GC.Collect(0);

        }
    }

    //Загружаем файлы SplatMap-a в массив
    private void LoadSplat(SplatMapInfo2 splat, int k, string xvalue, string yvalue, ref SplatPrototype[] prototypes, ref float[,,] splatarray)
    {

       // Load splatmap file
        string splatfile = string.Format(splat.Filemask, xvalue, yvalue); //Get Name Files, x and y size
        string[] splatfiles = System.IO.Directory.GetFiles(_imagesPath, splatfile + ".*"); // масив файлов
        byte[] imagebytes = System.IO.File.ReadAllBytes(splatfiles[0]); // чтение из сплайта по байтам
        Texture2D t = new Texture2D(1, 1); // создадим пустой обект t
        t.LoadImage(imagebytes); // загрузим в t массив байтов сплайта
        imagebytes = null; //чистим память
        System.GC.Collect(0);// чистим
        Color[] imagecolors = t.GetPixels();// передадми дату в масив imagecolors
        int imagewidth = t.width;
       
        DestroyImmediate(t); // укакошим t

        for (int v = 0; v < _heightmapsize.y; v++) // будем крутить пока Y  _heightmapsize  не закончится
        {
            for (int u = 0; u < _heightmapsize.x; u++) // крутим _heightmapsize по X
            {
                splatarray[u, v, k] = imagecolors[((imagewidth - 1) - u)*imagewidth + v].r; // загрузим
            }
        }


        imagecolors = null;
        System.GC.Collect(0);
        // Set splat prototype for this splat layer
        SplatPrototype prototype = new SplatPrototype();
        prototype.texture = splat.Texture;
        prototype.tileOffset = new Vector2(splat.TileOffsetX, splat.TileOffsetY);
        prototype.tileSize = new Vector2(splat.TileSizeX, splat.TileSizeY);
        prototypes[k] = prototype;

        }


Cпасибо! Поковыряю (3A4OT)
Everybody Lies
Аватара пользователя
Egoor
UNец
 
Сообщения: 47
Зарегистрирован: 10 июн 2012, 11:11

Re: Бесшовный динамический террайн (Terrain) WorldMachine2

Сообщение alexmarch 25 окт 2012, 22:41

вот новая редакция
Синтаксис:
Используется csharp
 // Нормализуем слои в масках текстур
    private void NORMALIZ(ref float[, ,] splatarray)
    {
                /*
                 *  Идея alexz
                 *  viewtopic.php?f=19&t=3652&st=0&sk=t&sd=a&start=30
                 *  - А у меня друг сломал сервер за пять минут!!!
                 *  - Он что, хакер???
                 *  - Нет. Он - мудак!!!
                 */


                 // Нормализум то что не нормализованно
                 // Нормализация (normalization) — приведение к единичному размеру.
                 // Термин «Normalization» также переводится как «Нормировка», смысл которой сосотоит в приведении чего-либо к эталонному,
                 // единичному виду. Например, отнормировать последовательность означает умножит ее члены на такую величину,
                 // чтобы максимум (по модулю) этой последовательности стал равен единице.
       
       
            for (int y = 0; y < _heightmapsize.y; y++)
            {
                for (int x = 0; x < _heightmapsize.x; x++)
                {
                    float tsum = 0; //храним сумму слоев
                    float bsum = 0; //храним сумму слоев

                    float[] sum = new float[_splats.Count]; //Храним хронику сложений слоев
                    int layermem = 0; //Запишим номер слоя с который смешаем все сотальные слои
                    //Посчитаем сумму слоев
                    for (int layer = 0; layer < _splats.Count; layer++)
                    {
                        tsum += splatarray[x, y, layer]; // запишим сумму весов всех слоев
                        sum[layer] += splatarray[x, y, layer]; //число фабиначи
                    }
                 
                    // Найдем последний не нулевой слой
                    if (tsum != 0) // Если сумма значений в слоях не равняеться 0
                    {
                        layermem = _splats.Count;
                        float j = 0f;
                        do
                        {
                            j = splatarray[x, y, layermem-1];
                            layermem--; // Номер слоя в котором есть значения
                        } while (j == 0);


                        //  Посчитаем сумму слоев которые нужно смешть по отношению к главному слою
                        if (layermem > 0) //Если есть хотя бы один слой
                        {
                            for (int layer = 0; layer < layermem; layer++)
                            {
                                bsum += splatarray[x, y, layer]; // запишим сумму весов слоев смешивания
                            }

                            for (int layer = 0; layer < layermem; layer++)
                            {
                                splatarray[x, y, layer] *= _ratior / bsum; // запишим значения слоя с учетом коэффициента (_ratio)
                            }

                            splatarray[x, y, layermem - 1] *= _ratiol / splatarray[x, y, layermem - 1]; // Запишим послейдний слой

                        }
                    }

                    // Debug.LogError(string.Format("Запись внутри цыкла. Сумма слоев = 0, коэффициент: ({0}) всего слоев: ({1}) сумма весов слоев: ({2}) № слоя ({3}), вес слоя ({4})",
                    // 1/tsum, _splats.Count, tsum, layer, splatarray[x, y, layer]));
                       
                        //Нормализуем
                    if (tsum > 1)
                    {
                        for (int layer = 0; layer < _splats.Count; layer++)
                        {
                            splatarray[x, y, layer] *= 1/tsum;
                        }
                    }
                }
                }
            }
       
    //конец блока нормализации
   

    //Применяем полученый SplatMap на терейн дату
    private void LoadSplats(string xvalue, string yvalue, ref TerrainData tdata)
    {

        if (_splats.Count > 0)
        {
            float[, ,] splatarray = new float[(int)_heightmapsize.x, (int)_heightmapsize.y, _splats.Count];
            SplatPrototype[] prototypes = new SplatPrototype[_splats.Count];

            for (int k = 0; k < _splats.Count; k++)
            {
                LoadSplat(_splats[k], k, xvalue, yvalue, ref prototypes, ref splatarray);
                // Прогресс бар (тормазим работу <img src="./images/smilies/1.gif" alt=":)" title="Happy" />
                EditorUtility.DisplayProgressBar("Importing Splat", ((k + 1)).ToString() + " Splat Files", 1);
               
            }
            if (_optionSplatMix) //Если стоит галочка нормализовать
            {
                NORMALIZ(ref splatarray);
            }

            tdata.splatPrototypes = prototypes;
            tdata.SetAlphamaps(0, 0, splatarray);
            prototypes = null;
            splatarray = null;
            System.GC.Collect(0);

        }
    }

    //Загружаем каждый слой отдельно
    private void LoadSplat(SplatMapInfo2 splat, int k, string xvalue, string yvalue, ref SplatPrototype[] prototypes, ref float[,,] splatarray)
    {

       // Load splatmap file
        string splatfile = string.Format(splat.Filemask, xvalue, yvalue); //Get Name Files, x and y size
        string[] splatfiles = System.IO.Directory.GetFiles(_imagesPath, splatfile + ".*"); // Найдем файл
        byte[] imagebytes = System.IO.File.ReadAllBytes(splatfiles[0]); // чтение из файла
        Texture2D t = new Texture2D(1, 1); // создадим пустой обект t
        t.LoadImage(imagebytes); // загрузим в t днные с слоя
        imagebytes = null; //чистим память
        System.GC.Collect(0);// чистим
        Color[] imagecolors = t.GetPixels();// передадми дату в масив imagecolors
        int imagewidth = t.width;
       
        DestroyImmediate(t); // укакошим t
       
        for (int v = 0; v < _heightmapsize.y; v++) // будем крутить пока Y  _heightmapsize  не закончится
        {
            for (int u = 0; u < _heightmapsize.x; u++) // крутим _heightmapsize по X
            {
                splatarray[u, v, k] = imagecolors[((imagewidth - 1) - u)*imagewidth + v].r; // загрузим
            }
        }

        imagecolors = null;
        System.GC.Collect(0);
        // Set splat prototype for this splat layer
        SplatPrototype prototype = new SplatPrototype();
        prototype.texture = splat.Texture;
        prototype.tileOffset = new Vector2(splat.TileOffsetX, splat.TileOffsetY);
        prototype.tileSize = new Vector2(splat.TileSizeX, splat.TileSizeY);
        prototypes[k] = prototype;

        }
Аватара пользователя
alexmarch
UNITрон
 
Сообщения: 286
Зарегистрирован: 04 май 2009, 19:54

Re: Бесшовный динамический террайн (Terrain) WorldMachine2

Сообщение moskit 21 дек 2015, 18:46

Извините за то, что подымаю такую старую тему.
Кто-нибудь может описать от начала и до конца, как из одного большого битмапа получить кучу маленьких(10*10).
Что я делаю в WorldMachine:
Во вкладке Generator выбираю File Input. Дважды нажимаю на него мышкой и открывается окно настроек. Там жму Load и выбираю исходный bmp файл,который хочу разделить на куски. Затем в этом же окне выбираю размер 10км*10км и жму OK.
В окошке превью появилась мой рельеф.
Потом делаю как описано в первом сообщении:
Жму на кнопку World Extents and Resolution. Выбираю With и height по 12км. Выбираю resolution 512*512. Захожу в Tiled Build Options, меняю Tile Resolution на 513*513. Tiles per side выбираю 10*10(мне надо на столько кусков разбить). Ставлю галку на Share edge vertices.
Из вкладки Output беру Height Output. Дважды жму на него мышкой, открывается окно, в File Format выбираю 8-битный RAW, жму кнопку Set и выбираю папку сохранения. Жму OK.
Соединяю File Input и Height Output.
Если я в Height Output нажму Write output to disk, то запишется только один raw файл.

Вот и вопрос. Что я делаю не так?
moskit
UNец
 
Сообщения: 8
Зарегистрирован: 18 дек 2015, 14:43

Пред.

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

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

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