Vượt qua giới hạn nổi cho các thế giới có kích thước hành tinh trong Unity


8

Theo như tôi biết, việc đi xa hơn 1 triệu đơn vị từ nguồn gốc thế giới trong Unity là khó có thể do các vấn đề chính xác về dấu phẩy động.

Tạo ra một thế giới có bán kính hơn 1 triệu đơn vị sẽ yêu cầu sử dụng bình doublecho tọa độ hoặc sử dụng một số kỹ thuật phân chia không gian để phân chia một cảnh lớn thành các khối phân cấp với số lượng nhỏ nhất là khoảng 10 000 đơn vị, tức là mỗi vị trí trong không gian thế giới sẽ được thể hiện bởi hệ thống phân cấp khối của đối tượng và một loạt các floatvars đại diện cho vị trí cục bộ của nó (và có thể xoay và chia tỷ lệ) bên trong khối cuối cùng.

Dù bằng cách nào, làm điều này sẽ yêu cầu thực hiện một hệ tọa độ hoàn toàn mới, vì vậy tôi muốn biết liệu Unity có khả thi hay không, và nếu vậy, làm thế nào tôi có thể làm cho nó hoạt động với các hệ thống Unity hiện tại như vật lý, v.v.

Tái bút: Tôi không thể chuyển thế giới thành nguồn gốc khi người chơi di chuyển vì tôi muốn mọi thứ diễn ra đồng thời trên khắp hành tinh.

Cảm ơn!

Câu trả lời:


5

Bạn đang suy nghĩ trong điều kiện rất tĩnh.

Chỉ vì một đối tượng cách xa nửa thế giới không cần phải có bất kỳ vấn đề nào. Nếu tọa độ thực thể được lưu trữ tương đối với chunk chứ không phải liên quan đến thế giới, điều này là không đáng để đạt được. Chào mừng bạn đến với cách bạn phải làm điều đó nếu bạn đang viết một thế giới voxel bằng mã gốc.

Vì vậy, hãy giả sử một khái niệm gọi là địa phương . Đó là một tập hợp các khối gần nhau. Vấn đề là không gian nổi bên trong của một địa điểm nhất định không bao giờ vượt quá giới hạn an toàn. Bạn cần xác định địa điểm xử lý rời rạc của mình là gì, bắt đầu bằng cách lấy tất cả các khối nằm trong bán kính của vị trí của thực thể n (có thể là trình phát hoặc thứ gì khác). Trong công cụ hiện tại của tôi, tôi đảm bảo rằng nếu thậm chí một đoạn của hai địa điểm khác nhau trùng nhau, thì các địa điểm đó hợp nhất thành một địa điểm / tập hợp các khối duy nhất. Điều này đảm bảo rằng bạn không bao giờ xử lý tất cả các thực thể trong bất kỳ khối nào nhiều hơn một lần, trong một khung nhất định.

Bây giờ bạn có bộ cục bộ / khối, bạn có thể thực hiện logic trò chơi trên chúng và nội dung của chúng. Và không quan trọng họ cách người chơi bao xa hoặc từ nguồn gốc. Điều quan trọng là bạn có được một đoạn gần như trung tâm của mỗi bộ, coi đó là nguồn gốc tức là float[0,0,0.0,0,0] và làm việc theo cách của bạn từ đó. Với phạm vi xem điển hình trong một trò chơi, tôi đảm bảo với bạn rằng bạn sẽ không bao giờ cần phải nhìn xa hơn một vài km, điều này rất khả thi float, không có vấn đề nghiêm trọng.

Ngoài Unity, một lựa chọn là viết một công cụ từ đầu, tôi đoán và sử dụng một cái gì đó như libfixmath, nơi bạn vẫn có thể sử dụng dấu thập phân nhưng vì chúng không nổi , nên chúng sẽ không bao giờ gặp phải các vấn đề chính xác này. Nhưng tôi đảm bảo bạn sẽ cần chunk và địa phương vì những lý do khác, vì vậy nó có thể không đáng nỗ lực.


Bạn nói rằng tôi sẽ không bao giờ cần phải nhìn xa hơn một vài km, nhưng còn một thế giới có kích cỡ hành tinh, mà tôi có thể quan sát đầy đủ từ không gian (nhìn ra ngoài ) thì sao?
Maks Maisak

@MaksimMaisak Logic trò chơi đòi hỏi độ chính xác bằng số; kết xuất không. Bạn sẽ không bao giờ cần phải nhìn thế giới chi tiết, chính xác từ ngoài vũ trụ. Có một độ cao nhất định mà bạn có thể chuyển từ hệ thống chính xác, trên mặt đất mà tôi đã mô tả ở trên, sang chế độ không gian chính xác, không gian chính xác, liền mạch (nếu bạn chơi đúng thẻ của mình). Nhưng hãy nhớ rằng có một sự khác biệt giữa kết xuất và logic trò chơi.
Kỹ sư

