Làm thế nào là động cơ địa hình voxel được thực hiện?


53

Vài ngày trước tôi đã tìm thấy một thứ gọi là địa hình voxel và tôi nghĩ rằng chúng khá tuyệt. Nhưng tôi không biết bất cứ điều gì tạo ra chúng. Bạn có mô hình hóa nó trong phần mềm mô hình hóa của bạn hoặc sử dụng một cái gì đó như một sơ đồ chiều cao? Tôi đọc trên wikipedia rằng voxels giống như pixel 3d hoặc pixel thể tích.

Sau khi tôi tạo địa hình voxel, làm thế nào tôi có thể lấy những voxel này và làm cho chúng có thể bị phá hủy / có thể đào được ?


Tôi sẽ chọn câu trả lời tốt nhất dựa trên:

  1. mã và thuật toán. tốt nhất là dựa trên C #
  2. giải thích. Tôi là người mới bắt đầu với các thuật toán nhưng tôi rất quen thuộc với lập trình hướng đối tượng
  3. từng bước trình diễn. Không chỉ khái niệm mà còn định hướng.
  4. sơ đồ / hình minh họa. Không, không phải ảnh chụp màn hình của các động cơ khác.


Tôi biết rằng đây là một chủ đề phức tạp. Nhưng, cảm ơn vì sự giúp đỡ!

Không, tôi không cố tạo một bản sao minecraft.


Biên tập

Cảm ơn tất cả mọi người vì sự giúp đỡ tuyệt vời của bạn (đặc biệt là Nick Wiggill)! Đây là những gì tôi quản lý để thực hiện (Công việc đang tiến triển).


[đoàn kết] và C ? Điều đó ... có ý nghĩa rất nhỏ.
Martin Sojka

Tôi hiểu C.
Daniel Pendergast

8
Bạn có rất nhiều niềm tin vào cộng đồng với một yêu cầu táo bạo như vậy. Ý tôi là, một bài báo hoàn chỉnh về địa hình voxel hoàn toàn năng động cho phần cứng ngày nay với FPS tốt, nó sẽ dễ dàng, phải không? Chà, chủ đề rất rộng và khó, tôi nghi ngờ bạn sẽ thấy một giải pháp chung chung và thậm chí sau đó, nó có thể hoàn toàn vô dụng đối với trường hợp của bạn. Nhưng ai biết được, nó có thể được thực hiện tùy thuộc vào mô hình vai trò của bạn. Bạn có muốn một địa hình voxel Crysis 2 hoặc Delta Force one không? Có lẽ bạn đang thực hiện một bản sao Minecraft hoặc chỉ cần một mô phỏng cát cho một trò chơi đào? Xác định một phạm vi, xin vui lòng.
EnoughTea

2
Kiểm tra phần mềm trung gian này: forum.unity3d.com/threads/ . Đặc biệt là bản demo
Tetrad

1
GPU Gems 3 có một chương về địa hình voxel: http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html
Tamschi

Câu trả lời:


58

Để tạo địa hình voxel

(a) Phương pháp phổ biến là tạo sơ đồ chiều cao bằng nhiễu Perlin. Một sơ đồ chiều cao về cơ bản là một hình ảnh đơn sắc đại diện cho các độ cao khác nhau bởi độ tối hoặc độ sáng của các pixel của nó.

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

Bạn sẽ xem xét từng pixel trong sơ đồ chiều cao này để tạo ra "ngăn xếp" các voxels lên đến các độ cao khác nhau (trục z) ở các vị trí (x, y) khác nhau, theo độ sáng của pixel đó trong hình ảnh chiều cao. Bởi vì hình ảnh nhiễu Perlin rất mịn (không có cạnh sắc nét với ánh sáng so với bóng tối), kết quả là bạn sẽ có địa hình cuộn trơn tru.

(b) Bạn có thể xây dựng nó tăng dần bằng cách tạo cảnh quan ra khỏi các khối đa diện khác nhau. Tạo một hình dạng vectơ đa diện gần đúng với hình dạng voxel bạn muốn. Sử dụng bất kỳ phương pháp đa điểm 3D nào (thường xuyên nhất là điểm trong lồi), kiểm tra điểm nào của lưới thế giới của bạn nằm trong khối đa diện đó. Ví dụ, xác định một kim tự tháp trong không gian. Sau khi kiểm tra mọi điểm trong khu vực địa phương trong không gian thế giới của bạn theo khối lượng hình chóp đó, bạn sẽ biết điểm nào nằm trong đó và bạn có thể đặt các ô đó là "hiện tại" nghĩa là chúng trở thành voxels chứ không phải là không gian trống. Bây giờ bạn có một kim tự tháp voxel trong không gian của bạn. Bạn có thể tiếp tục thêm các hình dạng của bất kỳ loại nào với nhau, theo cách này, cho đến khi bạn đã tạo thành một địa hình.

