Làm thế nào để kết xuất vũ trụ vô tận?


15

Tôi tò mò những thực tiễn tốt nhất trong ngành phát triển trò chơi để tạo ra vũ trụ 3d là gì?

Để cụ thể hơn:

  • Các điểm dữ liệu được đưa ra và tĩnh. Mỗi điểm có vị trí, màu sắc và kích thước;
  • Toàn bộ tập dữ liệu lớn hơn nhiều so với bộ nhớ khả dụng;
  • Người dùng sẽ có thể "thu nhỏ" để xem hình ảnh lớn hơn cùng một lúc;

Cách tiếp cận ngây thơ nhất sẽ là chia vũ trụ thành các hình khối và chỉ hiển thị những gì có thể nhìn thấy. Tôi không chắc làm thế nào trong kịch bản này nên thực hiện "thu nhỏ". Tôi có nên tính toán trước các hình khối cho từng mức thu phóng có thể không? Hoặc có thể có những cách tiếp cận tốt hơn?

Tôi đang tìm kiếm giải pháp bất khả tri về công nghệ.


2
Bạn có kế hoạch để có một khoảng cách nào đó cho khoảng cách xem tối đa không, hoặc bạn có cách nào đó để hợp nhất các điểm ở xa để bạn không phải hiển thị chúng riêng lẻ hay là các "điểm" mờ đục và được sắp xếp sao cho hầu hết chúng sẽ được ẩn từ bất kỳ quan điểm nhất định? Bởi vì nếu không có cách nào ở trên, tôi không thấy bất kỳ cách nào để ngăn người dùng tìm góc máy ảnh mà hầu hết các điểm (hoặc ít nhất là một phần đáng kể trong số đó) sẽ hiển thị cùng một lúc.
Ilmari Karonen

