Tôi đang chơi với Perlin Noise sau một số hoạt động với Diamond Square. Tôi đã theo dõi triển khai của Hugo Elias , về cơ bản, tạo ra một loạt các hàm với x, y làm đầu vào để ném từng giá trị tọa độ.
Mã PHP của tôi ở đây :
Tôi có hai câu hỏi:
Làm cách nào để sử dụng thuật toán để tạo bản đồ chiều cao trong một mảng? Tôi đã không hiểu đầy đủ về nó và chỉ chuyển sang mã giả mã PHP, nhưng thực hiện chức năng cuối cùng (map_perlines) sau khi đọc ở đâu đó thuật toán "kỳ diệu" cung cấp cho bạn các giá trị được chuyển đổi cho mỗi điểm x, y đưa ra (rõ ràng, mà không cần phải đọc nó giá trị liền kề), tôi chỉ nhận được điều này khi sử dụng như hàm ngẫu nhiênmt_rand(-100,100)/100;
Và điều này khi sử dụng mật mã: 1.0-(($n*($n*$n*15731+789221)+1376312589)&0x7fffffff)/1073741824.0;
(mà, BTW, có thể được triển khai "nguyên trạng" trong PHP không?):
Vì vậy, tóm tắt, ba câu hỏi:
- Mã của tôi có đúng không?
- Hàm ngẫu nhiên có thể được chuyển sang PHP như được mô tả trong mã? Nó ném không có lỗi, nhưng kết quả không có ở đó.
- Làm thế nào để tôi thực sự sử dụng thuật toán?
CẬP NHẬT
Ok, đã tạo một cổng PHP của mã được hiển thị trong bài viết của Gustavson và như các lập trình viên khác đã nói, nó chỉ tạo ra một quãng tám. Có bất kỳ trang web / giấy / hướng dẫn hữu ích nào khác về cách sử dụng điều này với các khái niệm về nhiều quãng tám, biên độ, tần số, v.v. để kiểm soát chức năng nhiễu không? Trên bài báo của Gustavson chỉ cho thấy kết quả, chứ không phải việc triển khai thực tế thuật toán, có lẽ tôi đang thiếu một cái gì đó?
CẬP NHẬT 2
@NATHAN
Tôi đã làm một cái gì đó như:
$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);
Và sau khi bình thường hóa các giá trị thành 0..1, tôi nhận được một bản đồ chiều cao khá buồn tẻ, chẳng hạn như:
Làm thế nào để tôi gieo hạt bản đồ? Có lẽ những gì tôi cần thực hiện là phiên bản 3d với giá trị thứ ba một chiều cao ngẫu nhiên? Nhưng nếu vậy, tôi phải tìm hiểu xem xét các giá trị lân cận, mà tôi sẽ kết thúc bằng thứ gì đó giống như thuật toán hình vuông kim cương, chính xác là điều tôi không muốn làm.
CẬP NHẬT 3
Thêm Perlin làm việc. Tôi vẫn chưa tìm được cách hướng dẫn tiếng ồn đến kết quả của mình. Kiểm tra các quãng tám và kết quả cuối cùng:
Octave I đến IV
Tóm tắt
Mỗi quãng tám là khá nhiều như nhau. Kiểm tra mã:
$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);
Kết quả được bình thường hóa. Những gì bạn sẽ sử dụng có ảnh hưởng mạnh mẽ trong sự phát triển của tiếng ồn? Tôi thấy các ví dụ trong đó việc thay đổi biên độ cho bề mặt mềm hoặc nhám, nhưng ngay cả khi tôi cho biên độ lớn, tôi cũng thấy rất ít sự khác biệt.