У меня проблемы с реализацией шума Перлина. По какой -то причине это кажется слишком шумным. Я не вижу, как я мог бы использовать это для игровой местности. Вот скриншот: < /p>
Проблема с шумом Perlin < /p>
Вот код моего генерации: < /p>
double persistence = .25;
double octaves = 1;
double Game::GeneratePerlin2D(const double& x, const double& y)
{
double total = 0;
for (int i = 0; i < octaves; i++)
{
double frequency = pow(2, i);
double amplitude = pow(persistence, i);
total += InterpolatedNoise(x * frequency, y * frequency) * amplitude;
}
return total;
}
double Game::InterpolatedNoise(const double& x, const double& y)
{
int intX = (int)x;
double fractionX = x - intX;
int intY = (int)y;
double fractionY = y - intY;
// Get the smoothed noise values for each corner
double s = SmoothNoise(intX, intY); // Bottom left
double t = SmoothNoise(intX + 1, intY); // Bottom right
double u = SmoothNoise(intX, intY + 1); // Top left
double v = SmoothNoise(intX + 1, intY + 1); // Top right
// Interpolate the corner values to get the middle values
double i = Interpolate(s, t, fractionX); // Bottom middle
double ii = Interpolate(u, v, fractionX); // Top middle
// Interpolate the middle values to get the center value
return Interpolate(i, ii, fractionY);
}
double Game::SmoothNoise(const int& x, const int& y)
{
double corners = (Noise(x - 1, y - 1) + Noise(x + 1, y - 1) + Noise(x - 1, y + 1) + Noise(x + 1, y + 1)) / 16;
double sides = (Noise(x - 1, y) + Noise(x + 1, y) + Noise(x, y - 1) + Noise(x, y + 1)) / 8;
double center = Noise(x, y) / 4;
return corners + sides + center;
}
double Game::Interpolate(const double& a, const double& b, const double& w)
{
// Cosine interpolation
double ft = w * M_PI;
double f = (1 - cos(ft)) * 0.5;
return a * (1 - f) + b * f;
}
double Game::Noise(const int& x, const int& y)
{
int n = x + y * 57;
n = (n
И вот мой код хакерского рендеринга, для целей отладки: < /p>
for (int y = 0; y < 512; y++)
{
for (int x = 0; x < 512; x++)
{
double val = GeneratePerlin2D((x), (y));
Rectangle rect(x, y, 1.0, 1.0);
SDL_Color color{(Uint8)(val * 128 + 128), (Uint8)(val * 128 + 128), (Uint8)(val * 128 + 128), 255};
m_renderer->RenderFillRect(rect, color);
}
}
< /code>
Я пробовал как линейную, так и косинусную интерполяцию, двойной и тройной проверку моего типа литья и переменных, и я не знаю, что здесь происходит. Чего мне не хватает?>
Подробнее здесь: https://stackoverflow.com/questions/353 ... e-so-noisy
Почему мой шум в Перлин так .. шумный? [дублировать] ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1758320320
Anonymous
У меня проблемы с реализацией шума Перлина. По какой -то причине это кажется слишком шумным. Я не вижу, как я мог бы использовать это для игровой местности. Вот скриншот: < /p>
Проблема с шумом Perlin < /p>
Вот код моего генерации: < /p>
double persistence = .25;
double octaves = 1;
double Game::GeneratePerlin2D(const double& x, const double& y)
{
double total = 0;
for (int i = 0; i < octaves; i++)
{
double frequency = pow(2, i);
double amplitude = pow(persistence, i);
total += InterpolatedNoise(x * frequency, y * frequency) * amplitude;
}
return total;
}
double Game::InterpolatedNoise(const double& x, const double& y)
{
int intX = (int)x;
double fractionX = x - intX;
int intY = (int)y;
double fractionY = y - intY;
// Get the smoothed noise values for each corner
double s = SmoothNoise(intX, intY); // Bottom left
double t = SmoothNoise(intX + 1, intY); // Bottom right
double u = SmoothNoise(intX, intY + 1); // Top left
double v = SmoothNoise(intX + 1, intY + 1); // Top right
// Interpolate the corner values to get the middle values
double i = Interpolate(s, t, fractionX); // Bottom middle
double ii = Interpolate(u, v, fractionX); // Top middle
// Interpolate the middle values to get the center value
return Interpolate(i, ii, fractionY);
}
double Game::SmoothNoise(const int& x, const int& y)
{
double corners = (Noise(x - 1, y - 1) + Noise(x + 1, y - 1) + Noise(x - 1, y + 1) + Noise(x + 1, y + 1)) / 16;
double sides = (Noise(x - 1, y) + Noise(x + 1, y) + Noise(x, y - 1) + Noise(x, y + 1)) / 8;
double center = Noise(x, y) / 4;
return corners + sides + center;
}
double Game::Interpolate(const double& a, const double& b, const double& w)
{
// Cosine interpolation
double ft = w * M_PI;
double f = (1 - cos(ft)) * 0.5;
return a * (1 - f) + b * f;
}
double Game::Noise(const int& x, const int& y)
{
int n = x + y * 57;
n = (n
И вот мой код хакерского рендеринга, для целей отладки: < /p>
for (int y = 0; y < 512; y++)
{
for (int x = 0; x < 512; x++)
{
double val = GeneratePerlin2D((x), (y));
Rectangle rect(x, y, 1.0, 1.0);
SDL_Color color{(Uint8)(val * 128 + 128), (Uint8)(val * 128 + 128), (Uint8)(val * 128 + 128), 255};
m_renderer->RenderFillRect(rect, color);
}
}
< /code>
Я пробовал как линейную, так и косинусную интерполяцию, двойной и тройной проверку моего типа литья и переменных, и я не знаю, что здесь происходит. Чего мне не хватает?>
Подробнее здесь: [url]https://stackoverflow.com/questions/35332038/why-is-my-perlin-noise-so-noisy[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия