GLTFããã³GLBãšã¯äœã§ããïŒ
GLTFïŒGL Transmission FormatïŒã¯ã3Dã·ãŒã³ãšã¢ãã«ãä¿åããããã®ãã¡ã€ã«åœ¢åŒã§ãããéåžžã«ããããããïŒæ§é ã¯JSONæšæºã§èšè¿°ãããŠããŸãïŒãæ¡åŒµå¯èœã§ãææ°ã®Webãã¯ãããžãŒãšç°¡åã«ããåãã§ããŸãã ãã®åœ¢åŒã¯ã3次å ã·ãŒã³ãé©åã«å§çž®ããWebGLããã³ãã®ä»ã®APIã䜿çšããã¢ããªã±ãŒã·ã§ã³ã®å®è¡æéãæå°éã«æããŸãã çŸåšãGLTFã¯Khronos Groupã«ãã£ãŠ3Dã®äžçããã®JPEGãšããŠç©æ¥µçã«å®£äŒãããŠããŸãã GLTFããŒãžã§ã³2.0ãçŸåšäœ¿çšãããŠããŸãã GLBãšåŒã°ãããã®åœ¢åŒã®ãã€ããªããŒãžã§ã³ããããŸãããå¯äžã®éãã¯ããã¹ãŠãGLBæ¡åŒµåãæã€1ã€ã®ãã¡ã€ã«ã«ä¿åãããããšã§ãã
ãã®èšäºã¯2ã®1ã§ãã ãã®äžã§ã SceneãNodeãBufferãBufferViewãAccessorãMeshãªã©ã®ãã©ãŒãããã¢ãŒãã£ãã¡ã¯ããšãã®å±æ§ãæ€èšããŸãã 2çªç®ã®èšäºã§ã¯ãæ®ãã®ãããªã¢ã«ããã¯ã¹ãã£ãã¢ãã¡ãŒã·ã§ã³ãã¹ãã³ãã«ã¡ã©ã«ã€ããŠæ€èšããŸãã ããäžè¬çãªåœ¢åŒã®æ
å ±ã¯ã ããã§èŠã€ããããšãã§ããŸã ã
èšäºã®é²èŠ§äžã«ãã®åœ¢åŒã§å人çã«äœæ¥ãããå Žåã¯ã GitHubã®å
¬åŒKhronosãªããžããªããGLTF 2.0ã¢ãã«ãããŠã³ããŒãã§ããŸãã
åé¡ãšãã®è§£æ±ºç
åœåãGLTF圢åŒã¯ãã€ã³ã¿ãŒããããä»ããŠ3Dã³ã³ãã³ãã転éããããã®ãœãªã¥ãŒã·ã§ã³ãšããŠKhronos Groupã«ãã£ãŠèæ¡ãããã°ã©ãã£ãã¯APIã䜿çšããŠäœæãããããŸããŸãªã¿ã€ãã®ã€ã³ããŒã¿ãŒãšã³ã³ããŒã¿ãŒã®æ°ãæå°éã«æããããã«èšèšãããŸããã
çŸåšãGLTFãšãã®ãã€ããªå åŒGLBã¯ãCADããã°ã©ã ïŒAutodesk MayaãBlenderãªã©ïŒãã²ãŒã ãšã³ãžã³ïŒUnreal EngineãUnityãªã©ïŒãAR / VRã¢ããªã±ãŒã·ã§ã³ããœãŒã·ã£ã«ãµãŒãã¹ã§çµ±äžããã圢åŒãšããŠäœ¿çšãããŠããŸãã ãããã¯ãŒã¯ãªã©
ã¯ããã¹ã°ã«ãŒãã®ä»£è¡šè ã¯æ¬¡ã®ããã«è¿°ã¹ãŠããŸãã
- GLTFã¯æ®éçã§ã-åçŽãªãžãªã¡ããªã ãã§ãªããã¢ãã¡ãŒã·ã§ã³ãããŸããŸãªãããªã¢ã«ãªã©ã®è€éãªã·ãŒã³ã«ãåæ§ã«äœ¿çšã§ããŸãã
- ãšãŠãã³ã³ãã¯ãã§ãã ã¯ããããã¯è°è«ã®äœå°ããããŸãããã¹ãŠãå€æã¢ã«ãŽãªãºã ã«äŸåããŠããããã§ããGLBXãå ã®ãã¡ã€ã«ããã倧ããå ŽåïŒFBXãã¡ã€ã«ãªã©ïŒãå人çã«ç¥ã£ãŠããŸãããã»ãšãã©ã®å Žåã¯ããã§ãã
- ããŒã¿åæã®å®¹æãã¯ããã®åœ¢åŒã®æ ¹æ¬çãªãã©ã¹ã§ãã GLTFéå±€ã¯JSONã䜿çšãããžãªã¡ããªã¯ãã€ããªåœ¢åŒã§ä¿åãããããããã³ãŒãã¯äžèŠã§ãïŒ
座æšç³»ãšåäœ
GLTFã¯å³æ座æšç³»ã䜿çšããŸããã€ãŸãã+ Xãš+ Yã®å€ç©ã«ãã+ ZãåŸãããŸããããã§ã+ Yã¯äžéšè»žã§ãã 3D GLTFã¢ã»ããã®åé¢ã¯+ Z軞ã«é¢ããŠããŸãã ãã¹ãŠã®çŽç·è·é¢ã®æž¬å®åäœã¯ã¡ãŒãã«ã§ãè§åºŠã¯ã©ãžã¢ã³ã§æž¬å®ããããªããžã§ã¯ãã®æ£ã®å転ã¯åæèšåãã§ãã ã¢ãã¡ãŒã·ã§ã³ã®ããŒãå€æãšãã£ãã«ãã¹ã¯ã次ã®ããŒã¿åãšã»ãã³ãã£ã¯ã¹ãæã€3次å ãã¯ãã«ãŸãã¯ã¯ã©ãŒã¿ããªã³ã§ãã
translation ïŒxãyãz軞ã«æ²¿ã£ãå¹³è¡ç§»åãå«ã3次å
ãã¯ãã«
å転 ïŒã¯ã©ãŒã¿ããªã³ïŒxãyãzãwïŒãwã¯ã¹ã«ã©ãŒ
scale ïŒxãyãzã¹ã±ãŒãªã³ã°ä¿æ°ãå«ã3次å
ãã¯ãã«
GLTF-å 芳
äžèšã®ããã«ãGLTFã¯ãéåžžã2ã€ã®ãã¡ã€ã«ã§æ§æãããŸãã1ã€ç®ã¯.gltf圢åŒã§3Dã·ãŒã³ã®æ§é ãJSON圢åŒã§ä¿åãã2ã€ç®ã¯.bin圢åŒã§ãã®ã·ãŒã³ã®ãã¹ãŠã®ããŒã¿ãçŽæ¥ä¿åããŸãã
圢åŒæ§é ã¯å³å¯ã«éå±€çã§ããã次ã®åœ¢åŒããšããŸãã
æ§é ã«ã€ããŠããã«èª¬æããŸãããæãåçŽãªGLTFãã¡ã€ã«ã®äŸã䜿çšããŸããGLTFãã¡ã€ã«ã«ã¯ã1ã€ã®çé¢äžè§åœ¢ãããã©ã«ãã®ãããªã¢ã«ãšãšãã«ä¿åãããŸãã å¿ èŠã«å¿ããŠãä»»æã®GLTFãã¥ãŒã¢ãŒã«ã³ããŒã¢ã³ãããŒã¹ãããŠããã¡ã€ã«ã®å 容ãå人çã«ãæãããããšãã§ããŸãã ç§ã®ç·Žç¿ã§ã¯ãããŸããŸãªãã®ã䜿çšããŸããã ãThunder.jsãå éšã§äœ¿çšããããã§è§£æ±ºããŸããã ãŸããGLTFãã©ã°ã€ã³ã§Visual Studio Codeã䜿çšããããšãè¯ãéžæè¢ã§ãã ãããã£ãŠãBabylon.jsãCesiumãThree.jsã®3ã€ã®ãšã³ãžã³ããããã«éžæã§ããŸãã
ã·ãŒã³ããã³ããŒââãèŠçŽ
æåã®æåã®ãã®ã¯ãã·ãŒã³ãšåŒã°ããã¡ã€ã³ããŒãã§ãã ããã¯ããã¹ãŠãéå§ããããã¡ã€ã«å ã®ã«ãŒããã€ã³ãã§ãã ãã®ããŒãã«ã¯ãGLTFãä¿åããã·ãŒã³ã®é åãšããã¡ã€ã«ãéããåŸã«ããã©ã«ãã§ããŒããããã·ãŒã³ã®éžæãå«ãŸããŸãã 3Dã·ãŒã³ã®ã³ã³ãã³ãã¯ããããŒãããšåŒã°ãã次ã®ãªããžã§ã¯ãããå§ãŸããŸãã ã·ãŒã³ãšããŒãã®é åã¯ãç¡é§ã§ã¯ãªãããšã«èšåããŸããã è€æ°ã®ã·ãŒã³ã1ã€ã®ãã¡ã€ã«ã«ä¿åããæ©èœãå®è£ ãããŠããŸãããå®éã«ã¯1ã€ã®ã·ãŒã³ã1ã€ã®ãã¡ã€ã«ã«ä¿åããããšããŸãã
{ "scenes" : [ { "nodes" : [ 0 ] } ], "nodes" : [ { "mesh" : 0 } ], "scene": 0
åããŒãã¯ãåã ã®ãªããžã§ã¯ããèšè¿°ããããã®ããšã³ããªãã€ã³ããã§ãã ãªããžã§ã¯ããè€éã§è€æ°ã®ã¡ãã·ã¥ã§æ§æãããŠããå Žåããã®ãããªãªããžã§ã¯ãã¯ã芪ãããŒããšãåãããŒãã«ãã£ãŠèšè¿°ãããŸãã ããšãã°ãè»äœãšè»èŒªã§æ§æãããèªåè»ã¯ã次ã®ããã«èšè¿°ã§ããŸããã¡ã€ã³ããŒãã¯ãèªåè»ãç¹ã«è»äœãè¡šããŸãã ãã®ããŒãã«ã¯ããåããŒããã®ãªã¹ããå«ãŸããŠããŸãããã®ãªã¹ãã¯ããã€ãŒã«ãªã©ã®æ®ãã®ã³ã³ããŒãã³ããé çªã«èª¬æããŠããŸãã ãã¹ãŠã®èŠçŽ ã¯ååž°çã«åŠçãããŸãã ããŒãã«ã¯ãTRSïŒå¹³è¡ç§»åãå転ãã¹ã±ãŒã«ãå¥åå€äœãå転ãããã³ã¹ã±ãŒãªã³ã°ïŒã¢ãã¡ãŒã·ã§ã³ãå«ããããšãã§ããŸãã ãã®ãããªå€æã¯ãã¡ãã·ã¥èªäœã«çŽæ¥åœ±é¿ãããšããäºå®ã«å ããŠããŸã£ããåãæ¹æ³ã§åããŒãã«ã圱é¿ããŸãã äžèšã®ãã¹ãŠã«å ããŠããŠãŒã¶ãŒã®ãã¬ãŒã å ã«ãªããžã§ã¯ãã衚瀺ãã責任ãããå éšãã«ã¡ã©ããããå ŽåããããNodeãªããžã§ã¯ãã«ä»å ãããããšã«èšåãã䟡å€ããããšæããŸãã ãªããžã§ã¯ãã¯é©åãªå±æ§ã䜿çšããŠçžäºã«åç §ããŸããã·ãŒã³ã«ã¯ããŒãå±æ§ããããããŒããªããžã§ã¯ãã«ã¯ã¡ãã·ã¥å±æ§ããããŸãã ããããããããããã«ãäžèšã®ãã¹ãŠã次ã®å³ã«ç€ºããŸãã
ãããã¡ãŒãBufferViewãããã³ã¢ã¯ã»ãµãŒ
ãããã¡ãªããžã§ã¯ããšã¯ãæ§é ãç¶æ¿ãå€ãªãã®æªåŠçã®ãã€ããªããŒã¿ã®æ ŒçŽãæå³ããŸãã ãããã¡ã«ã¯ããžãªã¡ããªãã¢ãã¡ãŒã·ã§ã³ãã¹ããã³ã°ã«é¢ããæ å ±ãæ ŒçŽãããŸãã ãã€ããªããŒã¿ã®äž»ãªå©ç¹ã¯ãGPUã«ãã£ãŠéåžžã«å¹ççã«åŠçãããããšã§ãã ãããã解åãé€ããè¿œå ã®è§£æã¯å¿ èŠãããŸããã ãããã¡å ã®ããŒã¿ã¯URIå±æ§ã«ãã£ãŠèŠã€ããããšãã§ããŸããããã«ãããããŒã¿ã®å Žæãæ確ã«ãªãã2ã€ã®ãªãã·ã§ã³ãããããŸãããããŒã¿ã¯.bin圢åŒã®å€éšãã¡ã€ã«ã«ä¿åãããããJSONèªäœã«åã蟌ãŸããŸãã æåã®å ŽåãURIã«ã¯å€éšãã¡ã€ã«ãžã®ãªã³ã¯ãå«ãŸããŸãããã®å ŽåãGLTFãã¡ã€ã«ãååšãããã©ã«ããŒã¯ã«ãŒããšèŠãªãããŸãã 2çªç®ã®å Žåããã¡ã€ã«ã¯.glb圢åŒã«ãªããŸããããã¯ããã¡ã€ã«ã®æ°ãšããç¹ã§ãGLTFã®å åŒã§ããGLB圢åŒãšãããããã³ã³ãã¯ããªãã®ãæããŸãã ãã€ããªãã¡ã€ã«ã®ããŒã¿ã¯ããã€ãåäœã§ãã®ãŸãŸä¿åãããŸãã
äžè§åœ¢ã®äŸã®JSONã¯æ¬¡ã®ããã«ãªããŸãã
base64ãšã³ã³ãŒããããã¡ã®äŸïŒ
"buffers" : [ { "uri" : "data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=", "byteLength" : 44 } ],
å€éšãã¡ã€ã«ãããå ŽåãJSONã¯ãã¥ãŒã次ã®ããã«å€æããŸãã
"buffers" : [ { "uri" : "duck.bin", "byteLength" : 102040 } ],
Buffersãããã¯ã«ã¯ããããã¡ãŒãµã€ãºã®å€ãæ ŒçŽããè¿œå ã®byteLengthå±æ§ããããŸãã
ãããã¡ããããŒã¿ãæ§é åããæåã®ã¹ãããã¯ãBufferViewãªããžã§ã¯ãã§ãã BufferViewã¯ãBufferããã®æ å ±ã®ãã¹ã©ã€ã¹ããšåŒã°ããŸããããã¯ããããã¡ãŒã®å é ããã®ç¹å®ã®ãã€ãã·ããã«ãã£ãŠç¹åŸŽä»ããããŸãã ãã®ãã¹ã©ã€ã¹ãã¯ãèªã¿åããããã¡ãŒã®å é ããã®ãã·ãããã«ãŠã³ããšã¹ã©ã€ã¹èªäœã®é·ãã®2ã€ã®å±æ§ã䜿çšããŠèšè¿°ãããŸãã äŸã«åºã¥ããŠäœ¿çšæ¹æ³ã説æããããã®ããã€ãã®BufferViewãªããžã§ã¯ãã®ç°¡åãªäŸïŒ
"bufferViews" : [ { "buffer" : 0, "byteOffset" : 0, "byteLength" : 6, "target" : 34963 }, { "buffer" : 0, "byteOffset" : 8, "byteLength" : 36, "target" : 34962 } ],
ã芧ã®ãšããããã®äŸã«ã¯4ã€ã®äž»èŠãªå±æ§ãå«ãŸããŠããŸãã
- ãããã¡ã¯ããããã¡ã®ã€ã³ããã¯ã¹ãæããŸãïŒ0ããå§ãŸããããã¡é åã®ã·ãŒã±ã³ã¹çªå·ïŒã
- byteOffset-ãã®ãã¹ã©ã€ã¹ãã®ãªãªãžã³ã®ãã·ãããããã€ãåäœã§å®çŸ©ããŸã
- byteLength- ãã¹ã©ã€ã¹ãã®é·ããå®çŸ©ããŸã
- target -bufferViewã«å«ãŸããããŒã¿ã®ã¿ã€ããå®çŸ©ããŸã
æåã®BufferViewã«ã¯ããããã¡ãŒã®æåã®6ãã€ããå«ãŸããã·ããã¯ãããŸããã 2çªç®ã®ãã¹ã©ã€ã¹ãã§ã¯ããã¹ãŠãããå°ãè€éã§ããã芧ã®ãšããããã®ã·ããã¯äºæ³ããã6çªç®ã§ã¯ãªã8ã¡ã¬ãã€ãã§ãã ãããã®2ãã€ãã¯ç©ºã§ããããããã£ã³ã°ããšåŒã°ããããã»ã¹ã®ãããã§ããããã¡ãŒçæããã»ã¹äžã«è¿œå ãããŸããã å€ã¯ãå¢çãã€ãã®å€ã4ãã€ãã«èª¿æŽããå¿ èŠããããŸãã ãã®ããªãã¯ã¯ããããã¡ããããŒã¿ãããéãç°¡åã«èªã¿åãããã«å¿ èŠã§ãã
ã¿ãŒã²ããå±æ§ã«ã€ããŠããã€ãã®èšèãèšã䟡å€ããããŸãã bufferViewã«ãã£ãŠåç §ãããæ å ±ã®ã¿ã€ããåé¡ããããã«äœ¿çšãããŸãã ãªãã·ã§ã³ã¯2ã€ã ãã§ããé ç¹å±æ§ãåç §ããããã«äœ¿çšãããå€34962ïŒé ç¹å±æ§-34962-ARRAY_BUFFERïŒãŸãã¯é ç¹ã€ã³ããã¯ã¹ã«äœ¿çšããã34963ïŒé ç¹ã€ã³ããã¯ã¹-34963-ELEMENT_ARRAY_BUFFERïŒã®ããããã§ãã Bufferå ã®ãã¹ãŠã®æ å ±ãç解ããŠæ§é åããæåŸã®ä»äžãã¯ãAccessorãªããžã§ã¯ãã§ãã
ã¢ã¯ã»ãµãŒã¯ãBufferViewã«ã¢ã¯ã»ã¹ãããªããžã§ã¯ãã§ãããBufferViewããã®ããŒã¿ã®ã¿ã€ããšå Žæã決å®ããå±æ§ãå«ã¿ãŸãã ã¢ã¯ã»ãµãŒã®ããŒã¿åã¯ãtypeããã³componentTypeã§ãšã³ã³ãŒããããŸãã typeå±æ§ã®å€ã¯æååã§ã次ã®å€ããããŸããã¹ã«ã©ãŒå€ã®å Žåã¯SCALARã3次å ãã¯ãã«ã®å Žåã¯VEC3ã4x4ãããªãã¯ã¹ãŸãã¯ã¯ã©ãŒã¿ããªã³ã®å Žåã¯MAT4ãå転ã®èª¬æã«äœ¿çšãããŸãã
次ã«ãComponentTypeã¯ããã®ããŒã¿ã®ã³ã³ããŒãã³ãã®ã¿ã€ãã瀺ããŸãã ããã¯GLå®æ°ã§ãããããšãã°ãèŠçŽ ã«æµ®åå°æ°ç¹ãªã©ãããããšã瀺ãããã«ã5126ïŒFLOATïŒãŸãã¯5123ïŒUNSIGNED_SHORTïŒãªã©ã®å€ãæã€ããšãã§ããŸãã
ãããã®ããããã£ã®ããŸããŸãªçµã¿åããã䜿çšããŠãä»»æã®ããŒã¿åãèšè¿°ã§ããŸãã äžè§åœ¢ã«åºã¥ãäŸã
"accessors" : [ { "bufferView" : 0, "byteOffset" : 0, "componentType" : 5123, "count" : 3, "type" : "SCALAR", "max" : [ 2 ], "min" : [ 0 ] }, { "bufferView" : 1, "byteOffset" : 0, "componentType" : 5126, "count" : 3, "type" : "VEC3", "max" : [ 1.0, 1.0, 0.0 ], "min" : [ 0.0, 0.0, 0.0 ] } ],
JSONã§è¡šãããå±æ§ãåæããŠã¿ãŸãããã
- bufferView-ã¢ã¯ã»ãµã䜿çšããBufferViewé åã®BufferViewã®ã·ãŒã±ã³ã¹çªå·ã瀺ããŸãã 次ã«ãBufferViewã¯ã€ã³ããã¯ã¹ã«é¢ããæ å ±ãä¿åããŸãã
- byteOffset-çŸåšã®ã¢ã¯ã»ãµãŒããããŒã¿ã®èªã¿åããéå§ããããã®ãã€ãã·ããã è€æ°ã®Accessorãªããžã§ã¯ãã1ã€ã®BufferViewãåç §ã§ããŸãã
- componentTypeã¯ãèŠçŽ ã®ã¿ã€ãã瀺ãå®æ°ã§ãã ããŒã¿åUNSIGNED_SHORTã«å¯Ÿå¿ããå€5123ããŸãã¯FLOATã®5126ãæã€ããšãã§ããŸãã
- count-ãããã¡ã«ä¿åãããŠããèŠçŽ ã®æ°ã衚瀺ããŸãã
- type-ããŒã¿åãå®çŸ©ããŸãïŒã¹ã«ã©ãŒããã¯ãã«ãè¡åã
- maxããã³min-空éå ã®ãããã®èŠçŽ ã®äœçœ®ã®æå°å€ãšæ倧å€ã決å®ããå±æ§ã
ã¡ãã·ã¥
Meshesãªããžã§ã¯ãã«ã¯ãã·ãŒã³ã«ããã¡ãã·ã¥ã«é¢ããæ å ±ãå«ãŸããŠããŸãã 1ã€ã®ããŒãïŒããŒããªããžã§ã¯ãïŒã«ä¿åã§ããã¡ãã·ã¥ã¯1ã€ã ãã§ãã ã¿ã€ããmeshã®åãªããžã§ã¯ãã«ã¯ãã¿ã€ããmesh.primitiveã®é åãå«ãŸããŠããŸãã次ã«ãããªããã£ãã¯ãã¡ãã·ã¥èªäœãæ§æããããªããã£ããªããžã§ã¯ãïŒäžè§åœ¢ãªã©ïŒã§ãã ãã®ãªããžã§ã¯ãã«ã¯å€ãã®è¿œå å±æ§ãå«ãŸããŠããŸããããããã¯ãã¹ãŠããªããžã§ã¯ãã®è¡šç€ºã«é¢ããæ å ±ã®æ£ããä¿åãšãã1ã€ã®ç®çã«åœ¹ç«ã¡ãŸãã ã¡ãã·ã¥ã®äž»ãªå±æ§ïŒ
- POSITION -XYZ軞ã«æ²¿ã£ãé ç¹ã®äœçœ®
- NORMAL-æ£èŠåãããXYZé ç¹æ³ç·
- TANGENT-é ç¹ã®XYZWã¿ã³ãžã§ã³ãã Wã¯æ¥ç·ã®æ¹åã瀺ãã+ 1ãŸãã¯-1ã®å€ãæã¡ãŸãã
- TEXCOORD_0 -UVãã¯ã¹ãã£åº§æšã è€æ°ã®ã»ãããä¿åã§ããŸãã
- COLOR_0-é ç¹ã®RGBãŸãã¯RGBAè²ã
- JOINTS_0-ãã®å±æ§ã«ã¯ã察å¿ãããžã§ã€ã³ãé åããã®ãžã§ã€ã³ã/ãžã§ã€ã³ãã®ã€ã³ããã¯ã¹ãå«ãŸããŸããããã¯ãé ç¹ïŒé ç¹ïŒã«åœ±é¿ããŸãã
- WEIGHTS_0-ãã®å±æ§ã®ããŒã¿ã¯ããžã§ã€ã³ããé ç¹ã«äžãã圱é¿ã瀺ãéã¿ã決å®ããŸãã
- weights-ã¢ãŒãã£ã³ã°ã®éã¿ãæ ãå±æ§ã
- ææ -ã€ã³ããã¯ã¹ãå«ãŸããŸããããã¯ãææé åå ã®ææã®æ°ã§ãã
ãã®ãªããžã§ã¯ãã«ã¯ããã®ã±ãŒã¹ã§ã¯æ¬¡ã®åœ¢åŒããããŸãã
"meshes" : [ { "primitives" : [ { "attributes" : { "POSITION" : 1 }, "indices" : 0 } ] } ],
æ®å¿µãªãããå¶éã®ããããã¹ãŠã®çŽ æã1ã€ã®èšäºã«åãŸããªãã£ããããæ®ãã¯2çªç®ã®èšäºã§èŠã€ããããšãã§ããŸããæ®ãã®ã¢ãŒãã£ãã¡ã¯ããçŽ æããã¯ã¹ãã£ãã¢ãã¡ãŒã·ã§ã³ãã¹ãã³ãã«ã¡ã© ã ããã³æå°éã®äœæ¥GLTFãã¡ã€ã«ãåéããŸãã
第2éšã®ç¶ç¶ïŒ https : //habr.com/en/post/448298/