3 điểm bởi GN⁺ 2024-05-18 | 1 bình luận | Chia sẻ qua WhatsApp
  • Bắt đầu từ giá trị pi sai trong mã nguồn Doom, bài nói khám phá cách việc cố tình làm lệch hơn các hằng số toán học sẽ thay đổi việc dựng hình và cảm nhận không gian trong game bắn súng góc nhìn thứ nhất như thế nào
  • Đồ họa game không chỉ dựa vào pi mà còn phụ thuộc vào lượng giác và nhiều kỹ thuật toán học khác, nên chỉ một thay đổi toán học nhỏ cũng có thể ảnh hưởng đến cách nhìn nhận thế giới và di chuyển trong đó
  • Doom là một FPS kinh điển có mã nguồn được công bố theo GPL vào năm 1999, vì vậy nó có thể được dùng làm đối tượng thử nghiệm để thay đổi pi, hàm lượng giác và các hằng số khác
  • Thí nghiệm cũng điểm qua các kỹ thuật tối ưu hóa giúp Doom chạy tốt trên phần cứng thời đó, đồng thời cung cấp hướng dẫn để tự biên dịch phiên bản với toán học bị làm sai
  • Bài nói xem xét liệu hình học phi Euclid có thể tạo ra trải nghiệm không gian mới trong game hay không, đồng thời liên kết tới các game khác dùng giá trị pi sai và các kho mã nguồn mở liên quan

Cố tình làm lệch toán học của Doom

  • Pi là một hằng số được biết đến với giá trị cố định, nhưng trong mã nguồn Doom lại dùng một giá trị pi sai
  • Việc dựng hình đồ họa không chỉ phụ thuộc vào pi mà còn dựa vào lượng giác và nhiều kỹ thuật toán học khác
  • Thí nghiệm kiểm tra game sẽ thay đổi ra sao nếu giá trị pi trong mã nguồn Doom bị chỉnh thành còn kém chính xác hơn
  • Bài nói cũng thay đổi cả các hàm lượng giác và hằng số khác để xem cảm giác hiểu và di chuyển trong một thế giới ảo quen thuộc sẽ bị xáo trộn như thế nào

Mã nguồn Doom và phạm vi thí nghiệm

  • Doom là một game bắn súng góc nhìn thứ nhất kinh điển nổi tiếng
  • Mã nguồn Doom được công bố theo GPL vào năm 1999
  • Đối tượng thí nghiệm bao gồm:
    • Thay giá trị pi bằng một giá trị còn sai hơn
    • Thay các hàm lượng giác khác bằng giá trị sai
    • Chỉnh các hằng số toán học liên quan thành giá trị không chính xác

Khả năng của game phi Euclid

  • Khi toán học thay đổi, cấu trúc không gian ảo và cảm giác di chuyển mà người chơi vốn quen thuộc cũng có thể thay đổi theo
  • Bài nói xem xét liệu những thay đổi này có thể dẫn tới các khả năng thú vị cho game dựa trên hình học phi Euclid hay không

Tối ưu hiệu năng và tự chạy thử

  • Bài nói cũng đề cập ngắn gọn đến các kỹ thuật tối ưu hóa giúp Doom chạy tốt trên phần cứng thời đó
  • Ở cuối phần trình bày có hướng dẫn để tự biên dịch phiên bản Doom với toán học bị làm sai

Tài liệu liên quan

  • Cũng có cung cấp liên kết đến các game khác sử dụng giá trị pi sai và các kho mã nguồn mở liên quan
  • Video bài nói được cung cấp như nội dung MCH2022 trên media.ccc.de

