4 điểm bởi GN⁺ 2023-09-12 | 1 bình luận | Chia sẻ qua WhatsApp
  • Trình xem WebGL cho phép mở và thao tác trực tiếp cảnh 3D Gaussian Splat trong trình duyệt, với mã triển khai được công khai trên GitHub
  • Hỗ trợ từ bàn phím, chuột, trackpad, cảm ứng đến gamepad, bao quát rộng rãi môi trường nhập liệu trên desktop và di động
  • Điều khiển camera được chia thành di chuyển, xoay quỹ đạo, nghiêng và roll, cho phép khám phá cùng một cảnh theo nhiều cách khác nhau tùy thiết bị nhập liệu
  • Có thể chuyển sang các góc nhìn camera tải sẵn, chuyển tuần tự camera và tiếp tục hoạt ảnh mặc định bằng các phím số cùng -, +, p
  • Có thể kéo và thả tệp .ply để chuyển đổi sang .splat, và tải cấu hình camera bằng cameras.json

WebGL 3D Gaussian Splat Viewer

  • WebGL 3D Gaussian Splat Viewer là trình xem 3D Gaussian Splat do Kevin Kwok tạo ra
  • Mã nguồn được công khai trên Github

Thao tác theo thiết bị nhập liệu

  • Di chuyển bằng bàn phím

    • Mũi tên trái/phải: di chuyển sang trái/phải
    • Mũi tên lên/xuống: di chuyển tiến/lùi
    • Space: nhảy
  • Góc camera

    • a / d: xoay camera sang trái/phải
    • w / s: nghiêng camera lên/xuống
    • q / e: roll camera ngược chiều/thuận chiều kim đồng hồ
    • i / k, j / l: xoay quỹ đạo
  • Trackpad

    • Cuộn: xoay quỹ đạo theo chiều dọc và ngang
    • Pinch: di chuyển tiến/lùi
    • Ctrl + cuộn: di chuyển tiến/lùi
    • Shift + cuộn: di chuyển lên/xuống hoặc sang trái/phải
  • Chuột

    • Nhấp rồi kéo: xoay quỹ đạo
    • Nhấp chuột phải hoặc kéo lên/xuống cùng phím Ctrl/Cmd: di chuyển
  • Cảm ứng

    • Một ngón tay: xoay quỹ đạo
    • Chụm hai ngón: di chuyển tiến/lùi
    • Xoay hai ngón: xoay camera theo/ ngược chiều kim đồng hồ
    • Kéo hai ngón: di chuyển sang trái/phải và lên/xuống
  • Gamepad

    • Hoạt động nếu có tay cầm chơi game được kết nối

Camera và xử lý tệp

  • Điều khiển góc nhìn camera

    • 0-9: chuyển sang một trong các góc nhìn camera được tải sẵn
    • - hoặc +: chuyển tuần tự qua các camera đã tải
    • p: tiếp tục hoạt ảnh mặc định
  • Kéo và thả

    • Tệp .ply: chuyển đổi sang .splat
    • cameras.json: tải camera