4
Nhân tiện, hơi kỳ lạ, nhưng bạn đã xem xét dữ liệu được tạo theo thủ tục chưa? Bạn không có lợi ích của các khu vực chế tạo tùy chỉnh, nhưng kết quả cuối cùng là nội dung dựa trên các phương trình, không phải là một lượng lớn dữ liệu. Với một số sáng tạo, điều đó có thể đơn giản hóa rất nhiều thứ (:
Alan Wolfe

1
Thu nhỏ / phóng to đối với một infinite universecó thể tương tự như theo dõi mối quan hệ giữa hai điểm trên một số đường cong Mandelbrot sau khi phóng to các mức khác nhau. Ở một mức độ nào đó, bạn có thể mất độ chính xác và không thể phân biệt chúng hoặc thậm chí định vị lại chúng.
user2338816

1
@AlanWolfe Chế tạo tùy chỉnh vẫn có thể - ví dụ điển hình là các trò chơi Frontier cũ, có vị trí ngôi sao thực sự cho khoảng 1000 sao hoặc gần nhất với Sol (bao gồm cả Sol và các hành tinh và mặt trăng thực tế của nó). Bạn chỉ cần đảm bảo rằng chúng ở những nơi không được tạo theo thủ tục và thêm chúng dưới dạng một "lớp" khác.
Luaan

@IlmariKaronen vâng, bạn nói đúng. Tôi có khoảng cách xem tối đa và tôi nghĩ rằng tôi sẽ hợp nhất các điểm khoảng cách bằng cách làm theo câu trả lời của Ming-Tang
Anvaka

Câu trả lời:


8

Điều này dựa trên suy đoán của tôi và lướt qua mã nguồn của Celestia.

Celestia cho phép bạn bay quanh một hành tinh và phóng to để xem toàn bộ thiên hà. Tôi duyệt mã nguồn của nó và thấy nó sử dụng một octree, một cấu trúc để phân chia đệ quy không gian thành 8 octant.

Trình kết xuất sẽ kết xuất môi trường bằng cách di chuyển qua quãng tám và không đi sâu vào các vật thể ở xa.

Celestia cũng theo dõi độ lớn tuyệt đối của một quãng tám, trong đó độ lớn tuyệt đối của một quãng tám dựa trên độ lớn tuyệt đối của các ngôi sao bên trong quãng tám. Nếu quãng tám ở gần nhau, Celestia biểu hiện các ngôi sao riêng lẻ và nếu quãng tám ở xa, Celestia sẽ hiển thị quãng tám là một ngôi sao có cường độ của quãng tám.

Ngoài ra, có thể có hệ thống phân cấp có ý nghĩa gắn liền với các đối tượng. Ví dụ: nếu bạn ở gần (bán kính được khai báo trong cơ sở dữ liệu) với một ngôi sao, các hành tinh của nó được hiển thị. Nếu một hành tinh đủ gần (một điểm ảnh trên màn hình), mô hình 3D của nó được vẽ.

Các trò chơi không gian khác mà tôi có thể đặt tên là Chương trình không gian quỹ đạo và Kerbal, là nguồn đóng. Tôi cũng đã xem xét Frontier Galaxy, nơi đã tạo ra bản đồ sao theo thủ tục. Có một trang web phân tích cách trò chơi hoạt động bằng cách tháo gỡ của nó: http://www.jongware.com/galax1.html


12

Có một số mảnh ghép cho câu đố này, mỗi mảnh sẽ cung cấp một lỗ thỏ khám phá sâu và thú vị. Một số trong số họ là:

  • Mức độ chi tiết - tự động (hoặc "thủ công") chọn các mô hình chi tiết hoặc đơn giản hóa, hoặc thậm chí là các họa tiết hoặc chỉ là các dấu chấm hoặc cho các đối tượng khi chúng ở xa hơn.
  • Culling - lựa chọn chỉ vẽ những gì cần thiết. Đây có thể là những gì trong lĩnh vực xem (loại bỏ bực bội), những gì không ẩn đằng sau những thứ khác (loại bỏ tắc nghẽn) hoặc các phương pháp ad hoc khác. (Câu trả lời của @Alan Wolfe mô tả một số cách tổ chức dữ liệu của bạn giúp hỗ trợ loại bỏ.)
  • Truyền phát - kéo dữ liệu thế giới từ bộ nhớ vào bộ nhớ khi cần, nếu nó không phù hợp với bộ nhớ cùng một lúc
  • Hộp bầu trời - các vật thể ở rất xa có thể được kết xuất trước trên một quả cầu ở "khoảng cách vô hạn" từ máy ảnh.

Và nước sốt bí mật của riêng bạn sẽ là sự kết hợp giữa những thứ này và các kỹ thuật khác mà bạn sử dụng và khi nào, dựa trên nhu cầu ứng dụng cụ thể của bạn.


2

Bất cứ điều gì hoặc là phân cấp và / hoặc thưa thớt sẽ giúp bạn ra khỏi đây.

Có rất nhiều không gian trống, vì vậy không phải sử dụng bộ lưu trữ để thể hiện không gian trống là điều bắt buộc. Một cách tiếp cận phân cấp điển hình sẽ giống như một cây Oct, phân chia đệ quy không gian thành 8 khối nhỏ hơn và bạn có thể lưu trữ các đối tượng trong khối nhỏ nhất mà chúng có thể chiếm hoàn toàn.

Một octree cũng khá tốt để bạn có thể truy vấn nó để xem danh sách tất cả các đối tượng trong chế độ xem, điều này sẽ cho phép bạn có được một danh sách chỉ các đối tượng nằm trong góc nhìn của bạn và không quá xa. Một giải pháp thưa thớt có thể là một cái gì đó giống như một lưới thưa thớt nơi bạn có thể hỏi thông tin về bất kỳ vị trí x, y, z nào, nhưng bạn chỉ phải lưu trữ thông tin cho các ô không có không gian trống.

Các cách tiếp cận phân cấp phổ biến khác được sử dụng bao gồm cây bsp (chúng chia không gian thành 2 nửa không gian đệ quy) cũng như cây kd tương tự.

Cá nhân tôi nghĩ rằng một quãng tám có thể là một khởi đầu tốt cho bạn, đảm bảo chỉ chia nhỏ khi cần thiết để bạn không lãng phí bộ nhớ vào không gian trống. Ngoài ra, cuối cùng bạn có thể muốn một giải pháp khác cho các đối tượng tĩnh so với các đối tượng động của bạn.

Một số giải pháp (như bsp) có thể rất hiệu quả, nhưng mất nhiều thời gian để xây dựng nên thường không phải là một lựa chọn tốt cho việc di chuyển / thay đổi đối tượng.

Hy vọng rằng sẽ giúp, cho tôi biết nếu bạn có bất kỳ câu hỏi về các chi tiết!

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.