2 điểm bởi GN⁺ 2026-02-09 | 1 bình luận | Chia sẻ qua WhatsApp
  • Trong các game xây dựng thành phố, việc hiện thực hóa hệ thống đường sá một cách chân thực là yếu tố cốt lõi, không chỉ là thành phần thị giác đơn thuần mà còn là nền tảng quyết định độ hoàn thiện về cấu trúc
  • Các game hiện nay thường dùng đường cong Bezier spline để biểu diễn đường sá, nhưng cách này có giới hạn trong việc duy trì độ cong và tính song song của đường thực tế
  • Đường sá ngoài đời cần phản ánh khoảng cách giữa các trục xe và các ràng buộc khi vào cua, trong khi phương pháp Bezier làm biến dạng hình dạng khi offset, dẫn đến những đường cong phi thực tế
  • Để giải quyết điều này, có thể áp dụng các đường cong kỹ thuật như cung tròn (Circle Arc)clothoid (Clothoid), giúp chuyển đổi độ cong mượt mà và giữ được offset song song
  • Tác giả đã tự xây dựng hệ thống đường sá để vượt qua những giới hạn này và dự định sẽ công bố quy trình triển khai kỹ thuật trong tương lai

Sức hấp dẫn của đường sá và các mô thức

  • Tác giả tìm thấy sự thỏa mãn trong đường sá, tương tự như cảm giác trước những mô thức hỗn độn trong trật tự của tự nhiên
    • So sánh với hiện tượng những quy tắc đơn giản chồng lớp tạo thành cấu trúc phức tạp như tổ kiến, tổ ong hay gân lá
    • Mạng lưới đường sá cũng được mô tả là một trong những mô thức thú vị nhất do con người tạo ra
  • Tác giả nhấn mạnh vẻ đẹp cấu trúc của đường sá khi tưởng tượng về dấu tích của mạng lưới đường bộ vẫn còn lại ngay cả sau khi thành phố biến mất

Game xây dựng thành phố và sự tiến hóa của đường sá

  • Từ SimCity 2000 đến Cities: Skylines 2, hệ thống đường sá đã không ngừng phát triển
    • SimCity 4 hỗ trợ độ cao và đường chéo, SimCity 2013 hỗ trợ đường cong, còn Cities: Skylines cho phép bố trí tự do và tạo nút giao
  • Tuy vậy, vẫn còn tồn tại các vấn đề như đường cong thiếu tự nhiên, bán kính quay gắt và các nhánh lên xuống cao tốc phi thực tế
  • Dù có thể hiện thực làn đường, vạch kẻ và đường cong chân thực hơn thông qua mod, nhưng vẫn không thể vượt qua những giới hạn nền tảng của engine

Giới hạn của Bezier spline

  • Đường cong Bezier là một công cụ toán học mạnh mẽ để nối mượt hai điểm, nên được dùng trong hầu hết các game engine
  • Tuy nhiên, đường cong này không giữ nguyên hình dạng và độ cong khi offset, tức là “offset của một đường cong Bezier không phải là một đường cong Bezier”
  • Vì vậy phát sinh các hiện tượng lệch giữa đường cong phía trong và phía ngoài, tự giao nhaupinching (thắt bóp)
  • Kết quả là rất khó để hiện thực các đường cong song song phản ánh quỹ đạo xe thực tế như ngoài đời

Ứng dụng của cung tròn (Circle Arc) và clothoid (Clothoid)

  • Cung tròn mang lại tính song song hoàn hảo vì vẫn giữ nguyên hình dạng sau khi offset
    • Việc tính giao điểm giữa hai cung tròn đơn giản hơn Bezier rất nhiều và hiệu quả với độ phức tạp tính toán O(1)
    • Khi nối các cung tròn có bán kính khác nhau, có thể tạo nên hình dạng đường sá hợp lý về mặt kỹ thuật
  • Tuy nhiên, cung tròn có độ cong không đổi, nên khi chuyển từ đoạn thẳng sang đoạn cong sẽ gây ra sự thay đổi đột ngột của gia tốc ngang
  • Để khắc phục điều này, người ta dùng clothoid (Clothoid)
    • Độ cong tăng dần theo từng bước, mang lại cảm giác lái và độ êm tự nhiên hơn
    • Dù phức tạp về mặt toán học, đây là yếu tố thiết yếu trong thiết kế đường cho xe chạy tốc độ cao
  • Với các đoạn tốc độ thấp như nút giao trong đô thị, thiết kế dựa trên cung tròn cũng đủ để đạt được cảm giác chân thực

