Bạn có thể sử dụng các hàm nhiễu để tạo độ cao ngẫu nhiên. Đơn giản nhất trong số chúng là nhiễu giá trị, hoạt động chính xác như mô tả của bạn: bạn tạo một số độ cao số nguyên ngẫu nhiên và sau đó nội suy độ cao giữa chúng. Phương pháp nội suy thường được sử dụng là ánh xạ đường cong S khối:
Giả sử bạn có chiều cao h0
tại điểm x0
và chiều cao h1
tại điểm x1
. Sau đó, để có được chiều cao tại bất kỳ điểm nào x
( x0<=x<=x1
), bạn sử dụng
t = (x-x0)/(x1-x0); // map to [0,1] range
t = t*t*(3 - 2*t); // map to cubic S-shaped curve
h = h0+t*h1;
Độ cao thu được theo cách này sẽ trơn tru, ngẫu nhiên, nhưng không thực sự thú vị. Để làm cho địa hình của bạn tốt hơn, bạn có thể sử dụng tiếng ồn fractal . Nó hoạt động như thế này: giả sử bạn đã tạo một hàm h(x)
trả về chiều cao tại một tọa độ cho trước (sử dụng phương thức trên). Hàm này có tần số, được xác định bởi tần số của độ cao interger gốc. Để tạo ra một fractal từ nó, bạn kết hợp các chức năng với nhau với một số tần số:
fbm(x)=h(x) + 0.5*h(2*x) + 0.25*h(4*x) + 0.125*h(8*x);
Trong ví dụ này, tôi kết hợp bốn tần số - gốc, gấp đôi, 4 lần và 8 lần ban đầu, với tần số cao hơn cho trọng lượng ít hơn. Về mặt lý thuyết, fractals đi tất cả các con đường đến vô tận, nhưng trong thực tế chỉ cần một vài thuật ngữ. Công fbm
thức là viết tắt của chuyển động Brownian phân đoạn - đây là tên của hàm này.
Đây là một kỹ thuật mạnh mẽ. Bạn có thể chơi với hệ số nhân tần số, với trọng số của các tần số khác nhau hoặc thêm một số chức năng để làm méo tiếng ồn. Ví dụ: để có được cảm giác "lột xác" hơn, h(x)
có thể thay đổi thành 1-abs(h(x))
(giả sử -1<=h(x)<=1
)
Tuy nhiên, trong khi tất cả điều này là tốt đẹp, kỹ thuật này có một hạn chế nghiêm trọng. Với cách tiếp cận dựa trên "chiều cao", bạn không bao giờ có thể có địa hình "nhô ra". Và tôi tưởng tượng chúng là một tính năng rất hay có trong một trò chơi giống như "Moon Buggy".
Thêm phần nhô ra đẹp là một nhiệm vụ khó khăn. Một điều mà tôi có thể nghĩ đến - bạn có thể bắt đầu với một "chiều cao" fractal, và "tessellate" nó thành một loạt các đường cong spline hoặc bezier. Sau đó, đường địa hình sẽ được xác định bởi một số "điểm chính". Áp dụng một số jitter cho các điểm chính này - điều này sẽ dẫn đến biến dạng ngẫu nhiên của địa hình, có thể tạo thành một số hình dạng thú vị. Tuy nhiên, tự giao cắt địa hình có thể trở thành một vấn đề với phương pháp này, đặc biệt là với số lượng jitter cao.