Các trò chơi vector (Wireframe, Elite-like) lý thuyết và triển khai?


7

Tôi rất thú vị khi biết thêm về cách các trò chơi vectơ như EliteStar Wars Atari được xây dựng từ căn cứ. Câu hỏi không phải là làm thế nào để triển khai đồ họa vector với các API 3D hiện đại như OpenGL và DirectX, vì thực hiện nó khá dễ dàng và không cần phải xây dựng hệ thống vectơ / ma trận từ đầu như những trò chơi đã làm.

Một số điều tôi đoán về các trò chơi này:

  • Chúng hoạt động ở mức cực kỳ thấp và được viết bằng ASM
  • Chúng là những trò chơi 3D thực tế và không giả mạo như After burner. Không giống như Wolfenstein 3D. Afterburner đã sử dụng các hiệu ứng rotozoom / raster và Wolfenstein 3D đã sử dụng tính năng phát sóng và chia tỷ lệ 2D và nó không thực sự là 3D, vì bạn không thể di chuyển lên. Ngay cả khi bạn có thể thích Build Engine mà Duke Nukem 3D đã sử dụng, mọi thứ ngoại trừ các bức tường chỉ là một sprite. Star Fox gần gũi hơn với nó, vì sử dụng các mô hình 3D thực tế, nhưng việc triển khai sử dụng chip Super-FX của SNES và có thể sử dụng mánh khóe quét. Tôi biết Elite có thể cũng sử dụng thủ thuật quét quét (ít nhất là trên một số triển khai như Elite NES) nhưng tôi không chắc chắn về SWA, vì nó đã sử dụng máy arcade được xây dựng tùy chỉnh; dù bằng cách nào, tôi muốn biết thêm về nó.
  • Mô hình 3D của họ là mô hình 3D thực tế. Chúng được định nghĩa là vectơ và biến đổi theo vị trí của máy ảnh.

Tôi biết điều tốt nhất nên làm là tháo rời nguồn Elite và xem cách mọi thứ được thực hiện bởi chính tôi nhưng trước khi làm điều đó tôi muốn biết thêm về cách chúng được tạo ra và nếu có các dự án nguồn mở hiện đại thể hiện các kỹ thuật tương tự . Tôi không có nghĩa là các bản làm lại ưu tú như Oolite (sử dụng OpenGL và Obj-C) nhưng các dự án sử dụng các kỹ thuật tương tự và tránh sử dụng trực tiếp các API như OpenGL - mặc dù không nhất thiết phải sử dụng thư viện 2D như SDL (không có OGL) nên là đủ, ít nhất là bây giờ

Tôi biết rằng mã nguồn của MESA3D có thể chứa nhiều thói quen mà các trò chơi như Elite và SWA đã thực hiện - tôi chỉ muốn nhìn thấy chúng trong bối cảnh của một trò chơi. Tôi biết rằng những gì Elite và SWA về cơ bản đã làm là triển khai Rasterisation, tạo định dạng của chúng cho các mô hình và trình tải (Tôi khá chắc chắn rằng ít nhất SWA đã có các mô hình được xây dựng từ các nhà tạo mô hình bằng cách sử dụng các công cụ, mặc dù không thể mã hóa máy bay chiến đấu TIE thật khó để làm điều đó một cách chính xác) và nhiều điều khác mà tôi có thể không biết. Nhưng nó thực sự tốn thời gian để vào và tôi không quan tâm đến nhiều thứ trong đó. Hãy nhớ rằng các trò chơi như Elite rất nhẹ do ROM và RAM thấp mà máy tính và máy chơi game có tại thời điểm đó.

Tôi chưa quen với đồ họa 3D và tất cả các giả định của tôi đều dựa trên kiến ​​thức hạn chế của tôi về Hình học 3D và toán học cấp trường, xin lỗi nếu tôi nói bất kỳ điều nhảm nhí nào. Nhưng tôi thực sự muốn biết nhiều hơn về cách các trò chơi đó hoạt động đến từng chi tiết và có thể không chỉ là "mua sách X" vì tôi khá thất vọng. Mặc dù tôi sẽ mua một cuốn sách về sự phát triển của Elite hoặc một trò chơi tương tự, nếu nó tồn tại. Một số gợi ý chung sẽ là đủ.


Điều đáng nói là Elite và Star Wars hoạt động theo những cách rất khác nhau. Elite đã sử dụng raster hóa phần mềm các mô hình 3D thành pixel, trong khi Star Wars chạy trên màn hình vector, thậm chí không có pixel; thay vào đó, chùm màn hình sẽ trực tiếp vẽ các đường màu tùy ý lên màn hình, nhưng không thể lấp đầy chúng.
Trevor Powell

