Как мне создать горизонт?


8

Я добавил небо к своему трассировщику лучей, которое отбирается, когда луч полностью пропускает какой-либо объект.

кролик

Что я делаю здесь, если луч полностью пропускает что-либо в сцене, он возвращает функцию шума Перлина в (ray.direction.x, ray.direction.y, ray.direction.z) - другими словами, он «пробует» сфера вокруг происхождения ".

Но это «выглядит неправильно» (потому что небо выглядит так, будто оно смотрит на тебя).

Как я могу улучшить небо и сделать его больше похожим на горизонт Земли?

Или это более или менее так должно выглядеть, и мне просто нужно добавить больше геометрии на пол?


Я согласен, что это выглядит явно неестественно. Кстати, как ваша камера будет работать? Вам нужен полный скайбокс или просто фон, и вы хотите генерировать небо с использованием шума или выборки из текстуры хорошо? Если это просто фон (а именно игра 2.5D), вы можете попробовать что-то вроде этого images.bibliocad.com/library/image/00010000/9000/…, что было бы мозаичным, это его панорамный вид.
ClassicThunder,

2
Некоторое преобразование в координату Y (или Z, если это ваша «восходящая» координата) может что-то сделать. Например, у '= 1 - (1 - у) ^ 2. Идея состоит в том, чтобы сжать координату Y вокруг y = 0 и сохранить ее такой же или расширить ее около y = 1.
Джон Калсбек

@Calsbeek это был бы отличный ответ! :)
Maik Semder

Ответы:


7

В качестве альтернативы вы можете использовать кубическую карту с текстурой неба вместо перлин-шума. И я также думаю, что это сделает вашу сцену лучше благодаря наличию большего количества деталей и изменений в картографировании окружающей среды. Это именно то, что я сделал, когда внедрил свой raytracer.

Еще одна причина, по которой я рекомендую это, заключается в том, что окружающая среда не должна быть только облаками. Это может быть горы, это может быть сцена в помещении, может быть сцена из Марса. Используя кубическую карту, единственное, что вам нужно сделать, это поменять текстуру, и все готово.

Поэтому первым шагом будет поиск карты куба, которая соответствует вашим потребностям. Он может храниться в виде шести отдельных текстур или в виде одной текстуры, как показано ниже. Также проверьте эту ссылку для получения дополнительной информации о том, как создать свой собственный:

введите описание изображения здесь

Затем в вашем коде я бы порекомендовал создать CubeMapкласс для инкапсуляции расчетов выборки. Этот класс должен знать, как загрузить текстуру карты куба, и, имея луч, он должен знать, на каком лице и в каком положении брать образец. В моей реализации мне было проще хранить каждую из шести граней в отдельных текстурных объектах и ​​ветвления в зависимости от направления луча:

class CubeMap
{
    public void Load(string path);
    public Color GetSample(Ray ray);
    private Texture[6] faces;
}

Если у вас еще нет Textureкласса, просто создайте свой собственный. Это может быть так же просто, как двумерный массив цветов. Итак, просто для справки и без каких-либо гарантий эффективности или надежности этой реализации приведен код, который я использовал в своем проекте - CubeMap и CubeFace .


Этот ответ обходит проблему - я хочу знать, как сделать созданную мной текстуру похожей на небесный купол Земли .
бобобо

2

Вы можете попробовать использовать 2D Perlin с (ray.dir.x / ray.dir.z, ray.dir.y / ray.dir.z). Проецирует вектор направления на плоскость Z = 1. Это должно дать вам эффект бесконечного (плоского) неба.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.