Я граю з Перлін Шумом після роботи з Diamond Square. Я слідкував за виконанням Уго Еліасом, який, в основному, робить ряд функцій з x, y як вхідних даних для передачі кожного значення координати.
Мій PHP-код тут :
У мене є два питання:
Як використовувати алгоритм для створення карти висоти в масиві? Я не до кінця зрозумів це і просто переніс на PHP псевдокод, але виконуючи останню функцію (map_perlined) після того, як десь прочитав, що алгоритм "магічно" дає вам перехідні значення для кожного x, y точки (мабуть, не читаючи його суміжні значення), я просто отримую це при використанні як випадкова функціяmt_rand(-100,100)/100;
І це при використанні криптографічного: 1.0-(($n*($n*$n*15731+789221)+1376312589)&0x7fffffff)/1073741824.0;
(що, BTW, можна реалізувати "як є" в PHP?):
Отже, підводячи підсумки, три питання:
- Чи правильний мій код?
- Випадкова функція може бути перенесена на PHP, як описано в коді? Він не кидає помилок, але результатів немає.
- Як я фактично використовую алгоритм?
ОНОВЛЕННЯ
Гаразд, зробив PHP-порт коду, показаного на папері Густавсона, і як сказав інший кодер, він просто генерує одну октаву. Чи є будь-який інший корисний сайт / папір / посібник про те, як використовувати це з поняттями декількох октав, амплітуди, частоти тощо для управління функцією шуму? На роботі Густавсона просто показані результати, а не реальна реалізація алгоритму, можливо, я щось пропускаю?
ОНОВЛЕННЯ 2
@NATHAN
Я зробив щось на кшталт:
$persistence = 0.5;
for ($j = 0; $j < $size; $j++) {
for ($i = 0; $i < $size; $i++) {
for ($o = 0; $o < 8; $o++) {
$frequency = pow(2,$o);
$amplitude = pow($persistence, $o);
$value += SimplexNoise($i*$frequency, $j * $frequency) * $amplitude;
}
//$value = SimplexNoise($i, $j) + 0.5 * SimplexNoise($i, $j) + 0.25 * SimplexNoise($i, $j);
$this->mapArray[$i][$j] = new Cell($value);
І після нормалізації значень до 0..1 я отримую досить тупу карту висоти, наприклад:
Як засіяти карту? Можливо, мені потрібно реалізувати 3d версію з третім значенням випадкової висоти? Але якщо так, я повинен був би з'ясувати, щоб взяти до уваги сусідні значення, які я б закінчував чимось на зразок алмазного квадратного алгоритму, саме того, чого я не хочу робити.
ОНОВЛЕННЯ 3
Більше роботи Перліна. Я ще не знайшов способу спрямувати шум на свої результати. Перевірте ці октави та кінцевий результат:
Октава I до IV
Підведені
Кожна октава майже однакова. Перевірте код:
$persistence = 0.5;
for ($j = 0; $j < $size; $j++) {
for ($i = 0; $i < $size; $i++) {
$value = 0;
for ($o = 0; $o < 4; $o++) {
$frequency = pow(2,$o);
$amplitude = pow($persistence, $o);
$value += improved_noise($i*$frequency, $j*$frequency, 0.5)*$amplitude;
}
$this->map[$i][$j] = new Cell($value);
Результати нормалізуються. Що б ви використовували, сильно вплинули на розвиток шуму? Я бачу приклади, коли зміна амплітуди дає м'які або шорсткі поверхні, але навіть якщо я даю величезну амплітуду, я бачу невелику різницю.