Chẳng phải họ đã vẽ các đường Bresenham (hoặc đường DDA) cho các điểm được chiếu (có thể xuất phát từ các hình tam giác tương tự) sao?
dùng712092

Câu trả lời:


3

Câu hỏi không phải là làm thế nào để triển khai đồ họa vector với các API 3D hiện đại như OpenGL và DirectX, vì thực hiện nó khá dễ dàng và không cần phải xây dựng hệ thống vectơ / ma trận từ đầu như những trò chơi đã làm.

Các vectơ theo nghĩa đen chỉ là một danh sách các số. Ma trận chỉ là một lưới các số. Phần thú vị là toán học bạn sử dụng trên chúng, nhưng những thứ đó cũng tầm thường - chỉ cần lấy một cuốn sách toán học cấp trường nơi giải thích loại này. Đây chỉ là khoảng 50 - 100 dòng mã, vì vậy đừng đánh giá quá cao nỗ lực ở đây.

Chúng là những trò chơi 3D thực tế và không giả mạo như After burner. Không giống như Wolfenstein 3D.

Wolfenstein 3D chủ yếu là 3D thực sự, bởi vì raycasting được cho là 'thật' hơn so với phương pháp hình học thông thường mà chúng ta thực hiện. Tuy nhiên, bạn có quyền xác định rằng đó là một mô hình khác và không phải là một mô hình mà bạn quan tâm ở đây.

Tôi biết điều tốt nhất nên làm là tháo rời nguồn của Elite và xem mọi thứ được thực hiện bởi chính tôi

Đừng quá bận tâm vào Elite. Nó không sử dụng bất cứ điều gì đặc biệt - rasterisation phần mềm khá giống nhau cho dù phần mềm nào đã làm điều đó. Bạn lấy từng đối tượng và biến đổi tất cả các tọa độ của nó thành không gian thế giới, sau đó bạn chuyển đổi tất cả các tọa độ không gian thế giới đó so với người xem để chúng ở trong không gian xem, sau đó chiếu chúng thành 2D để chúng ở trong không gian màn hình. Mỗi phép biến đổi về cơ bản chỉ là một phép quay và một bản dịch, và phép chiếu thường ít hơn một phép chia, nếu bạn đưa ra các giả định đúng.

Có một số bit khó khăn khác mà tôi không thể nhớ ngay lập tức, như làm thế nào để loại bỏ các mặt vô hình, nhưng tôi nghĩ rằng có thể được thực hiện chỉ với thứ tự các đỉnh - hiển thị một đường giữa 2 đỉnh được kết nối theo chiều kim đồng hồ không gian, và đừng nếu họ không. (Ví dụ.)

Không phải là không thể mã hóa máy bay chiến đấu TIE, thật khó để làm điều đó một cách chính xác

Hầu hết các mô hình đó chỉ có khoảng 20 hoặc 30 đỉnh - dễ dàng trong lĩnh vực mã hóa cứng. Tôi hy vọng các tác giả ban đầu đã vẽ các mô hình trên giấy biểu đồ trước và sau đó sao chép các giá trị đỉnh vào mã.


Vì vậy, dự đoán của tôi cho rasterisation là đúng? Nếu tôi hiểu đúng những gì bạn nói, nó không giống với lập trình 3D tiêu chuẩn bằng cách sử dụng OpenGL. Ma trận nhân và thích, phải không? Nhưng tôi sẽ phải tìm ra cách loại bỏ backface và đệm Z. Bạn có biết bất kỳ triển khai mã nguồn mở tốt nào của rasterisation không? Tôi đoán thuật toán không khó lắm nhưng tôi thích chơi mã để hiểu mọi thứ, tôi không muốn sao chép bất cứ điều gì (cũng vì tôi đang sử dụng Z80 ASM đã sửa đổi, rất cụ thể) nhưng nó vẫn rất hay để có một số loại tài liệu tham khảo.
EliteIsAwgie

Chắc chắn, tất cả các phần mềm kết xuất đồ họa vector là rasterisation theo định nghĩa. Tôi không biết bất kỳ mã nguồn ví dụ nào, nhưng một khi bạn có các đỉnh trong không gian màn hình, bạn có thể vẽ các đường bằng thuật toán Bresenham. Đối với việc loại bỏ backface và đệm Z, Elite không có 'khuôn mặt', chỉ có các cạnh và chắc chắn nó không sử dụng bộ đệm sâu bất kỳ loại nào - chỉ có đủ bộ nhớ cho điều đó và chỉ có kỹ thuật đó thực sự bắt đầu được sử dụng cho các trò chơi vào giữa những năm 90.
Kylotan

