Show HN: 3D Gaussian Splat thời gian thực trong WebGL
(antimatter15.com)- 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ằngcameras.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ảiw/s: nghiêng camera lên/xuốngq/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ùiShift+ 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ảip: 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
- Tệp
1 bình luận
Ý 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
Ý đị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
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
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...
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
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 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?
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
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?
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
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
[1] https://arxiv.org/abs/2308.09713
[2] https://dynamic3dgaussians.github.io/
Tôi đang xem cái gì vậy?
Đâ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
Đâ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/
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
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