(c) (Thực sự giống như b ) Viết một công cụ mô hình hóa. Voxatron cho thấy điều này sẽ trông như thế nào. Đây chỉ là tạo các hình thức voxel trong một thế giới thay thế (trình chỉnh sửa) và sau đó nhập chúng vào thế giới trò chơi thời gian chạy thực tế của bạn. Tôi tin rằng Voxlap đã có trình soạn thảo mã nguồn mở đầu tiên cho voxels. Bạn có thể đặt các voxels riêng lẻ hoặc bạn có thể sử dụng một "bàn chải" voxel với các hình dạng / khối lượng khác nhau để vẽ các voxels vào thế giới của bạn.


Những gì bạn sẽ cần để xây dựng trò chơi dựa trên voxel của riêng bạn

Tôi bao gồm phần này bởi vì con đường voxel không phải là một con đường dễ dàng, ít nhất là không phải hiện tại. Gần đây, rất nhiều nghiên cứu một lần nữa được đưa vào các động cơ voxel bởi những người chơi lớn, hướng tới các ứng dụng kết xuất và vật lý.

Đơn giản có thể là một vấn đề, bởi vì việc xây dựng một thế giới từ các voxels thô là một cách tiếp cận thủ tục để xây dựng thế giới và điều này vốn không đơn giản . Xin lỗi, sẽ có một vài thuật ngữ kỹ thuật ở đây. Viết một công cụ voxel là một công việc khá nghiêm túc và đòi hỏi kiến ​​thức về nhiều lĩnh vực phát triển công cụ trò chơi, đặc biệt là về các khái niệm không gian và điều này có nghĩa là hiểu toán học vectơ 3D, ma trận và tính toán cơ bản ở mức độ hợp lý.

Phải nói rằng, "thế hệ địa hình voxel" của bạn đòi hỏi một bối cảnh để hoạt động, vì động cơ voxel không thực sự phổ biến rộng rãi. Hãy tiến hành mô tả cơ bản về cách thức hoạt động của động cơ voxel.

Voxels là các khối xây dựng cơ bản của thế giới của bạn. Vị trí của chúng được xác định bởi lưới 3D (mảng) được lập chỉ mục số nguyên thay vì không gian dấu phẩy động liên tục (như được sử dụng trong các trò chơi 3D dựa trên vectơ). Đây sẽ là những "nguyên tử" trong thế giới của bạn. Chúng có thể cao 3 feet như trong các trò chơi như Minecraft, hoặc chúng có thể nhỏ hơn mắt nhân vật ảo của bạn thực sự có thể nhìn thấy, trừ khi được nhóm lại với nhau với số lượng lớn - giống như một số phân tử. Có hai loại:

  • Voxels dựa trên lưới hình khối ( ví dụ ) - đây là một loại mới hơn, được sử dụng để đơn giản và dễ sử dụng kết hợp với công nghệ đồ họa hiện đại. Được sử dụng trong các trò chơi như MineCrat và Dungeon Keeper.
  • Điểm voxels ( ví dụ , ví dụ ) - voxel gốc. Mỗi cái là một điểm riêng biệt, có thể va chạm trong không gian, mặc dù nó có thể được bao quanh bởi một thể tích giới hạn hình cầu. Chúng đơn giản hơn, vì vậy bạn có thể có nhiều hơn chúng trong thế giới của mình và do đó bạn có thể làm cho chúng nhỏ hơn, điều này thường thuận lợi. Hai trò chơi đã sử dụng chúng là Comanche và những năm 1990 được làm lại từ Lords of Midnight.

Dù bằng cách nào, cách tiếp cận của bạn để thao túng voxels trong thế giới của bạn cũng giống như sau.

Để xây dựng và di chuyển các đối tượng trong thế giới của bạn, bạn sẽ cần các công cụ toán học được đề cập ở trên. Ví dụ: để tạo một bức tường: Xây dựng một hộp có kích thước phù hợp trong không gian 3D, sử dụng các vectơ. Sử dụng toán học ma trận để biến đổi hộp của bạn thành góc quay và vị trí bạn mong muốn trong thế giới 3d của bạn (trong không gian vectơ liên tục). Đối với động cơ voxel, bước bổ sung bây giờ là sử dụng thuật toán điểm đa diện 3D để xác định voxels nào của bạn nằm trong không gian xoay đó.

