Bản đồ địa hình / triển khai địa hình với các độ cao khác nhau của các ô lân cận


10

Ôi trời!

Tôi đang tìm kiếm một số thông tin về bản đồ ô vuông, hay đúng hơn, loại bản đồ ô vuông cụ thể được gọi là gì.

Tôi quan tâm đến loại hình triển khai được sử dụng trong ông trùm tàu ​​lượn siêu tốc, hoặc loạt trò chơi của ông trùm vận tải và đã xem xét địa hình trường vectơ và địa hình bản đồ độ cao nhưng tôi không chắc chúng phù hợp với những gì tôi đang tìm kiếm phát triển, xây dựng.

Đó là một cuộc đấu tranh để tìm thấy bất kỳ thông tin phong nha nào vì hầu hết mọi người gọi nó là bản đồ gạch đẳng cự, nhưng tôi đang tìm cách tạo ra một cái gì đó trong 3D với một phối cảnh chính tả cố định. Tôi hiểu rằng bộ lưu trữ cơ bản của bản đồ ô vuông không liên quan gì đến cách hiển thị nhưng tôi không muốn tạo bản đồ ô vuông 2D như các trò chơi pokemon / zelda cũ, hơn nữa là các dòng diablo có khả năng bao gồm vách đá nhô ra và địa hình dốc.

Tôi chỉ đang cố gắng tìm các thuật ngữ phù hợp để tìm kiếm google và stackoverflow cho các tài nguyên để giúp tôi quyết định đường dẫn nào sẽ tiếp tục.

Cho đến nay tôi đã quản lý để tạo ra một bản đồ ô cơ bản mà không sử dụng thành phần chiều cao / y được lưu trữ trong VBO và được hiển thị dưới dạng khung dây. Điều này có vẻ ổn cho đến nay nhưng tôi dự tính rằng tôi sẽ gặp phải vấn đề khi cố gắng điều khiển một đỉnh duy nhất để tạo ra các vách đá và sườn dốc mà không ảnh hưởng đến một lát gạch lân cận.

Có một loại thực hiện cụ thể mà tôi nên xem xét? Tôi nghĩ rằng tôi đã bẻ khóa nó khi tôi tìm thấy một số tiền hợp lý nếu thông tin về địa hình trường vectơ nhưng tôi không chắc điều này sẽ mang lại kết quả chính xác.

Nếu ai đó có thể làm sáng tỏ điều này cho tôi xin vui lòng, sự giúp đỡ sẽ được đánh giá rất cao :)

Cập nhật

Tôi đã bao gồm một hình ảnh để làm rõ hơn về những gì tôi muốn đạt được:

Bản đồ gạch 2.5D

Hình ảnh mượn từ Cách tạo gạch đẳng cự nghiêng (chiều cao)

Hình ảnh này cho thấy loại địa hình tôi muốn tạo nhưng không bao gồm "vách đá" hoặc các loại địa hình nhô ra mà tôi quan tâm đến việc tạo mô hình. Tuy nhiên, nó đưa ra một số câu hỏi khác mà tôi đã không xem xét, cụ thể là;

  • Làm thế nào các 'lớp' như nước (phía trên bên trái của hình ảnh) sẽ được xử lý để bao gồm mặt đất nhìn thấy bên dưới mặt nước?
  • Làm thế nào các "cạnh" của bản đồ sẽ được phục vụ để trái đất / bùn được thể hiện để mô tả thế giới như một thực thể không phẳng?
  • Có thể sử dụng kho lưu trữ bên dưới cho loại địa hình này để mô hình hóa vật lý như quả bóng lăn xuống đồi hoặc tốc độ di chuyển của người chơi khi đi qua dốc?

Tôi có một ý tưởng rằng mỗi ô của địa hình có thể được mô hình hóa với 8 đỉnh trong đó 4 đỉnh chính bao phủ chính ô đó và 4 đỉnh còn lại được sử dụng để mô hình các mặt / tường của mỗi ô. Hai vấn đề tôi thấy với việc triển khai này là a) bản đồ thế giới về cơ bản được nhân đôi kích thước và b) cho rằng không phải tất cả các ô sẽ bao gồm "các bức tường", một số ô sẽ kết thúc với các đỉnh dự phòng không được sử dụng.

Tôi muốn tạo một trình chỉnh sửa địa hình cho phép mỗi ô bị biến dạng cũng như bao gồm khả năng thay đổi địa hình trong khi chơi trò chơi. Điều này tự nó đặt ra các câu hỏi bổ sung như; VBO có thể được sử dụng để lưu trữ và hiển thị địa hình trong khi được sửa đổi khi đang bay và cũng có thể sửa đổi các đỉnh mà không ảnh hưởng đến các ô lân cận không?