Vì sao tác giả tự làm hệ thống đường sá

  • Phần lớn người chơi không quá quan tâm đến độ chính xác của độ cong tại nút giao, nhưng tác giả lại khám phá chủ đề này vì sự tò mò và thách thức kỹ thuật
  • Mức độ hiện thực trong các game thương mại hiện nay khá cao, nhưng tài liệu hay asset mà lập trình viên indie có thể tiếp cận vẫn còn thiếu
  • Tác giả tự triển khai hệ thống nhằm tạo ra một giải pháp tinh vi hơn và có thể chia sẻ được, thay vì chỉ làm đường dạng lưới đơn giản
  • Ở bài viết tiếp theo, tác giả sẽ công bố chi tiết kỹ thuật của quá trình triển khai, và người đọc có thể đăng ký theo dõi để nhận cập nhật

1 bình luận

 
GN⁺ 2026-02-09
Ý kiến trên Hacker News
  • Đọc bài viết nói rằng đường là cốt lõi trong game xây dựng thành phố, tôi nghĩ mình hiểu vì sao các nhà quy hoạch đô thị hay gặp ác mộng
    Nền tảng của đô thị không phải là đường cho ô tô (road), mà là phố (street) nơi người đi bộ, xe đạp và giao thông công cộng cùng sử dụng
    Có thể tham khảo bài về khái niệm liên quan Stroad

    • Trước đây tôi chưa từng nghĩ về sự khác biệt giữa hai từ này, nhưng đọc giải thích trên Wikipedia thì thấy rất thuyết phục
      Đường là trọng tâm của vận chuyển (transportation), còn phố là trọng tâm của tương tác công cộng (public interaction)
      Dù vậy, tôi vẫn cảm thấy trích dẫn trong bài gốc đang bị chỉ trích hơi quá. Xã hội hiện đại có nhu cầu vận chuyển khổng lồ, nên mạng lưới đường sá trong và ngoài đô thị chính là bộ xương của thành phố
      Trước những năm 1900, thành phố chỉ có thể được xây gần đường thủy, nhưng giờ thì nhờ đường sá mà điều đó cũng khả thi ở vùng nội địa
    • Các con phố ở San Francisco cũng đã được thiết kế theo nguyên lý kỹ thuật dân dụng từ thế kỷ 19
      Nếu muốn tạo ra một thành phố chân thực, tôi nghĩ cách tiếp cận này đúng đắn hơn là làm những con đường giả tạo
    • Tôi cũng thích hạ tầng ưu tiên người đi bộ (đường xe đạp, lối đi bộ, giao thông công cộng), nhưng đúng là đường ban đầu được thiết kế cho xe ngựa và ô tô
      Thỉnh thoảng tôi vẫn tưởng tượng — nếu một nền văn minh chỉ dùng xe đạp và đi bộ để thiết kế đô thị thì nó sẽ trông ra sao
  • Có một trò mà tác giả hẳn sẽ thích, đó là game sandbox Junxions, tập trung vào việc tạo các nút giao thông đường bộ
    Subreddit liên quan ở đây. Có vẻ game này sẽ thỏa mãn rất tốt cơn nghiện thiết kế đường sá

    • Tôi là người tạo ra hệ thống đường này. Thực ra tôi vẫn chưa chắc mình sẽ làm gì với nó — phát hành như asset hay làm thành game vẫn còn đang cân nhắc
      Tôi cũng thích Junxions, nhưng cách tiếp cận của tôi khác. Bên đó dùng cấu trúc Bézier dựa trên node, còn tôi tự động tạo giao lộ bằng va chạm giữa các đoạn đường
      Tôi định sẽ viết kỹ hơn về sự khác biệt giữa hai cách tiếp cận trong bài blog tiếp theo
  • Người ta bảo chỉ có 1% số người để ý đến bán kính góc ở giao lộ, và tôi chính là thuộc 1% đó

  • Định nghĩa đường bằng đường cong Bézier không hề dễ
    Đặc biệt ở các đoạn cua gắt, kết quả nhìn sẽ rất xấu
    Năm ngoái khi làm dự án Azoth, tôi cũng gặp đúng vấn đề này và đã tìm ra một cách giải quyết đơn giản hơn
    Tham khảo: kho lưu trữ Azoth, ví dụ Bézier

  • Những yếu tố trông rất hiển nhiên trong game thực ra là kết quả của một lượng lao động và thiết kế khổng lồ
    Ví dụ như đường sá, người chơi thường không nhìn kỹ nhưng chỉ cần nó trông sai là sẽ thấy kỳ ngay
    Gần đây chơi Kingdom Come 2 tôi cảm nhận rất rõ điều đó — mọi thứ trông tự nhiên như ngoài đời, nhưng toàn bộ chi tiết ấy được làm ra bằng mồ hôi và nước mắt của các nhà phát triển
    Vì thế tôi hiểu vì sao ngành game lại bị ám ảnh bởi crunch

    • Cửa trong game cũng là một vấn đề phức tạp. Chúng thường lớn hơn thực tế khoảng 30%, và đa số dùng cửa trượt vì lý do xử lý vật lý
      Bài liên quan: The Door Problem, bài trên IGN
  • Chính những bài như thế này khiến tôi cứ tiếp tục đọc Hacker News. Tôi chỉ muốn nhắn tác giả hãy tiếp tục viết nữa

    • Tôi là tác giả đây. Cảm ơn vì đã quan tâm. Thật ra trước đó tôi không biết HN là gì, chỉ đến khi lưu lượng truy cập đổ về mới nhận ra
      Có nhiều người cùng quan tâm đến chủ đề này nên tôi định sẽ tiếp tục hoạt động nhiều hơn
  • Bài này đúng gu tôi thật sự. Tôi cũng có cùng một nỗi ám ảnh về đường sá
    Thành phố được cấu thành bởi đường như mạch máu, còn những con đường làng ở châu Âu và châu Á là những câu chuyện được dựng lên từ dấu chân qua lại
    Trong khi đó, đường nông thôn ở quê tôi cứ kéo thẳng ra rồi bất ngờ bẻ ngoặt nếu nông dân không chịu bán đất
    Chỉ một số khu thời thuộc địa hay đô thị quy hoạch mới có dạng ô bàn cờ, còn phần lớn thì đổi hướng theo dòng sông hay địa hình
    Những điểm giao giữa các mạng lưới ô bàn cờ như vậy là phần đẹp nhất và thú vị nhất về mặt kiến trúc trong thành phố
    Sẽ tuyệt biết bao nếu có một game mô phỏng sự thay đổi trong quá trình phát triển đô thị

    • Tôi cũng bị tụt hứng khi game xây thành phố dựa trên lịch sử lại dùng kiểu ô bàn cờ
      Thành phố thật phát triển như tổ kiến, với sự phức tạp trong một trật tự tự nhiên
      Có lẽ sau này tôi sẽ viết riêng một bài về chủ đề này
  • Trong game tiếp theo Canalpunk, tôi vẫn sẽ tiếp tục dùng spline Bézier
    Tôi nghĩ một hệ thống thảm họa phát sinh khi tuyến đường tự cắt nhau sẽ rất thú vị

  • Tôi đang ám ảnh với việc triển khai clothoid (đường cong chuyển tiếp) trong trình chỉnh sửa đường ray
    Trong khoảng trống thì dễ, nhưng khi nối các đoạn ray lại với nhau mới khó
    Tôi có tài liệu giải thích từng làm trước đây: Euler Spiral Explanation

    • Tôi có một thắc mắc. Nếu có một đường tách thành hai nhánh từ trái sang phải, thì khi kéo clothoid ngược lại về phía sau, dạng sóng có bị giao nhau không?
      Tôi muốn thử xem có thể dùng giao điểm đó để nội suy một spline mới hay không
      Hình minh họa: ví dụ trực quan
    • Phần giải thích thật sự rất chi tiết nên tôi đã lưu lại. Tôi không ngờ việc nối clothoid lại khó đến vậy. Còn tự triển khai thì tôi vẫn chưa dám thử
  • Cứ làm thành đường thẳng như người La Mã là xong :-)
    Tất nhiên người La Mã thì chẳng mấy quan tâm đến đất tư nhân. Ở Lincolnshire, Anh, nơi tôi sống, đường La Mã vẫn còn được sử dụng đến giờ
    Chỉ khi mở rộng đường băng RAF Scampton thì người ta mới ngoại lệ bẻ cong con đường đi

    • Thực ra người La Mã cũng gặp vấn đề đất tư nhân. Ví dụ, tuyến cầu dẫn nước thứ hai từng bị trì hoãn vì địa chủ Crassus không chịu nhượng đất
      Xem thêm: Roman aqueduct
    • Đường ở khu vực tôi sống từ thời Trung Cổ đã có cấu trúc nối tháp nhà thờ với tháp nhà thờ
      Đến giờ tim đường vẫn thẳng hàng hoàn hảo với hướng của các tháp nhà thờ. Quan niệm đất đai lấy nhà thờ làm trung tâm này khá giống với người La Mã