Về cơ bản, đây là cách bạn sẽ xây dựng hầu hết các đối tượng trong thế giới của mình. Ngoài ra, bạn có thể viết các công cụ của riêng mình để "mô hình hóa" một nhân vật theo cách bạn có thể nói, Maya hoặc 3DS Max. Nhưng vì bạn đang mô hình hóa nhân vật của bạn ra khỏi voxels thay vì các điểm, cạnh và khuôn mặt, nên các phương pháp của bạn sẽ khác nhau đáng kể. Nếu bạn quyết định sau đó xoay các đối tượng này trong thế giới của mình, bạn sẽ cần sử dụng tương tự các phép biến đổi ma trận để làm như vậy.

Địa hình có thể phá hủy đơn giản như là loại bỏ một voxel tại một thời điểm theo một số phương pháp bạn chọn hoặc sử dụng các thao tác CSG (Cấu trúc hình khối rắn) trên khối lượng lớn các voxels để loại bỏ chúng theo một số lượng được xác định trước; ví dụ, nếu bắn chùm tia laser xuyên qua tảng đá, bạn có thể sử dụng một thể tích hình trụ để trừ đi các voxels ở đây chùm tia đang bắn xuyên qua tảng đá. CSG là một quy trình tương đối đơn giản bằng cách sử dụng các lưới không gian 3D tạo thành thế giới voxel của bạn và kiểm tra mọi ô trong một phần của lưới cơ sở (trong trường hợp này là đá) đối với lưới khác (trong trường hợp này là tia laser)

Để có "dòng chảy" vật chất (như Vigil đã gợi ý trong nhận xét về cát), bạn sẽ cần xem xét động lực học chất lỏng và automata di động. Chúng được sử dụng bởi tác giả của Pháo đài lùn, Tarn Adams, trong đó về cơ bản cũng là một thế giới voxel (mặc dù các voxels lớn hơn nhiều trong trường hợp này, có thể so sánh với Dungeon Keeper, nguyên tắc vẫn giữ nguyên). Đây là những chủ đề tiên tiến và không cần thiết cho động cơ voxel như được định nghĩa, vì vậy tôi sẽ để nó như một "cuống" cho nghiên cứu của riêng bạn.

CSG và động lực học chất lỏng mang lại cho tôi, cuối cùng, để tối ưu hóa. Các động cơ Voxel hiện đang được phát triển hầu như chỉ sử dụng các voxel octrees (SVOs) thưa thớt, là một phương pháp phân chia không gian voxel thành các độ phân giải khác nhau, bằng chứng trong video này cho thấy động cơ Atomontage sắp tới. Sử dụng octrees / SVO là cần thiết hơn là một lựa chọn tối ưu hóa, bởi vì các chi phí xử lý liên quan đến việc xử lý một lưới đồng nhất, lớn. Một octree về cơ bản là một cây (biểu đồ chu kỳ có hướng) trong đó mỗi nút có 8 hoặc các nút con tùy thuộc vào không gian mà nó đại diện có chứa bất kỳ khối lượng vật lý nào không. Các sơ đồ cho thấy không gian chia nhỏ quãng tám để tạo thành voxels ở đây .

Việc triển khai voxel mã nguồn mở tốt nhất mà tôi biết là Voxlap Engine của Ken Silverman , được sử dụng cho Voxelstein3D. Nó được viết bằng C ++ và thực hiện các hoạt động CSG cho biến dạng địa hình.


Thay đổi wiki cộng đồng là vĩnh viễn, không có cách nào để đảo ngược nó. Bạn sẽ cần phải xóa và tạo lại câu trả lời của mình (tất nhiên là hy sinh số phiếu hiện có của bạn)
Jesse Dorsey

meta.stackexchange.com/questions/2974/ người yêu cầu bồi thường có thể xóa nó. Mặc dù vậy, không biết mọi thứ đã thay đổi. Cảm ơn đã xem xét một trong hai cách.
Kỹ sư

1
Đi con số, cẩn thận lần sau.
Jesse Dorsey

2
Cái trước là một không gian rời rạc, nơi các thực thể chỉ có thể nằm trực tiếp trên một tế bào. Giống như các quân cờ được đặt hoàn hảo trên bàn cờ, chúng không thể nằm "giữa" các ô hoặc chồng lên các đường viền. Trong khi đó, một không gian liên tục được tìm thấy trong hầu hết các động cơ vật lý, tức là nó dựa trên các số dấu phẩy động và do đó liên tục chứ không phải là lượng tử. Thực thể của bạn có thể ngồi ở bất kỳ vị trí tùy ý nào trong không gian bạn chọn - giống như trong cuộc sống thực.
Kỹ sư