Tôi có ấn tượng rằng tôi quá phức tạp hóa mọi thứ hoặc chạy vào tê liệt phân tích ở chỗ tôi đang bỏ qua việc viết bất kỳ mã nào để giải quyết vấn đề mà không có ý tưởng rõ ràng về cách tôi sẽ đạt được những gì tôi muốn.

Một lần nữa, tôi thực sự chỉ đang tìm kiếm một cú hích đúng hướng với điều này. Có một loại triển khai địa hình / địa hình cụ thể nào phục vụ cho bản đồ 3D bị biến dạng bởi cả trình chỉnh sửa bản đồ cũng như trong quá trình chơi trò chơi hay tôi phải tự xoay sở? Tôi không cố gắng phát minh lại bánh xe ở đây nhưng tôi đang vật lộn để tìm bất kỳ tài nguyên nào được cung cấp mà tôi không chắc chắn nên tìm kiếm cái gì.

Nếu bất cứ ai cũng có thể cung cấp bất kỳ thông tin, tài nguyên hoặc đoạn mã nào, điều đó sẽ được đánh giá cao vì tôi rất muốn làm bẩn tay mình và bắt đầu sản xuất một thứ gì đó không phải là khung dây phẳng mà tôi hiện có.

Cảm ơn vì đã đọc!

Câu trả lời:


2

Nếu tôi là bạn, tôi sẽ tìm hiểu về voxels, cụ thể hơn là kết xuất khối lập phương Minecraft . Không giống như chiều cao, chúng có thể xử lý phần nhô ra, hang động, tòa nhà có nhiều tầng, v.v.

Bạn sẽ lưu trữ địa hình của mình trong một dãy số nguyên 3D, trong đó các số được ánh xạ tới một loại địa hình nhất định: 0 = không khí, 1 = bụi bẩn, 2 = nước, v.v. Sau đó, để tạo lưới để kết xuất, bạn sẽ tạo các mặt của khối lập phương cho mỗi voxel không rỗng.

Hướng dẫn này là một lời giải thích tuyệt vời về cách thực hiện điều này trong C ++ bằng cách sử dụng Ogre3D. Tôi đoán bạn sẽ phải đi một chút ở cấp độ thấp hơn trong OpenGL.

Sau khi tạo các hình khối, bạn muốn làm mịn các cạnh để tạo ra loại địa hình chất lỏng hiển thị trong hình ảnh của bạn. Tôi tin rằng PolyVox (cũng trong C ++) thực hiện điều này; bạn có thể xem mã của họ. Tôi nghĩ rằng về cơ bản bạn làm trong 3D những gì hình ảnh hiển thị trong 2D: trung bình các vị trí khối lập phương xung quanh để biết nơi đặt từng đỉnh.

BIÊN TẬP:

  • Tạo các mặt cho các hình khối liền kề với nước như thể gạch nước trống rỗng, và làm cho mặt nước trong suốt.
  • Các khuôn mặt trên "cạnh" có thể được tạo ra giống như các khuôn mặt thông thường, nếu bạn coi các voxels bên ngoài thế giới là trống rỗng.
  • Vật lý: Bạn có thể có thể cung cấp lưới kết xuất cho động cơ vật lý của bạn dưới dạng một đối tượng tĩnh.
  • Trình chỉnh sửa bản đồ: Bạn muốn chỉnh sửa dữ liệu voxel bên dưới, chứ không phải bản thân lưới! (Lưới sẽ phản chiếu dữ liệu, vì vậy việc chỉnh sửa các voxels sẽ tạo ra các thay đổi trong lưới của bạn.) Bạn có thể muốn tra cứu Model, View, Controller (MVC) nếu bạn không quen với nó.

Nếu bạn có nhiều câu hỏi, hãy để lại nhận xét. Chào mừng bạn đến với gamedev.SE!


Đây là một giải pháp rất phức tạp mà đối với một vấn đề tương đối đơn giản. Rất nhiều trò chơi đã làm những gì OP yêu cầu mà không có sự phức tạp của voxels.
Sean Middleditch

Tôi đồng ý voxels có thể phức tạp. Bạn vui lòng liên kết đến những trò chơi này? Tôi muốn nghe làm thế nào họ làm điều đó.
Wackidev

Tôi đã chơi với ý tưởng sử dụng voxels. Việc thực hiện này có nghĩa là tất cả các khối đều có kích thước đơn vị, hoặc một khối có thể được đùn ra không? Tôi đoán rằng thế giới sẽ cần phải được lưu trữ trong các lớp để cho phép nước và các loại gạch khác có thể "chồng chéo" dọc theo mặt phẳng y.
CaptainRedmuff

Có, thông thường voxels có kích thước đơn vị. Tôi cho rằng người ta có thể đùn chúng, nhưng tôi nghĩ điều đó sẽ khiến nó phức tạp hơn. Tôi không chắc là tôi hiểu ý của bạn về các lớp. Bạn đang đề cập đến gạch nước có chiều cao thay đổi?
Wackidev

