Show HN: WebGL में रीयल-टाइम 3D Gaussian Splatting
(antimatter15.com)- यह एक WebGL viewer है जिसमें ब्राउज़र में ही 3D Gaussian Splat scene को सीधे खोला और नियंत्रित किया जा सकता है, और इसका implementation code GitHub पर सार्वजनिक है
- कीबोर्ड, माउस, ट्रैकपैड, टच और गेमपैड तक का समर्थन है, इसलिए desktop और mobile इनपुट वातावरण को व्यापक रूप से कवर करता है
- कैमरा नियंत्रण को move, orbit rotation, tilt और roll में बाँटा गया है, और अलग-अलग input devices से उसी scene को अलग तरीके से explore किया जा सकता है
- number keys और
-,+,pके जरिए preloaded camera views बदलना, कैमरों के बीच cycle करना, और default animation फिर से शुरू करना संभव है .plyfile को drag-and-drop करके.splatमें बदला जा सकता है, औरcameras.jsonसे camera settings लोड की जा सकती हैं
WebGL 3D Gaussian Splat Viewer
- WebGL 3D Gaussian Splat Viewer Kevin Kwok द्वारा बनाया गया 3D Gaussian Splat viewer है
- कोड Github पर सार्वजनिक है
इनपुट डिवाइस के अनुसार नियंत्रण
-
कीबोर्ड मूवमेंट
- बायाँ/दायाँ arrow: बाएँ/दाएँ move
- ऊपर/नीचे arrow: आगे/पीछे move
- Space: jump
-
कैमरा एंगल
a/d: कैमरा बाएँ/दाएँ rotatew/s: कैमरा ऊपर/नीचे tiltq/e: कैमरा counterclockwise/clockwise rolli/k,j/l: orbit rotation
-
ट्रैकपैड
- scroll: ऊपर-नीचे-बाएँ-दाएँ orbit rotation
- pinch: आगे/पीछे move
Ctrl+ scroll: आगे/पीछे moveShift+ scroll: ऊपर-नीचे move या बाएँ/दाएँ move
-
माउस
- क्लिक के बाद drag: orbit rotation
- right click या
Ctrl/Cmdkey के साथ ऊपर-नीचे drag: move
-
टच
- एक उंगली: orbit rotation
- दो उंगलियों से pinch: आगे/पीछे move
- दो उंगलियों से rotation: कैमरा clockwise/counterclockwise rotate
- दो उंगलियों से pan: बाएँ/दाएँ और ऊपर/नीचे move
-
गेमपैड
- connected game controller होने पर काम करता है
कैमरा और फ़ाइल प्रोसेसिंग
-
कैमरा व्यू नियंत्रण
0-9: preloaded camera views में से किसी एक पर switch-या+: लोड किए गए कैमरों के बीच cyclep: default animation फिर से शुरू
-
ड्रैग-एंड-ड्रॉप
.plyfile:.splatमें convertcameras.json: camera load
1 टिप्पणियां
Hacker News की राय
वाकई शानदार है, लेकिन controls उलझाने वाले हैं
सामान्य WASD movement और mouse से viewpoint rotation के बजाय, mouse drag आगे-पीछे movement और किसी खास point के चारों ओर orbit rotation करता है, और A/D left-right movement, W/S ऊपर-नीचे देखने की तरह काम करते हैं
controls की पूरी list README में है: https://github.com/antimatter15/splat#controls
मूल इरादा था कि सिर्फ arrow keys से, अपनी जगह पर शरीर घुमाते हुए और आगे-पीछे चलते हुए move किया जा सके
arrow keys/joystick से आगे-पीछे movement और left-right rotation वाला “main movement”, और WASD/C buttons से left-right movement और up-down view वाला “secondary movement” करने की संरचना है
वाकई शानदार। मैं भी gaussian-splatting [0] को WebGPU पर port करने पर काम कर रहा हूँ
अब तक देखे गए दूसरे implementations की तरह, यह implementation भी perspective projection में ellipsoid को project करते समय वही गलती करता लगता है। पहले 3D में covariance calculate करके फिर 2D में project करने का तरीका[1] है, लेकिन यह approach केवल parallel/orthographic projection में सही है और perspective projection पर लागू करने से गलत नतीजे मिलते हैं
perspective projection में तीन अतिरिक्त effects होते हैं। parallax shift से projected ellipse का shape बदलता है, ellipsoid का rotation apparent position बदलकर अतिरिक्त translation पैदा कर सकता है, और conic section सिर्फ ellipse ही नहीं बल्कि parabola और hyperbola भी हो सकता है
पहले effect को इस matrix[2] से manually correct किया गया लगता है, लेकिन बाद के दो effects अब तक देखे गए implementations की calculation में शामिल नहीं थे। सही तरीके के लिए 3D covariance calculate करने के बजाय, camera position को vertex मानकर ellipsoid का boundary cone निकालना चाहिए और फिर उसे view plane से intersect करना चाहिए। उससे निकला conic section perspective-projected ellipsoid की exact outline होता है
[0]: https://github.com/graphdeco-inria/gaussian-splatting
[1]: https://github.com/antimatter15/splat/blob/3695c57e8828fedc2...
[2]: https://github.com/antimatter15/splat/blob/3695c57e8828fedc2...
लेकिन अगर Gaussian image size की तुलना में छोटा हो, तो projection function को linearize करके approximate किया जा सकता है। इसलिए Gaussian Splatting paper equation 5 की तरह projection function का Jacobian इस्तेमाल करता है[0]
असल में यह approximation बहुत अच्छी तरह match करता है। तीसरे link में जिस matrix की बात है, वही Jacobian है, और यह manual correction नहीं बल्कि mathematically valid है। derivation के लिए [1] देखें
[0] https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_...
[1] https://math.stackexchange.com/a/4716514/43771
दूसरे तरीके से देखें तो यह मानकर projection approximate किया जा रहा है कि पूरा Gaussian fixed depth पर है; अगर वह पर्याप्त दूर हो तो काम करता लगता है
Gaussian का projective transform काफ़ी झंझट वाला लगता है, लेकिन लगता है किसी ने किया होगा। projective coordinates में संभव लगता है, पर अंत में Cartesian coordinates में project करने वाला हिस्सा मुश्किल है
वैसे, सिर्फ outline project करना भी गलत है। पूरी density distribution बदलती है, और वह भी outline को प्रभावित करती है
मुझे लगा था कि quadrilateral projection पहले से solved problem है; क्या आप समझा सकते हैं कि यह साधारण quadrilateral array से कैसे अलग है?
zoom out करने पर बहुत सारे polygon edges दिखते हैं जो असल में होने नहीं चाहिए लगते
ऐसा लगता है जैसे smooth “blobs” draw करने की कोशिश है लेकिन texture coordinates थोड़े misaligned हैं; सोच रहा हूँ कि यह bug है या technique का intended हिस्सा
मूल रूप से यह semi-dense point cloud[1] है, जिसमें points की जगह ऐसे blobs हैं जिनके color, angle और size input photos से match करने के लिए adjusted हैं। इसलिए यह एक खास दूरी से देखने के लिए optimized है
इसे 3D vector drawing जैसा समझें। अगर बहुत zoom in करें या इसका कोई हिस्सा अलग कर दें, तो पूरी चीज़ थोड़ी अजीब दिखने लगती है
[1]https://www.researchgate.net/publication/326621750/figure/fi...
अब तक मैंने gaussian splatting को सिर्फ फोटो डेटा के लिए इस्तेमाल होते देखा है
क्या इसे दूसरे ग्राफिक्स डेटा पर भी इस्तेमाल किया जा सकता है? दूसरे शब्दों में, क्या इसे गेम्स में इस्तेमाल करने की संभावना है?
इसमें केवल geometry की position और direction के हिसाब से color होता है, surface, material और light transport के सामान्य concepts—यानी emission, absorption, transmission, reflection, scattering—नहीं होते। यानी सिर्फ precomputed lighting और static scenes संभव हैं, animation मुश्किल है
लगता है industry physical-based rendering (PBR) और ray/path tracing जैसी उन approaches की ओर जा रही है जो बेहतर dynamic lighting संभव बनाती हैं
साथ ही फिलहाल इसकी space efficiency बेहद कम है। traditional rendering engine में जिस scene के लिए कुछ दर्जन GB काफी होंगे, वह TB scale तक जा सकता है। हालांकि और optimization होने पर यह बेहतर हो सकता है
exception के तौर पर gaussian splatting जहाँ interesting हो सकता है, वह procedural/generative content है, शायद animation तक वाला content भी। खासकर smoke, fire, clouds, flowing water जैसे volumetric effects के लिए, जहाँ अभी particle systems इस्तेमाल होते हैं, यह अच्छी तरह fit हो सकता है
voxels की जगह इसे basic engine के रूप में इस्तेमाल करने वाला open-world Minecraft-style game आसानी से imagine किया जा सकता है
क्या यह technique video पर भी काम करेगी?
INRIA work के README[1] को देखने पर लगता है कि हर static scene के लिए model train किया जाता है, तो क्या इसका मतलब video बाहर हो जाता है?
[1] https://github.com/graphdeco-inria/gaussian-splatting
[1] https://arxiv.org/abs/2308.09713
[2] https://dynamic3dgaussians.github.io/
मैं अभी क्या देख रहा हूँ?
यह तरीका बहुत पहले से है, लेकिन अगर point cloud में दस लाख points हों तो उन दस लाखों को artistic तरीके से handle करना पड़ता है, इसलिए इसका ज्यादा इस्तेमाल नहीं हुआ
यह 3D hair जैसा है। principle simple है—बस 1 अरब hair strands render कर दो—लेकिन असल में उसे अच्छा दिखाना मुश्किल है
यहाँ machine learning model को दस लाख basic shapes, जैसे squares, circles, triangles आदि के angle, color, shape और size adjust करने दिए जाते हैं, ताकि वे हमारी दी हुई photos जैसे दिखें
क्या यह SIGGRAPH 2023 में Kerbl और Kopanas द्वारा propose की गई method इस्तेमाल करता है?
https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/
सच में कमाल है। point clouds भी interesting हैं, लेकिन यह उससे कहीं ज्यादा चौंकाने वाला है। कंपनी में इस्तेमाल होने वाले Lenovo laptop पर भी 60fps पर चलता है
हालांकि खासकर camera move करने पर काफी artifacts दिखते हैं
अगर इसे ThreeJS के अंदर चलने लायक बना दिया जाए, तो लगता है web 3D history में अपनी छाप छोड़ी जा सकती है
3D view में इस तरह के mouse controls मैंने पहले कभी experience नहीं किए थे, इसलिए कुछ देर तक मैं काफी confused रहा