Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Создание астероидного поля

Создание астероидного поля

fire64Постоялецwww6 янв. 201814:37#0
Работаю над космическим шутером на Unity, возник вопрос как лучше организовать создание астероидных полей, чтобы красиво смотрелось и fps сильно не проседал.

Набросал такой код, но выглядит не очень реалистично

        //Generate Asteroids
        int countplanes = UnityEngine.Random.Range(1, 3);

        for (int i = 0; i < countplanes; i++)
        {
            Vector3 aster_position = transform.position + new Vector3(UnityEngine.Random.Range(-10000, 10000), 0, UnityEngine.Random.Range(-10000, 10000));
            int Xcount = UnityEngine.Random.Range(10, 50);
            int Ycount = UnityEngine.Random.Range(10, 50);
            int Zcount = UnityEngine.Random.Range(10, 50);

            float startY = aster_position.y;
            float startZ = aster_position.z;

            for (int x = 0; x < Xcount; x++)
            {
                aster_position.x += UnityEngine.Random.Range(10.0f, 25.0f);
                aster_position.y = startY;

                for (int y = 0; y < Ycount; y++)
                {
                    aster_position.y += UnityEngine.Random.Range(10.0f, 25.0f);
                    aster_position.z = startZ;

                    for (int z = 0; z < Zcount; z++)
                    {
                        aster_position.z += UnityEngine.Random.Range(10.0f, 25.0f);

                        int asterid = UnityEngine.Random.Range(0, 7);

                        UnityEngine.Object asterObj = UST.GetAsteroidById(asterid);

                        GameObject astergo; //variable within a variable
                        astergo = (GameObject)Instantiate(asterObj, aster_position, transform.rotation); //the clone variable holds our instantiate action

                        float aster_scale = UnityEngine.Random.Range(50f, 150f);

                        astergo.transform.localScale = new Vector3(aster_scale, aster_scale, aster_scale);
                    }
                }
            }
        }

Изображение

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

Правка: 6 янв. 2018 14:38

endeavour_prПостоялецwww6 янв. 201816:55#1
код не читал, но в чем проблема в каждом астероиде менять позиции рандомно еще раз
т.е. делать несколько проходов либо  рандомное количество проходов
P.S. миникарта в углу будет не удобно
susagePПостоялецwww6 янв. 201817:43#2
for(indexX) for(inedxY) for(indexZ) 
[
  h = hash(seed,indexX,indeY,indexZ):
  if( hashToBool(hash(h,1), 0.75 ) )  continue:
  aster_position.x = indeX*scale +  hashToFloat(hash(h,2), -1,1)*scale*0.9:
  aster_position.y = indeY*scale +  hashToFloat(hash(h,3), -1,1)*scale*0.9:
  aster_position.z = indeZ*scale +  hashToFloat(hash(h,4), -1,1)*scale*0.9:
  aster_position.scale =  hashToFloat(hash(h,5), -1,1)*scale*0.9:
]:

Правка: 6 янв. 2018 17:43

JerryLetehenПользовательwww7 янв. 201823:14#3
Код работает - то?)
FordPerfectПостоялецwww8 янв. 20180:33#4
susageP
Jittered grid на глаз может быть видно.
Красивше в каждой ячейке количество астероидов по чему-то типа распределения Пуассона (или захардкоженое, но не чистый Пуассон, чтобы например всегда был хотя-бы один астероид в клетке (чтобы синий шум) и максимальное количество ограничить сверху).
FordPerfectПостоялецwww8 янв. 20180:34#5
А зачем вообще ячейки?
Почему не генерировать рандомные позиции сразу во всём поле?
foxesПостоялецwww8 янв. 20186:06#6
FordPerfect
Это в некотором смысле проще, только конечно же это немного для другого используется, например если не хранить сами позиции метеоритов, а надо найти ближайший то берутся соседние ячейки и по ним генерятся координаты - на лету. Только помимо смещения относительно ячейки еще в добавок процеживают, проверяют нужно ли вообще строить метеорит в данной ячейке..

У тебя слишком регулярные метеориты без смещения относительно положения ячейки.

Правка: 8 янв. 2018 6:11

FordPerfectПостоялецwww8 янв. 20186:16#7
foxes
>У тебя
???
Моего кода в теме на данный момент ещё нет.

Правка: 8 янв. 2018 6:18

foxesПостоялецwww8 янв. 20186:21#8
FordPerfect
Да я уже не тебе, второй абзац

fire64
у тебя слишком маленькое смещение. но лучше всего делать два слоя ячеек, второй слой - все ячейки будут смещены на половину их размера, тогда регулярность при таком малом смещении не будет заметна.

+ исходный
+ со смещением - смещение не выходит за размер клетки
+ процеживаем - создаем пустые клетки

Если разброс больше в два раза размера клетки то обычно этого хватает, иначе делаем следующее:
+ добавляем еще один слой

Правка: 8 янв. 2018 6:47

/ Форум / Программирование игр / Игровая логика и ИИ

2001—2018 © GameDev.ru — Разработка игр