Vâng, tôi biết rằng Z-Buffering xuất hiện tương đối muộn hơn, nên đã nói "Z-culling" thay vào đó. Tôi đoán tôi sẽ phải sử dụng một trong những thuật toán đơn giản hơn. Cảm ơn đã chỉ cho tôi về thuật toán của Bresenham, nó có vẻ khá rẻ.
EliteIsAwgie

2

Bạn đang tìm kiếm 3D dựa trên đỉnh hỗ trợ hình học tùy ý (không giới hạn) trong không gian 3D. Raytracing theo nghĩa gốc 3D thực sự ở chỗ nó có thể hỗ trợ mức độ tự do không giới hạn (DoF). Raycasting (theo nghĩa phát triển trò chơi chứ không phải ý nghĩa ban đầu tương tự như raytracing ngoại trừ hướng tia), tuy nhiên, hạn chế mức độ tự do, ví dụ. bản đồ chiều cao dựa trên bản đồ được tìm thấy trong máy phát tia voxel của Comanche hay Wolfenstein thực sự có người chơi di chuyển trong không gian 2D thuần túy. Bất kỳ công cụ 3D có hỗ trợ hình học tùy ý không hạn chế bởi trục chỉ là trình bày trong không gian màn hình của một số loại mô hình của một thế giới 3D, không phân biệt đại diện đó.

Chúng hoạt động ở mức cực kỳ thấp và được viết bằng ASM

Trong trường hợp của Elite, như bạn có thể biết, đúng vậy. Các phần khác, các trò chơi tương tự khác được viết bằng ASM hoặc mã máy trong mọi trường hợp, xem xét việc xử lý toán học đòi hỏi mà không cần bất cứ điều gì như ALU chúng ta có ngày nay. Do chỉ có một phần nhỏ của bất kỳ cơ sở mã hóa nào thực sự quan trọng về hiệu năng, nên có thể hiểu rằng một số phần ít quan trọng hơn trong số này (ví dụ như Bộ công cụ xây dựng 3D và các trò chơi do nó tạo ra) được viết bằng C ++. Tuy nhiên, một lần nữa, khi xem xét các tài nguyên hạn chế, đặc biệt là trên các máy thời kỳ 16 bit, nó giống như là sự pha trộn giữa trình biên dịch mã và mã máy thô (bạn thực sự có thể nhập các chuỗi lớn 0 và 1 và lưu trữ chúng vào đĩa dưới dạng chương trình - thiên đường giúp bạn nếu bạn mắc lỗi).

Mô hình 3D của họ là mô hình 3D thực tế

Ghi chú thêm về quá trình xây dựng các trò chơi như vậy từ đầu:

Toán, trước bất cứ điều gì khác. Để được xác thực, bạn sẽ sử dụng toán điểm cố định. Những gì bạn có thể thực hiện vào cuối toán học sẽ xác định loại trò chơi bạn có thể làm. Giai đoạn = Stage. Tôi có thể đảm bảo với bạn đây là triết lý mà Braben và Bell đã dành cho giới thượng lưu. Nguyên mẫu, tối ưu hóa, rửa sạch và lặp lại. Xem những gì có thể. Sau đó thiết kế trò chơi của bạn xung quanh những gì bạn đã làm được. Điều này sẽ không xảy ra trên các hệ thống ngày nay, như chúng ta đã biết (mức thấp của) những gì có thể. Tìm (và tốt nhất là hiểu toán học phía sau - nhưng điều này không cần thiết 100%) của các khối xây dựng cơ bản: vectơ 3D, ma trận xoay, Đệ tứ (tôi nghĩ rằng chúng thích quay vòng eulerian trong ngày nhưng không chắc chắn, dù sao thì Đệ tứ rẻ hơn để tính toán) và tương tự. Ngoài ra nó 'đừng đánh giá thấp tác động và cấu trúc dữ liệu hiệu quả có hiệu suất!

Tiếp theo, viết mã. Thực hiện các cấu trúc và hoạt động này (cũng như các cấu trúc và logic đi kèm cho trò chơi rộng hơn của bạn, như vậy) trong một ngôn ngữ cấp cao hơn như C ++ hoặc thậm chí tốt hơn (nhanh hơn), C. Sau đó tối ưu hóa thành các khối asm từ đó, khi và khi được yêu cầu. Vì tôi cho rằng bạn sẽ muốn làm điều này trên x86 hoặc kiến ​​trúc hiện đại khác, nên điều này là đủ cho mục đích của bạn. Nếu phần cứng thời đại 16 bit như các hệ thống dựa trên Motorola 68000, hãy sử dụng C và tái cấu trúc thành ASM thường xuyên. Nếu phần cứng 8 bit, C có thể thực hiện được đối với các bit bị giới hạn, tôi nghĩ vậy, nhưng bạn có thể sẽ tái cấu trúc không thương tiếc vào ASM. Nếu làm việc trên các hệ thống 8 bit hoặc 16 bit, bạn sẽ phải làm quen với các kiến ​​trúc, các thủ thuật ngày càng khó hiểu được sử dụng trên các nền tảng đó, v.v., vì vậy tôi không đề xuất tuyến đường này vì nó thực sự là một nghệ thuật đen tối ngày nay (mặc dù đáng ngạc nhiên là vẫn có những cộng đồng phát triển cho các hệ thống chủ yếu không còn tồn tại này).