1 bình luận

 
GN⁺ 2024-05-18
Ý kiến Hacker News
  • Ngay cả Duke Nukem 3D kinh điển cũng từng có một ví dụ như thế. Đó là màn ‘Lunatic Fringe’ do Richard “Levelord” Gray tạo ra
    https://dukenukem.fandom.com/wiki/Lunatic_Fringe
    Màn này có một hành lang hình tròn ở phía ngoài, được cấu trúc để có thể đi trọn hai vòng mà không tự cắt nhau, tận dụng khả năng tách vùng dựa trên kết nối phòng của engine Build, vốn rất đột phá vào thời đó. Tính năng đó cũng được dùng cho kỹ thuật ‘room over room’
    Nó rất vui trong chế độ nhiều người chơi và ảo giác cũng được giữ khá tốt. Nếu nhớ không nhầm thì căn phòng trung tâm có 4 lối vào, nhưng mỗi lần đi một vòng bên ngoài chỉ gặp 2 trong số đó
    Khi thử nghiệm engine, tôi cũng từng làm một màn đồ chơi dùng kỹ thuật này để giải câu đố “nối 3 ngôi nhà với 3 tiện ích công cộng sao cho các đường không cắt nhau”

    • Tôi không rõ theo nghĩa nào thì ví dụ của Duke lại là “một ví dụ của cái này”. Phía Duke là hành vi chương trình nhất quán về mặt nội bộ, còn cái này gần giống lỗi ngẫu nhiên do sửa đổi tùy tiện mã nguồn hơn
      Duke có thể là thứ gì đó giống hình học phi Euclid, nhưng việc đổi pi trong Doom này chẳng liên quan mấy đến hình học mà giống kiểu “rác vào thì rác ra” hơn
    • Nếu nói “kỹ thuật ‘room over room’ mang tính đột phá thời đó”, thì Marathon của Bungie năm 1994 cũng đã làm được, và còn thể hiện trong map deathmatch 5-D Space[1]
      Việc hỏng khi sector chồng lên nhau về cơ bản chỉ là vấn đề của Doom
      [1] https://www.lhowon.org/level/marathon/30
    • Từ lâu rồi tôi từng làm một engine nhỏ có kiểu tính năng này. Khi đó tôi chưa biết về engine Build, và thay vì theo cây BSP sau khi chia thế giới thành sector lồi, tôi cho phép các liên kết tùy ý, tức là portal. Việc dựng hình diễn ra từ trước ra sau và cắt ở ranh giới portal
      Nếu bạn có thể raster hóa phần bên trong một hình lồi, thì cũng có thể raster hóa thế giới sector-portal bằng cách đánh dấu một mặt cụ thể là portal, đặt vị trí mà mặt đó hiện ra làm vùng clipping hoặc stencil buffer, rồi dựng sector phía sau bằng phép biến đổi thích hợp và ID sector ở phía bên kia có trong dữ liệu portal
      Xử lý va chạm khi đi qua portal khó hơn rất nhiều so với việc render qua portal
    • Kiểu room over room mà các game Build về sau triển khai thường không cần sector chồng lên nhau như thế này. Nó là phần mở rộng của cách họ làm nước có thể bơi được, tức engine sẽ render một sector khác thay vì sàn hoặc trần
      Lunatic Fringe là ví dụ trực diện về hình học bất khả trong Build, nhưng map Duke3D còn có nhiều hình học giao cắt hơn thế nữa. Trong Doom thì không thể tạo cây BSP cho cấu trúc như vậy, mà người chơi hay quái vật cũng chỉ theo dõi tọa độ X/Y nên đương nhiên là không làm được
    • Có một game VR thú vị tên là Tea For God. Mỗi khi bạn rẽ góc hoặc đi thang máy trong không gian chơi thật, game khéo léo tạo ra hành lang và căn phòng mới, tạo ảo giác như đang ở trong một nơi rất rộng lớn dù thực ra không hề rời khỏi cùng một căn phòng. Nó làm được điều này mà không cần joystick hay dịch chuyển tức thời
  • Tình cờ tôi đang đọc tác phẩm kinh điển Operation Chaos của Poul Anderson
    https://en.wikipedia.org/wiki/Operation_Chaos_(novel)
    Bối cảnh là một thế giới song song nơi phép thuật là có thật và phát triển nhanh chóng cùng với khoa học. Ví dụ, Edwin Land phát minh ra một thiết bị dùng phân cực để khiến người sói biến hình mà không cần ánh trăng
    Con của các nhân vật chính bị bắt cóc và lôi xuống địa ngục, rồi họ biết rằng quân đội từng cố thăm dò địa ngục 20 năm trước nhưng tất cả đều phát điên. Kẻ đối địch buột miệng để lộ một đầu mối rằng vì hình học không-thời gian của địa ngục khác với chúng ta, họ có thể quay về đúng thời điểm đứa trẻ đến nơi để đưa nó trở lại
    Chỉ từ đầu mối đó, các nhà khoa học đã suy ra rằng hình học của địa ngục là hình học phi Euclid, rồi tính ra các câu thần chú để đi vào an toàn, trụ vững và quay về. Để tìm đường, họ nhờ đến hai nhà hình học thế kỷ 19, trong đó một người cầu nguyện để nhận được sự trợ giúp của các vị thánh

    • Hình học không-thời gian của thế giới chúng ta cũng không phải Euclid, thậm chí còn không phải hình học Riemann. Operation Chaos có vẻ không khoa học bằng mà hỗn loạn hơn
      Những tác phẩm Poul Anderson tôi từng đọc, như High Crusade rất tuyệt chẳng hạn, cho thấy ông không quá bận tâm đến lớp vỏ khoa học mà thích cứ thế đẩy mạnh ý tưởng. Một tác phẩm khác về hình học phi Euclid mà tôi còn nhớ tốt là Inverted World của Christopher Priest
    • Có thể nghe hơi sáo mòn, và có lẽ đúng là vậy, nhưng tôi không hiểu vì sao dạo này lại hiếm có tiểu thuyết sáng tạo như thế
    • Tuyển tập truyện ngắn tuyệt vời Tales of the Dying Earth của Jack Vance cũng đáng xem. Trong đó có cả ma thuật/khoa học và chiều không gian quỷ dữ cùng xuất hiện
    • Tôi thích Operation Chaos, nhưng phần tiếp theo ra đời muộn hơn rất nhiều thì gây thất vọng
  • Có thể John Carmack đã nhớ sai chữ số thứ 10 của pi, nhưng mọi người nên thử tìm 84,600 trong codebase của mình để xem có ai gõ nhầm số giây trong một ngày không
    Điều này phổ biến hơn tưởng tượng, và là một bài học về việc liệu có nên tự ghi trực tiếp hằng số vào chương trình hay dùng giá trị đã có sẵn trong thư viện chuẩn của ngôn ngữ lập trình

  • Trên thực tế, đồ họa và chuyển động bắt đầu trở nên kỳ quái rồi cuối cùng game không còn chơi được nữa. Gọi nó là Doom phi Euclid có lẽ không đúng bằng gọi đây là “kết quả của việc đụng vào các hằng số của vũ trụ”
    Nếu là Doom phi Euclid thật sự thì tôi đã kỳ vọng nó sẽ như thế này: https://youtu.be/kEB11PQ9Eo8?si=0HNlpGFBii2AIK1n

    • Nói kỹ hơn một chút thì ngay cả video đó cũng đang dùng sai thuật ngữ phi Euclid. Nhóm HyperRogue đã làm vài video cho thấy hình học phi Euclid thực sự
      https://youtu.be/yqUv2JO2BCs?si=AutaqS5unvT7cDjw
      Khi nhìn các hiệu ứng hình học kỳ lạ trong video Doom, như lúc di chuyển về phía trước mà vật thể trông như trượt ngang, thì việc gọi bản Doom này là phi Euclid cũng có phần hợp lý
    • Cái đó cũng không phải ý nghĩa của phi Euclid. Nó chỉ là một thế giới 3D thông thường có portal. Các engine game bắn súng góc nhìn thứ nhất thời đó thường nối các căn phòng bằng các ô cửa, tức portal, để phục vụ việc loại bỏ phần bị che khuất
      Chúng có thể biểu diễn hình học bình thường, nhưng không cần thiết hình học đó phải hợp lý theo cách nào đó, và cũng cho phép nối tùy ý giữa các phòng. Không phải tôi muốn bắt bẻ, nhưng đây là một hiểu lầm khá phổ biến
      Nếu muốn xem phi Euclid thật sự thì tôi khuyên xem các tác phẩm của ZenoRogue. Ví dụ như một game đơn giản dùng hình học Nil[1], một trận boss khổng lồ trong roguelike thế giới phi Euclid[2], hay các kiểu quái dị hình học nói chung[3]. Xem bất cứ thứ gì của họ cũng được
      [1] https://m.youtube.com/watch?v=gejRg_q70EA&pp=ygUJemVub3JvZ3V...
      [2] https://m.youtube.com/watch?v=jcnXI8IArRI&pp=ygUJemVub3JvZ3V...
      [3] https://m.youtube.com/watch?v=yqUv2JO2BCs&pp=ygUJemVub3JvZ3V...
    • Ngạc nhiên là vẫn chưa thấy ai nhắc đến Antichamber. Đó là một game tuyệt vời đã biến một ý tưởng tương tự thành các câu đố thực sự
      Nghĩ lại thì có lẽ đã đủ lâu để chơi lại vẫn thấy vui
    • Cái này trông giống portal. Các game bắn súng góc nhìn thứ nhất thời đó về cơ bản nối các căn phòng bằng ô cửa, tức portal, để làm việc loại bỏ phần bị che khuất
      Không có vấn đề gì trong việc biểu diễn hình học bình thường, nhưng cũng không có điều kiện bắt buộc hình học phải hợp lý, và có thể nối tùy ý giữa các phòng
    • Tôi cũng đã kỳ vọng đúng kiểu đó. Đây là một triển khai phi Euclid khác có thêm vài ý tưởng mới nữa
      https://www.youtube.com/watch?v=tl40xidKF-4
  • Doom không phải là một mô phỏng, nên việc thay đổi một hằng số không thực sự là ví dụ hay cho điều gì cả
    Nó gần như chỉ là làm hỏng một vài routine, và vì vậy kết quả của hầu hết các thay đổi là game không thể chơi được

    • Tôi không rõ điều này có gì thú vị. Nếu đổi một hằng số sang một con số sai thì đương nhiên sẽ xuất hiện hành vi kỳ lạ hoặc lỗi. Còn có thể thế nào khác nữa? Mấy hành vi kỳ lạ đó cũng không có vẻ đặc biệt, nên tôi không biết mình đã bỏ sót điều gì
  • Chỉ cần lấy mã nguồn của một trình giả lập console mà bạn thích rồi chèn vào vài lỗi dấu phẩy động ngẫu nhiên, hoặc đảo ngược ý nghĩa của một số lệnh rẽ nhánh. Game càng cũ thì khả năng vẫn chạy được càng cao, và cũng càng dễ trông giống một chuyến trip ảo giác tồi tệ

    • Hồi lâu rồi từng có một công cụ làm việc này cho trình giả lập N64. Tôi đã thử và thấy vui trong một thời gian, nhưng đúng như dự đoán thì nó hay bị crash
      Cũng từng có các dự án glitch art tạo ra thứ gì đó mới bằng cách phá hỏng những đoạn cụ thể trong các tệp hình ảnh và video nổi tiếng. Tôi muốn tìm lại cả hai nhưng không thấy nữa
  • Marathon 1 (1994) hỗ trợ không gian phi Euclid, nhưng chỉ hiếm khi được sử dụng. Trong lúc chơi toàn bộ game gồm nhiều màn có bản đồ, chỉ một hai màn mới xuất hiện không gian bất khả thi, và game không hề cảnh báo hay cho biết rằng điều đó là có thể
    Vì vậy có lẽ đây từng là vị trí Easter egg hay nhất từng được tìm ra trong game
    Tôi cũng đã tìm được video minh họa: https://www.reddit.com/r/Marathon/comments/vclu55/probably_n...

  • Câu hỏi cuối cùng là: giá trị lớn nhất của pi vẫn có thể chơi được mà không bị crash là bao nhiêu. Có vẻ lý do xảy ra segmentation fault khi pi bằng 4 là vì một số lần truy cập bảng tra cứu vượt quá cuối bảng, và nếu vậy thì giá trị tối đa vẫn có thể chơi được có lẽ chỉ lớn hơn pi thật một chút

  • Tôi ước video này đi sâu hơn vào cơ chế của game và lý do vì sao việc thay đổi Pi lại gây ra những vấn đề như vậy

  • Tôi tự hỏi trong bản Doom ray tracing được nhắc đến thì thí nghiệm này có thú vị hơn không. Kết quả của việc hack hằng số trong kỹ thuật rasterization gần như đúng như dự đoán. Nhưng với ray tracing thì có thể sẽ cho ra kết quả thú vị hơn