Làm thế nào để tôi tạo ra một chân trời?


8

Tôi đã thêm một bầu trời vào raytracer của mình để được lấy mẫu khi một tia hoàn toàn bỏ lỡ bất kỳ vật thể nào.

Con thỏ

Những gì tôi đang làm ở đây là nếu một tia hoàn toàn bỏ lỡ bất cứ điều gì trong cảnh, nó sẽ trả về hàm nhiễu Perlin tại (ray.direction.x, ray.direction.y, ray.direction.z) - nói cách khác là "mẫu một quả cầu xung quanh nguồn gốc ".

Nhưng nó "có vẻ sai" (vì bầu trời trông như đang đối diện với bạn).

Làm thế nào tôi có thể cải thiện bầu trời và làm cho nó trông giống như đường chân trời của trái đất?

Hoặc điều này ít nhiều sẽ trông như thế nào, và tôi chỉ nên thêm nhiều hình học hơn trên sàn?


Tôi đồng ý rằng nó trông khác thường không tự nhiên. Máy ảnh của bạn sẽ hoạt động như thế nào? Bạn có cần một skybox đầy đủ hay chỉ là một phông nền và bạn muốn tạo bầu trời bằng cách sử dụng tiếng ồn hay lấy mẫu từ một kết cấu tốt? Nếu nó chỉ là một bối cảnh (ala một trò chơi 2.5D), bạn có thể lấy mẫu từ một cái gì đó như thế này images.bibliocad.com/library/image/00010000/9000/... đó sẽ là Tileable là một toàn cảnh của nó.
ClassicThunder

2
Một số loại chuyển đổi sang tọa độ Y (hoặc Z, nếu đó là tọa độ "hướng lên" của bạn) có thể làm điều gì đó. Ví dụ: y '= 1 - (1 - y) ^ 2. Ý tưởng là nén tọa độ Y quanh y = 0 và giữ nguyên hoặc mở rộng nó gần y = 1.
John Calsbeek

@Calsbeek đây sẽ là một câu trả lời tuyệt vời! :)
Maik

Câu trả lời:


7

Ngoài ra, bạn có thể sử dụng bản đồ khối với kết cấu bầu trời thay vì sử dụng nhiễu perlin. Và tôi cũng nghĩ rằng điều đó sẽ làm cho cảnh của bạn trông đẹp hơn do có nhiều chi tiết và biến thể hơn trong bản đồ môi trường. Đó chính xác là những gì tôi đã làm khi tôi triển khai raytracer của mình.

Một lý do khác tôi khuyên bạn nên làm điều này là môi trường không cần chỉ có mây. Nó có thể có những ngọn núi, nó có thể là một cảnh trong nhà, có thể là một cảnh từ sao hỏa. Sử dụng bản đồ khối, điều duy nhất bạn cần làm là hoán đổi kết cấu và bạn đã hoàn thành.

Vì vậy, bước đầu tiên sẽ là tìm một bản đồ khối phù hợp với nhu cầu của bạn. Nó có thể được lưu trữ dưới dạng sáu kết cấu riêng biệt, hoặc dưới dạng một kết cấu giống như kết cấu bên dưới. Đồng thời kiểm tra liên kết này để biết thêm thông tin về cách tạo của riêng bạn:

nhập mô tả hình ảnh ở đây

Sau đó, trên mã của bạn, tôi khuyên bạn nên tạo một CubeMaplớp để đóng gói các tính toán lấy mẫu. Lớp này nên biết làm thế nào để tải các kết cấu bản đồ cube, và đưa ra một ray nó sẽ có thể biết trong đó khuôn mặt và trong những gì vị trí để mẫu. Trong quá trình thực hiện, tôi thấy việc lưu trữ mỗi sáu mặt trong các đối tượng kết cấu riêng biệt và phân nhánh dựa trên hướng của tia dễ dàng hơn:

class CubeMap
{
    public void Load(string path);
    public Color GetSample(Ray ray);
    private Texture[6] faces;
}

Trong trường hợp bạn chưa có Texturelớp, chỉ cần tạo một lớp của riêng bạn. Nó có thể đơn giản như một mảng màu hai chiều. Vì vậy, chỉ là một tài liệu tham khảo và không đảm bảo về hiệu quả hoặc sự đúng đắn của việc triển khai này, đây là mã tôi đã sử dụng trong dự án của mình - CubeMapCubeFace .


Câu trả lời này giải quyết vấn đề - Tôi muốn biết làm thế nào để kết cấu tôi tạo ra xuất hiện dưới dạng vòm trời .
bobobobo

2

Bạn có thể thử sử dụng 2D Perlin với (ray.dir.x / ray.dir.z, ray.dir.y / ray.dir.z). Các dự án vectơ chỉ hướng lên mặt phẳng Z = 1. Nó sẽ cung cấp cho bạn hiệu ứng của một bầu trời vô tận (bằng phẳng).


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.