Và làm thế nào để bạn phân chia không gian thành khối? Bạn có bắt đầu với các khối và nhóm chúng thành các địa phương, hoặc bắt đầu với các địa phương và chia thành các khối?
Maks Maisak

Bạn bắt đầu với chunk. "Locales" ở đây chỉ có nghĩa là "vùng lân cận", vì vậy khái niệm chunk là điều kiện tiên quyết.
Kỹ sư

Làm thế nào một đoạn có thể 'chồng chéo' sau đó?
Maks Maisak

6

Đó là một câu hỏi thường xuyên bật lên. Tôi sẽ tự do chuyển tiếp bạn đến một câu trả lời khá chi tiết khác mà tôi đã đưa ra cho cùng một vấn đề, thay vì chỉ lặp lại ở đây: Có thể có một hệ thống tọa độ tùy chỉnh trong Unity

Từ đó, điều tôi muốn đề xuất nhất là bạn đọc bài báo tuyệt vời tại: http://citeseerx.ist.psu.edu/viewdoc/doad?doi=10.1.1.471.7201&rep=rep1&type=pdf . Nó so sánh một số cách để giải quyết vấn đề mà bạn mô tả (bao gồm cả tọa độ cục bộ, như được mô tả bởi Kỹ sư Arcane trong câu trả lời của ông) và đi vào chi tiết về giải pháp nguồn gốc nổi nổi hiện nay. Trên thực tế, đó là những gì tôi sẽ làm trong hầu hết các trường hợp (thực tế, đó là những gì tôi đang sử dụng trong ứng dụng của mình).

Chắc chắn, bạn đã đề cập đến giải pháp nguồn gốc nổi không phù hợp với nhu cầu của bạn. Nhưng đó có thể không phải là trường hợp ngay cả khi bạn muốn mọi thứ tiếp tục xảy ra ở những nơi rất xa trên thế giới. Bạn có thể có khá nhiều AI xảy ra bất cứ nơi nào bạn muốn - bạn không nên thực hiện kiểm tra va chạm hoặc định vị chính xác quá xa người chơi (tức là vượt quá ngưỡng không chính xác nổi). Nhưng dù sao, thành thật mà nói, trong các ứng dụng thực tế, có lẽ bạn sẽ không bao giờ có thể có nhiều va chạm và định vị trong một trò chơi do hạn chế xử lý. Tuy nhiên, vẫn có thể có các giải pháp ngay cả giới hạn mà bạn thấy trên giải pháp nguồn gốc nổi, tùy thuộc vào đặc điểm của trò chơi của bạn. Một lần nữa, tôi khuyên bạn không nên loại bỏ giải pháp đó trước khi đọc kỹ hơn về nó.

Tuy nhiên, nếu bạn quyết định rằng bạn nên thử các hệ tọa độ cục bộ (có thể trở thành một giải pháp khá phức tạp tùy thuộc vào nơi bạn đi với nó), thì mục thứ hai trong câu trả lời được liên kết của tôi là dành cho bạn. Phần quan trọng nhất là bài báo được viết bởi anh chàng lần đầu tiên thực hiện giải pháp đó trong trò chơi tiên phong Dungeon Siege: http://scottbilas.com/files/2003/gdc_san_jose/continupt_world_apers.pdf

Cũng có một video từ một vài năm trước, nơi mọi người từ Unity bình luận về giải pháp đó và thậm chí giải thích một triển khai hiện đại của khái niệm này trong Unity:

https://www.youtube.com/watch?v=VKWvAuTGVrQ

Hy vọng nó giúp.


3

Không chắc chắn nếu bạn đã giải quyết một giải pháp, nhưng tôi muốn đề cập đến hai tài nguyên khác có thể hữu ích cho bạn và những người đọc khác trong tương lai.

  • Cuộc nói chuyện gần đây của CppCon này: "Làm sáng tỏ Điểm nổi" , rất phù hợp bất kể ngôn ngữ lập trình. Một điểm rất thú vị được trình bày về độ chính xác là điểm ngọt của độ chính xác nổi nằm giữa phạm vi [-1, + 1]. Vì vậy, phao bình thường là cách tốt nhất để đi nếu bạn có thể sử dụng chúng.

  • Một nơi khác mà bạn có thể muốn xem xét để có một số ý tưởng là trong trò chơi Dungeon Siege cổ điển . Trò chơi đã sử dụng một hệ thống thế giới liên tục dựa trên nút / gạch và mọi vị trí đều liên quan đến nút hiện tại. Có mô tả rất chi tiết về hệ thống được trò chơi sử dụng trong whitepaper này . Tôi cũng đã viết một vài đoạn về nó trong blog của tôi . Thiết lập này là mới lạ vào thời điểm đó, nhưng có lẽ không hữu ích như ngày nay, bài báo được liên kết ở trên đề cập đến một vài vấn đề họ gặp phải. Tuy nhiên, thật thú vị từ góc độ lịch sử và vẫn có thể phục vụ bạn như một nguồn ý tưởng và cảm hứ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.