Ai đó có thể giải thích ánh sáng vô tuyến cho tôi?


8

Tôi đã có những điều cơ bản về tắc xung quanh. Tôi có một raycaster và có khả năng bắn các tia về một bán cầu đồng đều. Có vẻ như đó là những điều cơ bản của những gì cần thiết cho sự phóng xạ nhưng tôi không biết phải đi đâu từ đó. Tôi có tìm thấy bao nhiêu ánh sáng đến từ mỗi khuôn mặt? (Tôi đang làm cho trò chơi của mình ra khỏi hình khối như minecraft) Sau đó tôi phải làm gì?


3
Tại sao thẻ "minecraft"?
Valmond

Câu trả lời:


9

Thật vậy, đó là tất cả những gì bạn cần cho sự phóng xạ. Có hai công thức khác nhau (nhưng bằng nhau). Đầu tiên là "tỏa" hoặc bắn ánh sáng từ mỗi miếng vá (trong trường hợp của bạn có lẽ là một khuôn mặt), và thứ hai là "thu thập" hoặc nhận ánh sáng vào mỗi miếng vá. Nếu bạn lặp đi lặp lại điều này đủ lần, bạn sẽ nhận được sự phóng khoáng.

Bước đầu tiên là tìm ra ánh sáng bắt nguồn từ đâu vì trong cả hai phương pháp đều phải có nguồn sáng. Nếu bạn định thực hiện phương pháp thu thập, tôi phải cảnh báo bạn rằng nó không xử lý ánh sáng điểm rất tốt. Bạn phải gieo hạt với ánh sáng (tính riêng nó) hoặc bạn nhận được kết quả kỳ lạ. Trong phương pháp bức xạ, bạn phát ra từ các đèn điểm như bình thường nhưng bỏ qua chúng như các máy thu từ các bản vá khác.

Bạn có thể dừng sau bất kỳ số lần thoát (hoặc lặp) nào, nhưng bạn càng làm nhiều, giải pháp càng tốt. Bạn có một thời gian dễ dàng để tạo bản vá vì bạn có thể coi mỗi bên của hình khối của mình là một bản vá. Nếu bạn muốn một cái gì đó chi tiết hơn, bạn có thể chia nhỏ những khuôn mặt đó thậm chí xa hơn.

Trong một ví dụ bức xạ, điều này có thể được sử dụng làm cơ sở cho vòng lặp của bạn:

while(!done) {
   foreach Patch a {
     a.shootRays(n);
     foreach ray r {
       Patch b = r.firstIntersectingPatch();
       float modifier = 1 / ((distance(a,b)^2)
       b.incidentLight += (a.exidentLight / n) * modifier; 
     } 
   }
  foreach Patch a {
    float modifier = a.absorption;
    a.exidentLight = (a.incidentLight * modifier) + a.emission;
    a.incidentLight = 0;
  }

  done = goodEnough() ? true : false;
}

Đối với phương thức thu thập, bạn sẽ có vòng lặp đầu tiên hơi khác:

      foreach Patch a {
         a.shootRays(n);
         foreach ray r {
           Patch b = r.firstIntersectingPatch();
           float modifier = 1 / ((distance(a,b)^2)
           a.incidentLight += b.exidentLight * modifier; 
         } 
         a.incidentLight /= n;
       }

Công cụ sửa đổi đầu tiên được sử dụng cho mỗi lần sửa đổi ánh sáng tới. Việc sử dụng phổ biến nhất sẽ là rơi từ xa như tôi đã làm ở trên. Công cụ sửa đổi thứ hai là để sửa đổi toàn cầu ánh sáng tới như hấp thụ vật liệu. Biến a.emission sẽ là 0 cho hầu hết các bản vá.

Chỉ những nguồn là nguồn sáng (hoặc bị ảnh hưởng trực tiếp bởi nguồn sáng điểm nếu bạn đang sử dụng phương pháp thu thập như đã nêu ở trên) mới có giá trị phát xạ khác 0.

Hàm goodEnough () có thể có nhiều thứ. Nó có thể chỉ là đếm số lần lặp hoặc có thể nhìn vào tổng lượng ánh sáng trong cảnh hoặc có thể là một số thử nghiệm khác mà bạn nghĩ ra. Phần này thực sự tùy thuộc vào bạn và những gì bạn nghĩ có vẻ đủ tốt nhưng vẫn hoàn thành trong một khoảng thời gian hợp lý.

Bạn càng chụp nhiều tia, giải pháp của bạn càng chính xác nhưng quá trình càng chậm. Cũng vậy với số lượng các bản vá và số lần lặp qua vòng lặp. Làm thế nào bạn lưu trữ giá trị ánh sáng cuối cùng là tùy thuộc vào bạn. Nó có thể ở dạng kết cấu hoặc được lưu trữ dưới dạng giá trị trong các hình khối của bạn, nhưng tôi không nghĩ rằng điều này có thể thực hiện được trong thời gian thực với một số lượng lớn các bản vá.


Xin chào Chewy. Điều này thực sự làm việc? Tôi khá chắc chắn rằng nó nên xem xét luật cosin của lambert. Nhưng có lẽ tôi không nhận được một cái gì đó.
Notabene

1
Nó có thể có được chính xác như bạn muốn. Các góc giữa các bản vá có thể được tính đến với giá trị sửa đổi đầu tiên, cùng với bất kỳ số lượng các hiện tượng khác. Đây chỉ là phác thảo chung về những gì xảy ra.
Chewy Gumball

Đồng ý. Rất đẹp. Đây là lần đầu tiên tôi nghe về sự phóng xạ trong thời trang đúc tia. Nhưng nó có ý nghĩa hoàn hảo. Cảm ơn vì nó.
Notabene

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.