Một cái gì đó dọc theo những dòng. Tôi đã suy nghĩ nhiều hơn về việc chỉ định nghĩa một "tầng" có thể là một khối lập phương mà sau đó có một khối nước trên đỉnh được xác định bởi mặt phẳng nơi hai giao điểm. Có lẽ tôi đang phức tạp hóa mọi thứ một lần nữa. Tôi sẽ đọc thêm về voxels và xem nơi dẫn tôi đến.
CaptainRedmuff

6

Đây: http://30.media.tumblr.com/tumblr_m06qv6OREt1r2qjpao1_500.png là một ví dụ về bản đồ tôi đã thực hiện cách đây một thời gian.

Tôi đã có một XML đại diện cho bản đồ và các loại gạch khác nhau. Mỗi loại sẽ có một vài thuộc tính:

  • Chiều cao
  • Chức vụ
  • Loại hợp nhất: Loại hợp nhất ô này sẽ làm gì, ALL(nếu nó nên hợp nhất với bất kỳ ô nào xung quanh nó), EQUAL(chỉ hợp nhất với các ô cùng loại), NONE(không bao giờ hợp nhất).
  • Hợp nhất chiều cao: Chiều cao tối đa cho độ dốc (tốt cho phần nhô ra), giả sử bạn muốn một ô chỉ hợp nhất với các ô có cùng chiều cao hoặc chênh lệch 1, giá trị sẽ là một.

Sau đó tôi sẽ đọc tất cả các ô và tạo chúng trong cảnh. Đầu tiên chỉ tính đến vị trí. Mỗi ô phải biết nó là hàng xóm nên tôi phải đi qua bản đồ hai lần, một lần để tạo mọi thứ và một lần nữa để di chuyển từng đỉnh đến đúng vị trí.

Mặc dù các mô hình của tôi là hình lục giác, nhưng khái niệm này giống nhau, bạn sẽ cần một khối lập phương để biểu diễn cho khối của mình, sau đó bạn sẽ di chuyển các đỉnh cơ sở xuống mức thấp nhất và 'làm mịn' đỉnh của khối lập phương với các khối xung quanh nó. Bạn cũng sẽ kiểm tra xem hai mặt của hình khối có được hợp nhất hay không để bạn có thể loại bỏ mặt đó khỏi khối lập phương (nếu chúng không được hợp nhất thì đó có thể là một vách đá hoặc thứ gì đó).

Về vật lý, phụ thuộc vào mục tiêu của bạn. Nếu bạn đang làm một cái gì đó như ông trùm tàu ​​lượn siêu tốc, bạn không thực sự cần chúng. Bạn chỉ có thể kiểm tra chiều cao của người chơi giữa mỗi ô và quyết định tốc độ đi bộ. Bạn có thể làm tương tự cho một vật thể tự di chuyển (như quả bóng), bạn có thể kiểm tra các viên gạch xung quanh (hoặc góc gạch hiện tại) và quyết định hướng / tốc độ. Nếu bạn cần vật lý thực tế (như trọng lực, ma sát, v.v.), bạn sẽ phải sử dụng một công cụ vật lý và bạn có thể sử dụng biểu diễn 3D khối trong động cơ.

Các lớp cũng có thể, nhưng bạn sẽ cần một cái gì đó giống như minecraft (với việc làm mịn trên các hình khối ở lớp cao nhất). Nếu bạn chỉ cần các lớp cho nước, bạn có thể có "suối nước" trên một ô và mã của bạn sẽ lấp đầy mọi khoảng trống xung quanh nó ở cùng độ cao hoặc thấp hơn (một giải pháp đệ quy sẽ phù hợp ở đây).

Trình chỉnh sửa địa hình cũng sẽ đơn giản, nếu mã của bạn đủ linh hoạt, bạn có thể áp dụng các phép biến đổi cho một ô riêng lẻ (một ô bạn đang thay đổi) hoặc cho một danh sách các ô (nếu bạn đang sử dụng 'cọ' để chọn và di chuyển chúng). Mã tương tự có thể được sử dụng để sửa đổi địa hình trên trò chơi. Và vâng, bạn có thể thay đổi các đỉnh trên VBO, bạn cũng có thể thay đổi các đỉnh mà không ảnh hưởng đến các đỉnh khác (điều này cũng phụ thuộc vào bạn mã hóa như vậy).


+1 Cảm ơn bạn đã đóng góp cho việc này. Bạn nêu lên một điểm tốt về việc xếp lớp liên quan đến "suối nước" mà tôi chưa từng xem xét trước đây. Bây giờ tôi sẽ xem xét sửa đổi VBO khi tôi biết điều đó có thể xảy ra :)
CaptainRedmuff
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.