1
Hoạ tiết là ngầm. Voxels thực, cho dù dựa trên lưới hay không, mỗi cái có một màu tinh khiết. Các cách tiếp cận đã nói ở trên chỉ tạo chi tiết thực tế hơn và cho phép cách tiếp cận kết hợp lưới (google Unity VoxelForm). Voxels của bạn càng mịn, chi tiết kết cấu của bạn càng mịn. Ví dụ: mô hình một lòng sông như đá (màu xám). Chuyển đổi mọi pixel trong khoảng cách x của bề mặt, thành cát, bằng cách đặt các voxels này thành vật liệu = "cát"; sau đó chúng có thể được kết xuất thành màu cát. Ngoài ra, điều này cũng có thể ảnh hưởng đến khả năng tương tác vật lý của chúng, do đó cát có thể bị di chuyển bởi nước hoặc đào đi.
Kỹ sư

33

Cách tốt nhất để tạo địa hình voxel thú vị là với bản đồ mật độ tiếng ồn Perlin. Thay vì sử dụng bản đồ tiếng ồn Perlin 2D xác định chiều cao của thế giới 3D, hãy sử dụng bản đồ tiếng ồn Perlin 3D. Cân trọng bản đồ sao cho các giá trị gần phía dưới sẽ có nhiều khả năng vững chắc hơn và các giá trị gần với đỉnh nhất chắc chắn sẽ là không khí. Điều này mang lại chiều cao thế giới của bạn, nhưng cũng cho phép nhô ra và hang động, tương tự như địa hình Minecraft , vì hình ảnh bên này của một lát địa hình cho thấy:

Thế giới với phần nhô ra

Từ đây, bạn có thể kiểm tra các đảo nổi hoặc thêm hệ thống hang động bằng tiếng ồn fractal:

Thế giới với hệ thống hang động

Những hình ảnh trên và ý tưởng hệ thống hang động là từ bài viết blog tuyệt vời này . Bạn có thể tìm hiểu tất cả về tiếng ồn Perlin ở đây và có một số mã mẫu để giúp bạn bắt đầu ở đây .


4

Các câu trả lời khác ở đây là tuyệt vời, nhưng tôi đã thực hiện một cách tiếp cận hơi khác.

Tôi tạo một môi trường trong một công cụ mô hình hóa (3DSMAX) và xây dựng một quãng tám thưa thớt từ nó. Mỗi nút lá hình khối, không trống là một voxel. Tại thời điểm kết xuất, tôi sử dụng raycasting (được triển khai trong HLSL) để tìm voxel chiếm pixel nào và đặt pixel thành màu được lưu trong nút, mà tôi đã tính khi tạo cây bằng cách lấy trung bình các giá trị kết cấu từ mô hình nguồn.

Điều này mang lại cho bạn rất nhiều lợi ích tốt đẹp - phát hiện va chạm cho LOD miễn phí, biến đổi, xem loại bỏ không gian, v.v. - và, ngoài raycaster - rất dễ thực hiện.

Thật không may, gần như không thể đăng mã mẫu từ điện thoại.


+1 cho một sự thay thế. Mặc dù không thể thực hiện với hiệu suất hợp lý, nhưng ưu điểm vượt xa các nhược điểm. Voxel raytracing gây áp lực rất lớn cho GPU. Số học và điều kiện cần thiết cho việc này rất tốn kém, khi những chu kỳ GPU tương tự có thể được áp dụng một số hiệu ứng không gian màn hình ấn tượng, ví dụ. SSAO. Vấn đề lớn nhất là việc phát sóng trông tốt nhất với nhiều lần nảy như phát xạ - không khả thi đối với cảnh bao gồm hàng triệu hoặc hàng tỷ voxels và trong đó mỗi phân đoạn tia phải nỗ lực đáng kể để nảy và kết hợp.
Kỹ sư

... Đây là lý do tại sao tôi chỉ đề cập đến việc phát tia scaline như là một phần trong câu trả lời của tôi (VoxLap) - thậm chí rất khó để thực hiện tốt. Nếu bạn có thể làm cho cách tiếp cận đường quét dọc hoạt động, chi phí là một mức độ nhỏ hơn so với phương pháp quét tia trên mỗi pixel, vì bạn đã giảm tính chiều của quá trình kết xuất từ ​​3D sang 2D. Cách tiếp cận này tôi vẫn đứng, mặc dù nó loại trừ các giải pháp chiếu sáng phức tạp có thể với RTRT truyền thống của bạn.
Kỹ sư
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.