Điều tra kỹ lưỡng của bạn về các kỹ thuật trường học cũ là đáng khen ngợi. Bạn chắc chắn sẽ kết thúc với sự đánh giá cao về mức độ tưởng tượng có thể được thực hiện với phần cứng chúng ta có ngày hôm nay.


Một số trò chơi tương tự tôi nhớ ngoài 3DCK để bạn kiểm tra:

  • Mặt tối
  • Starglider
  • Interphase
  • Virus (trò chơi nhỏ tuyệt vời)
  • Conqueror (cùng động cơ với Virus, đã từng chơi trò này trên một bàn phím với một người bạn, một anh chàng xạ thủ xe tăng và một người lái xe, những kỷ niệm tuyệt vời)
  • Mercenary (phát hành chỉ vài tháng sau Elite)
  • Damocles (và các phần tiếp theo và đĩa nhiệm vụ khác của Mercenary)
  • Novell NetWars cho kiến ​​trúc x86 (thậm chí có thể vẫn chạy trên một cái gì đó như Dosbox, mặc dù chạy nó được nối mạng sẽ yêu cầu thiết lập xác thực tôi nghĩ)

Về các động cơ dựa trên đúc tia không phải là 3d thực, tôi chỉ đề cập đến thực tế là hầu hết chúng chỉ đại diện cho một không gian hai chiều. Elite cho phép chuyển động 360 ° và theo tôi, đó là định nghĩa của trò chơi 3D. Định nghĩa về đại diện 3D linh hoạt hơn, tôi hoàn toàn đồng ý! Chỉnh sửa: Tôi muốn cảm ơn bạn cho câu trả lời thấu đáo của bạn. Nếu bạn quan tâm, tôi đang phát triển bản demo giống như Elite nhỏ của mình trên Gameboy. Chúc may mắn với động cơ voxel của bạn!
EliteIsAwgie

Này, vâng, tôi đã tinh chỉnh và cải tiến lại phần đó, tôi biết ý của bạn là gì, có thể nói bạn đã thực hiện nghiên cứu tốt trước khi đặt câu hỏi này. Trò chơi của bạn, tôi rất thích thú, có nguồn cấp dữ liệu hoặc thứ gì đó tôi có thể đăng ký không?
Kỹ sư

Tôi đã cố gắng hết sức. Tôi đã có kế hoạch đi sâu vào toán học, bạn có thể đề xuất thêm môn học tôi nên xem xét ngoài những môn bạn đã đề cập không? Không sợ họ!
EliteIsAwgie

Chỉ cần chỉnh sửa lại - mô tả về raytracing so với raycasting. Đó là một sự khác biệt quan trọng để thực hiện. Raycasting theo nghĩa ban đầu chỉ là một sự tối ưu hóa của raytracing, nhưng sau đó "raycaster" có nghĩa là các trò chơi được thực hiện theo phong cách 3D Wolfenstein / Doom / Duke Nukem. Toán học, của tôi chưa bao giờ ấn tượng. Nhưng bạn có thể làm một số tiền đáng kể ngay cả với những chủ đề tôi đã đề cập. Ngoài ra, hãy xem Toán học 3D dành cho lập trình viên trò chơi và cấu trúc dữ liệu cho lập trình viên trò chơi. Sê-ri GPU Gems và các trang web của Paul Bourke cho hình học tính toán.
Kỹ sư

Được rồi cảm ơn. Mặc dù tôi đoán rằng tôi sẽ có một thời gian khó khăn để dịch các tính toán mở rộng sang một loạt các thanh ghi và một số bộ nhớ! Tôi không có bất kỳ blog / nguồn cấp dữ liệu nào về dự án của mình vì tôi đã làm rất ít - tài liệu nguồn rất khan hiếm, nhưng tôi đoán đó là lý do tại sao tôi thấy nó rất quyến rũ. Nếu tôi từng làm một cái gì đó từ nó, tôi đoán bạn sẽ nghe về nó, vì rất có thể tôi sẽ phải đến đây trong vài giây! Ngoài ra, để thêm vào danh sách các trò chơi vectơ của bạn, hãy xem www.everyvideogame.com/showthread.php?p=11539
EliteIsAwgie
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.