1 bình luận

 
GN⁺ 2023-09-12
Ý kiến trên Hacker News
  • Thật sự rất hay, nhưng cách điều khiển khá khó hiểu
    Thay vì di chuyển WASD thông thường và xoay góc nhìn bằng chuột, kéo chuột lại dùng để tiến/lùi và quay quỹ đạo quanh một điểm cụ thể, A/D di chuyển trái/phải, còn W/S dùng để nhìn lên/xuống
    Danh sách điều khiển đầy đủ có trong README: https://github.com/antimatter15/splat#controls

    • Tôi là tác giả, xin lỗi vì điều khiển camera bất tiện. Tôi sẵn sàng nhận pull request đổi sang cách hợp lý hơn
      Ý định ban đầu là chỉ dùng các phím mũi tên để có thể di chuyển kiểu xoay người tại chỗ và đi tới/lùi
    • Khá giống điều khiển FPS trên N64, ví dụ như GoldenEye
      Cấu trúc là dùng phím mũi tên/joystick cho “di chuyển chính” gồm tiến/lùi và xoay trái/phải, còn WASD/nút C cho “di chuyển phụ” gồm đi ngang trái/phải và nhìn lên/xuống
    • Nhân tiện, tôi khá thích cách điều khiển chỉ bằng chuột
    • Nói thật thì cách điều khiển quá thiếu trực quan và tệ đến mức tôi bị kẹt trước cả khi kịp thưởng thức demo rendering
  • Thật sự rất tuyệt. Tôi cũng đang port gaussian-splatting [0] sang WebGPU
    Cũng như các implementation khác mà tôi từng thấy, implementation này có vẻ mắc cùng một lỗi khi chiếu ellipsoid trong phép chiếu phối cảnh. Nó tính covariance trong 3D trước rồi chiếu xuống 2D[1], nhưng cách này chỉ đúng với phép chiếu song song/trực giao, còn áp dụng cho phối cảnh thì cho kết quả sai
    Với phép chiếu phối cảnh có thêm ba hiệu ứng. Dịch chuyển thị sai làm thay đổi hình dạng ellipse được chiếu, phép quay của ellipsoid có thể làm thay đổi vị trí biểu kiến và tạo thêm dịch chuyển song song, và đường conic có thể không chỉ là ellipse mà còn là parabol hoặc hyperbol
    Có vẻ hiệu ứng đầu tiên được hiệu chỉnh thủ công bằng ma trận này[2], nhưng hai hiệu ứng sau thì chưa thấy implementation nào đưa vào tính toán. Muốn làm đúng thì không nên tính covariance 3D, mà phải tìm nón biên của ellipsoid với vị trí camera làm đỉnh, rồi lấy giao với mặt phẳng nhìn. Đường conic thu được sẽ là đường viền chính xác của ellipsoid sau khi chiếu phối cảnh
    [0]: https://github.com/graphdeco-inria/gaussian-splatting
    [1]: https://github.com/antimatter15/splat/blob/3695c57e8828fedc2...
    [2]: https://github.com/antimatter15/splat/blob/3695c57e8828fedc2...

    • Nói chung, Gaussian sau khi chiếu qua camera không còn là Gaussian thật sự nữa, vì hàm chiếu của camera lỗ kim là phi tuyến do có phép chia cho z
      Tuy nhiên, nếu Gaussian nhỏ so với kích thước ảnh thì có thể xấp xỉ bằng cách tuyến tính hóa hàm chiếu. Vì vậy bài báo Gaussian Splatting dùng Jacobian của hàm chiếu như trong công thức 5[0]
      Trên thực tế, phép xấp xỉ này rất khớp. Ma trận được nói đến trong liên kết thứ ba chính là Jacobian đó, không phải hiệu chỉnh thủ công mà là hợp lệ về mặt toán học. Xem quá trình suy dẫn tại [1]
      [0] https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_...
      [1] https://math.stackexchange.com/a/4716514/43771
    • Có vẻ đúng. Tức là xem phép chiếu như một biến đổi tuyến tính trong tọa độ Descartes, rồi dùng nó để biến đổi Gaussian
      Nhìn cách khác, đó là xấp xỉ phép chiếu bằng giả định rằng toàn bộ Gaussian nằm ở một độ sâu cố định; nếu đủ xa thì có lẽ sẽ hoạt động
      Biến đổi xạ ảnh của Gaussian trông khá phiền phức, nhưng chắc đã có ai đó làm rồi. Trong tọa độ xạ ảnh thì có vẻ khả thi, nhưng phần chiếu về tọa độ Descartes ở cuối mới khó
      Nhân tiện, chỉ chiếu đường viền cũng sai. Toàn bộ phân bố mật độ thay đổi, và điều đó cũng ảnh hưởng đến đường viền
    • Tôi không quen với kỹ thuật gaussian splat, nhưng về bản chất có phải nó giống mesh tứ giác có dữ liệu nội bộ ở các đỉnh không
      Tôi tưởng phép chiếu tứ giác vốn đã là bài toán được giải rồi; bạn có thể giải thích thêm nó khác gì so với một mảng tứ giác đơn giản không?
    • Nếu có thể triển khai ý tưởng giao với nón biên mà không ảnh hưởng đến frame rate thì có vẻ WebGPU sẽ mượt hơn. Dù vậy, sẽ rất thú vị nếu thấy khác biệt khi so sánh trong cùng điều kiện với implementation kiểu này
  • Khi zoom out, có thể thấy nhiều cạnh đa giác trông như không nên tồn tại
    Có vẻ như đang vẽ các “khối” mềm nhưng tọa độ texture hơi lệch; tôi tò mò không biết đây là bug hay là một phần có chủ đích của kỹ thuật này

    • Đây là có chủ đích
      Về cơ bản nó là point cloud bán dày đặc[1], nhưng thay vì các điểm thì có các khối được điều chỉnh màu sắc, góc và kích thước để khớp với ảnh đầu vào. Vì vậy nó được tối ưu để xem ở một khoảng cách nhất định
      Có thể nghĩ nó giống như vẽ vector 3D. Nếu phóng quá to hoặc tách riêng một phần ra, tổng thể bắt đầu trông hơi kỳ lạ
      [1]https://www.researchgate.net/publication/326621750/figure/fi...
  • Từ trước đến nay tôi chỉ thấy gaussian splatting được dùng cho dữ liệu ảnh
    Liệu có thể dùng cho các loại dữ liệu đồ họa khác không? Nói cách khác, nó có khả năng được dùng trong game không?

    • Còn tùy tình huống. Các cách tiếp cận trường bức xạ như gaussian splatting về cơ bản là ảnh 3D
      Nó chỉ chứa màu sắc theo vị trí và hướng hình học, không có các khái niệm về bề mặt, vật liệu hay truyền ánh sáng nói chung, tức là phát xạ, hấp thụ, truyền qua, phản xạ, tán xạ. Nói cách khác, chỉ có thể có ánh sáng được tính sẵn và cảnh tĩnh, còn hoạt ảnh thì khó
      Ngành có vẻ đang đi theo hướng cho phép chiếu sáng động tốt hơn, như kết xuất dựa trên vật lý (PBR) và ray/path tracing
      Ngoài ra hiện tại hiệu quả không gian cực kỳ thấp. Một cảnh trong engine kết xuất truyền thống chỉ cần vài chục GB có thể lên tới đơn vị TB. Tuy nhiên có thể sẽ cải thiện nếu được tối ưu thêm
      Một ngoại lệ mà gaussian splatting có thể thú vị là nội dung thủ tục/sinh tạo, thậm chí có thể cả nội dung có hoạt ảnh. Đặc biệt nó có thể rất phù hợp với hiệu ứng thể tích hiện đang dùng hệ thống hạt, như khói, lửa, mây, nước chảy
    • Không có lý do gì là không thể. Rốt cuộc nó chỉ là một point cloud đẹp mắt mà thôi
      Có thể dễ dàng hình dung một game open-world kiểu Minecraft dùng cái này làm engine cơ bản thay vì voxel
  • Kỹ thuật này có hoạt động với video không?
    Nhìn README[1] của công trình INRIA thì có vẻ họ huấn luyện một mô hình cho mỗi cảnh tĩnh, vậy video có bị loại trừ không?
    [1] https://github.com/graphdeco-inria/gaussian-splatting

  • Tôi đang xem cái gì vậy?

    • Gaussian splatting là cách gọi mỹ miều cho point cloud dùng các hình có màu thay vì các điểm
      Đây là phương pháp đã có từ lâu, nhưng không được dùng nhiều vì nếu point cloud có một triệu điểm thì phải xử lý một triệu điểm đó một cách có tính nghệ thuật
      Nó giống tóc 3D. Nguyên lý thì đơn giản: chỉ cần kết xuất 1 tỷ sợi tóc, nhưng để thực sự trông đẹp thì rất khó
      Ở đây, người ta để mô hình machine learning điều chỉnh góc, màu sắc, hình dạng, kích thước của một triệu hình cơ bản, chẳng hạn hình vuông, hình tròn, hình tam giác, để chúng trông giống các bức ảnh mà chúng ta cung cấp
    • Về cơ bản là công trình này: https://github.com/graphdeco-inria/gaussian-splatting — một cách tiếp cận hơi khác để kết xuất cảnh 3D
  • Đây có phải dùng phương pháp do Kerbl và Kopanas đề xuất tại SIGGRAPH 2023 không?
    https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/

    • Đúng. Tuy nhiên đây chỉ triển khai phần splatting/rendering, chứ không phải phần tối ưu hóa ban đầu để tạo ra bản tái dựng
  • Thật sự ấn tượng. Point cloud cũng thú vị, nhưng cái này còn đáng kinh ngạc hơn nhiều. Nó chạy 60fps ngay cả trên laptop Lenovo dùng ở công ty tôi

    • Trên điện thoại tầm trung cũng chạy được 36fps. Tôi không ngờ
      Tuy nhiên đặc biệt khi di chuyển camera thì thấy khá nhiều artifact
  • Nếu làm cho cái này chạy được trong ThreeJS, tôi nghĩ nó có thể để lại dấu ấn trong lịch sử 3D trên web

  • Tôi chưa từng gặp kiểu thao tác chuột như thế này trong chế độ xem 3D, nên đã bối rối khá lâu