Chúng tôi đang gặp khó khăn trong việc tải các tài nguyên bên ngoài có trên trang web.

If you're behind a web filter, please make sure that the domains *.kastatic.org and *.kasandbox.org are unblocked.

Nội dung chính

Hiệu ứng nhiễu hai chiều

Nghiên cứu giá trị nhiễu trong không gian một chiều là nền tảng để chúng ta tiếp tục nghiên cứu trong không gian hai chiều. Với hiệu ứng nhiễu một chiều, bất kỳ giá trị nào đã cho cũng có hai giá trị lân cận: giá trị đứng trước (ở bên trái trên đồ thị) và giá trị đứng sau (ở bên phải trên đồ thị).
Hình I.10: Hiệu ứng nhiễu 1 chiều
Về mặt khái niệm, hiệu ứng nhiễu hai chiều hoạt động hoàn toàn tương tự. Sự khác biệt là chúng ta không xét các giá trị dọc theo một đường tuyến tính mà xét các giá trị nằm trên một lưới đồ thị. Hãy tưởng tượng một tờ giấy kẻ ô vuông với những con số được viết trong mỗi ô. Khi đó, vị trí lân cận của một giá trị bất kỳ bao gồm: bên trên, bên dưới, bên phải, bên trái và dọc theo đường chéo.
Hình I.11: Hiệu ứng nhiễu 2 chiều
Nếu ta hình dung mỗi giá trị trên tờ giấy kẻ ô vuông này được ánh xạ đến độ sáng của một màu, ta sẽ được kết quả trông giống một bức ảnh mờ đục. Màu trắng nằm cạnh màu xám nhạt, màu xám nhạt nằm cạnh màu xám, màu xám nằm cạnh màu xám đậm, màu xám đậm nằm cạnh màu đen, màu đen nằm cạnh màu xám đậm, v.v.
Đây cũng là lý do thuật toán sinh nhiễu được phát minh. Từ kết quả trên, ta có thể điều chỉnh các thông số một chút hoặc dùng những màu sắc khác để tạo hình ảnh trông giống như đá cẩm thạch, gỗ hoặc bất kỳ kết cấu hữu cơ nào khác.
Hãy cùng xem cách triển khai hiệu ứng nhiễu hai chiều trong ProcessingJS. Nếu muốn tô màu ngẫu nhiên từng pixel trên khung kết quả, ta sẽ dùng vòng lặp lồng nhau để truy cập vào từng pixel và chọn độ sáng ngẫu nhiên:
Để tô màu từng pixel theo hàm noise(), chúng ta sẽ thực hiện tương tự, chỉ khác là thay vì gọi hàm random() thì chúng ta gọi hàm noise().
var bright = map(noise(x,y), 0, 1, 0, 255);
Về mặt lý thuyết, đây là một khởi đầu tốt. Cách này cho ta một giá trị nhiễu ở mọi vị trí (x,y) trong không gian hai chiều. Vấn đề là cách này sẽ không cho ra được hình ảnh với chất lượng đục như mong muốn. Từ pixel 200 lên pixel 201 là một bước nhảy quá lớn trong thuật toán sinh nhiễu. Hãy nhớ lại khi lập trình hiệu ứng nhiễu một chiều, ta tăng biến thời gian thêm 0,01 sau mỗi khung hình chứ không phải tăng 1! Giải pháp để giải quyết vấn đề này là sử dụng các biến khác nhau cho mỗi đối số của hàm nhiễu. Ví dụ, ta sẽ tăng biến xoff mỗi khi di chuyển theo chiều ngang và biến yoff mỗi khi di chuyển theo chiều dọc trong vòng lặp lồng nhau.
Trong suốt bài học này, chúng ta đã tìm hiểu một số hướng ứng dụng phổ biến của thuật toán sinh nhiễu Perlin. Hiệu ứng nhiễu một chiều được sử dụng để tạo chuỗi giá trị có độ mịn cao nhằm chỉ định vị trí trên lộ trình ngẫu nhiên. Hiệu ứng nhiễu hai chiều được sử dụng để tạo họa tiết mờ đục trên mặt phẳng pixel thông qua chuỗi giá trị có độ mịn cao. Tuy nhiên, điều quan trọng cần nhớ là các giá trị nhiễu Perlin chỉ đơn thuần là giá trị và không bị ràng buộc với bất kỳ pixel hay màu sắc nào. Tất cả các ví dụ sử dụng biến trong phần hướng dẫn đều có thể được điều chỉnh bằng thuật toán sinh nhiễu Perlin. Nếu ta muốn mô phỏng sức gió, cường độ của gió có thể được kiểm soát bởi thuật toán sinh nhiễu này. Tương tự đối với góc giữa các nhánh trong mô hình cây phân nhánh hay vận tốc và hướng của đối tượng di chuyển dọc theo lưới đồ thị khi mô phỏng dòng chảy như chương trình dưới đây:
Khi đọc đến đây, ta có thể sẽ ngộ nhận rằng thuật toán ngẫu nhiên là câu trả lời cho mọi tình huống. Trên thực tế, đây là câu trả lời hiển nhiên nhất cho một số câu hỏi mà chúng ta liên tục đặt ra: Vật thể này nên chuyển động như thế nào? Vật thể này nên có màu gì? Thế nhưng, câu trả lời hiển nhiên này cũng có thể là một câu trả lời lười biếng.
Có một điểm cần lưu ý, đó là chúng ta có thể dễ dàng rơi vào bẫy sử dụng thuật toán sinh nhiễu Perlin trong mọi nhiệm vụ. Vật thể này nên di chuyển như thế nào? Dùng thuật toán sinh nhiễu Perlin! Vật thể này nên có màu gì? Dùng thuật toán sinh nhiễu Perlin! Vật thể này nên phát triển nhanh đến mức nào? Dùng thuật toán sinh nhiễu Perlin!
Vấn đề ở đây không phải là nên hay không nên sử dụng tính ngẫu nhiên hoặc nên hay không nên sử dụng thuật toán sinh nhiễu Perlin. Bạn có quyền quyết định các quy tắc trong chương trình của bạn, và hộp công cụ của bạn càng lớn thì bạn càng có nhiều lựa chọn để triển khai các quy tắc đó. Mục tiêu của các bài học là giúp bạn lấp đầy hộp công cụ của mình. Nếu bạn chỉ biết là một kiểu ngẫu nhiên thì tất cả các thiết kế của bạn sẽ có cùng kiểu ngẫu nhiên đó. Hãy coi thuật toán sinh nhiễu Perlin là một công cụ triển khai tính ngẫu nhiên tiếp theo mà bạn có thể cho vào hộp công cụ của mình. Sau khi thực hành thuật toán này thêm một chút, chúng ta sẽ chuyển sang một công cụ khác, đó là vectơ!
Khóa học "Mô phỏng tự nhiên" này được biên soạn dựa trên cuốn "The Nature of Code" (tạm dịch: Bản chất của lập trình) của tác giả Daniel Shiffman, được sử dụng theo giấy phép Creative Commons Attribution-NonCommercial 3.0 Unported License.

Bạn muốn tham gia vào cuộc thảo luận?

Chưa có bài viết nào.
Bạn có hiểu Tiếng Anh không? Bấm vào đây để thấy thêm các thảo luận trên trang Khan Academy Tiếng Anh.