WebXRå¹³é¢å¢çæ€åºãæ·±ãæãäžãã衚é¢ãšããžèªèæè¡ããŠãŒã¹ã±ãŒã¹ããŠã§ãäžã§é åçãªæ¡åŒµçŸå®äœéšãåµåºããããã®ãã¹ããã©ã¯ãã£ã¹ãæ¢ããŸãã
WebXRå¹³é¢å¢çæ€åºïŒæ²¡å ¥åäœéšã®ããã®è¡šé¢ãšããžèªè
WebXRã¯ããŠã§ããšã®å¯Ÿè©±æ¹æ³ã«é©åœãããããããã©ãŠã¶äžã§çŽæ¥ãæ²¡å ¥åã®æ¡åŒµçŸå®ïŒARïŒããã³ä»®æ³çŸå®ïŒVRïŒäœéšãå¯èœã«ããŠããŸããå€ãã®ARã¢ããªã±ãŒã·ã§ã³ã®éèŠãªèŠçŽ ã¯ãç©ççãªç°å¢ãçè§£ããç¹ã«è¡šé¢ãèå¥ããŠãããã³ã°ããèœåã§ããããã§å¹³é¢å¢çæ€åºãšè¡šé¢ãšããžèªèãéèŠã«ãªããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ããããã®æŠå¿µããã®å¿çšããããŠWebXRãããžã§ã¯ãã§ããããå®è£ ããæ¹æ³ã«ã€ããŠæ¢ããŸãã
WebXRå¹³é¢å¢çæ€åºãšã¯ïŒ
WebXRã«ãããå¹³é¢å¢çæ€åºãšã¯ãããã€ã¹ã®ã»ã³ãµãŒïŒã«ã¡ã©ãã¢ãŒã·ã§ã³ã»ã³ãµãŒãªã©ïŒã䜿çšããŠããŠãŒã¶ãŒã®ç°å¢å ã«ããå¹³ããªè¡šé¢ãèå¥ããå®çŸ©ããããã»ã¹ãæããŸããWebXR Device APIã¯ããã®æ å ±ã«ã¢ã¯ã»ã¹ããæ¹æ³ãæäŸããéçºè ãä»®æ³ã³ã³ãã³ããšçŸå®äžçãã·ãŒã ã¬ã¹ã«èåãããARäœéšãäœæã§ããããã«ããŸãã
ãã®æ žå¿ã«ãããŠã平颿€åºã«ã¯ä»¥äžã®ã¹ããããå«ãŸããŸãïŒ
- ã»ã³ãµãŒå ¥åïŒ ããã€ã¹ã¯åšå²ã®ç°å¢ã«é¢ããèŠèŠããŒã¿ãšæ £æ§ããŒã¿ããã£ããã£ããŸãã
- ç¹åŸŽæœåºïŒ ã¢ã«ãŽãªãºã ãã»ã³ãµãŒããŒã¿ãåæããè§ããšããžããã¯ã¹ãã£ãªã©ã®äž»èŠãªç¹åŸŽãèå¥ããŸãã
- å¹³é¢ãã£ããã£ã³ã°ïŒ æœåºãããç¹åŸŽã䜿çšããŠãåºãå£ãããŒãã«ãªã©ã®å¹³ããªè¡šé¢ã衚ãå¹³é¢ãé©åãããŸãã
- å¢çå®çŸ©ïŒ ã·ã¹ãã ã¯ãããã®å¹³é¢ã®å¢çãå®çŸ©ãããã®ç¯å²ãšåœ¢ç¶ãæŠèª¬ããŸãã
å¢çã¯éåžžãå€è§åœ¢ãšããŠè¡šçŸãããæ€åºããã衚é¢ã®æ£ç¢ºãªèŒªéãæäŸããŸãããã®å¢çæ å ±ã¯ãä»®æ³ãªããžã§ã¯ãã衚é¢ã«æ£ç¢ºã«é 眮ããçŸå®çãªã€ã³ã¿ã©ã¯ã·ã§ã³ãäœæããããã«äžå¯æ¬ ã§ãã
衚é¢ãšããžèªèïŒå¹³é¢ãè¶ ãã
平颿€åºã¯åºæ¬çã§ããã衚é¢ãšããžèªèã¯ç°å¢çè§£ãããã«äžæ©é²ããŸããããã¯å¹³ããªå¹³é¢ã ãã§ãªããæ§ã ãªãªããžã§ã¯ãã衚é¢ã®ãšããžãèå¥ããæåããããšã«çŠç¹ãåœãŠãŠããŸããããã«ã¯ãæ²é¢ãäžèŠåãªåœ¢ç¶ãè€éãªå¹ŸäœåŠåœ¢ç¶ãå«ãŸããŸãã衚é¢ãšããžèªèã¯ãããæ£ç¢ºã§èªç¶ãªã€ã³ã¿ã©ã¯ã·ã§ã³ãå¯èœã«ããããšã§ãARäœéšãåäžãããããšãã§ããŸãã
衚é¢ãšããžèªèã平颿€åºãè£å®ããæ¹æ³ã¯æ¬¡ã®ãšããã§ãïŒ
- 匷åããããªããžã§ã¯ãé çœ®ïŒ å®¶å ·ãã¢ãŒãã¯ãŒã¯ãªã©ãå¹³é¢ã§ãªã衚é¢ã«ä»®æ³ãªããžã§ã¯ããæ£ç¢ºã«é 眮ããŸãã
- çŸå®çãªãªã¯ã«ãŒãžã§ã³ïŒ ä»®æ³ãªããžã§ã¯ããå®å šã«å¹³ãã§ãªããŠããçŸå®äžçã®ãªããžã§ã¯ãã«ãã£ãŠæ£ããé®èœãããããšãä¿èšŒããŸãã
- æ¹åãããã€ã³ã¿ã©ã¯ã·ã§ã³ïŒ ãŠãŒã¶ãŒãè§ŠããŠããçŸå®äžçã®ãªããžã§ã¯ãã®å¢çãèªèããããšã§ãããçŽæçãªæ¹æ³ã§ä»®æ³ãªããžã§ã¯ããšå¯Ÿè©±ã§ããããã«ããŸãã
衚é¢ãšããžèªèã®æè¡ã«ã¯ããã°ãã°ä»¥äžã®ã³ã³ãã¥ãŒã¿ããžã§ã³ã¢ã«ãŽãªãºã ã®çµã¿åãããå«ãŸããŸãïŒ
- ãšããžæ€åºãã£ã«ã¿ãŒïŒ CannyãSobelãªã©ã®ãã£ã«ã¿ãŒãé©çšããŠãã«ã¡ã©ç»åå ã®ãšããžãèå¥ããŸãã
- ç¹åŸŽãããã³ã°ïŒ ç°ãªããã¬ãŒã éã®ç¹åŸŽãç §åããæéã®çµéã«äŒŽããšããžã®åããšåœ¢ç¶ã远跡ããŸãã
- Structure from Motion (SfM)ïŒ è€æ°ã®ç»åããç°å¢ã®3Dã¢ãã«ãåæ§ç¯ããè€éãªè¡šé¢äžã®æ£ç¢ºãªãšããžæ€åºãå¯èœã«ããŸãã
- æ©æ¢°åŠç¿ïŒ èšç·Žæžã¿ã¢ãã«ã䜿çšããŠãå€èгãæèã«åºã¥ããŠãšããžãèå¥ããåé¡ããŸãã
WebXRã«ãããå¹³é¢å¢çæ€åºãšè¡šé¢ãšããžèªèã®ãŠãŒã¹ã±ãŒã¹
å¹³é¢ãæ€åºãã衚é¢ã®ãšããžãèªèããèœåã¯ãæ§ã ãªæ¥çã«ãããWebXRã¢ããªã±ãŒã·ã§ã³ã«å¹ åºãå¯èœæ§ããããããŸãã
1. Eã³ããŒã¹ãšå°å£²
ARã·ã§ããã³ã°äœéšã¯ãŸããŸã人æ°ãé«ãŸã£ãŠããã顧客ã¯è³Œå ¥åã«èªå® ã§è£œåãèŠèŠåã§ããŸãã平颿€åºã«ããããŠãŒã¶ãŒã¯æ€åºããã衚é¢ã«ä»®æ³ã®å®¶å ·ãå®¶é»ãè£ é£Ÿåãé 眮ã§ããŸãã衚é¢ãšããžèªèã«ãããæ¢åã®å®¶å ·ãžã®ããæ£ç¢ºãªé 眮ãšä»®æ³è£œåã®ããè¯ããªã¯ã«ãŒãžã§ã³ãå¯èœã«ãªããŸããäŸãã°ïŒ
- å®¶å ·ã®é çœ®ïŒ ãŠãŒã¶ãŒã¯ãªãã³ã°ã«ãŒã ã«ä»®æ³ã®ãœãã¡ã眮ããŠããããæ¢åã®è£ 食ã«ã©ã®ããã«ãã£ããããããããããã確èªã§ããŸãã
- ããŒãã£ã«è©ŠçïŒ é¡§å®¢ã¯ããã€ã¹ã®ã«ã¡ã©ã䜿çšããŠãè¡£é¡ãã¢ã¯ã»ãµãªãŒãåç²§åãä»®æ³çã«è©Šçã§ããŸãã
- 補åã®èŠèŠåïŒ ãŠãŒã¶ãŒã®ç°å¢ã«è£œåã®3Dã¢ãã«ã衚瀺ãã詳现ã調ã¹ãããã¹ã±ãŒã«ãè©äŸ¡ãããã§ããŸãã
ãã€ãã®ãã«ãªã³ã«ããè²·ãç©å®¢ãããªã³ã©ã€ã³ã§è³Œå ¥ããåã«æ°ããã©ã³ããèªåã®æºã§ã©ã®ããã«èŠããããæºåž¯é»è©±ã§ç¢ºèªããæ§åãæ³åããŠã¿ãŠãã ããããããã¯ãæ¥æ¬ã®æ±äº¬ã«ãã顧客ãARã¢ããªã䜿ã£ãŠããŸããŸãªè²ã®å£çŽ ã詊ããŠããæ§åã§ãã
2. ã²ãŒã ãšãšã³ã¿ãŒãã€ã¡ã³ã
ARã²ãŒã ã¯ä»®æ³äžçãçŸå®ã®ãã®ã«ããæ¥åžžã®ç°å¢ãã€ã³ã¿ã©ã¯ãã£ããªéã³å Žã«å€ããããšãã§ããŸãã平颿€åºãšè¡šé¢ãšããžèªèã¯ãé åçã§æ²¡å ¥æã®ããã²ãŒã ãã¬ã€äœéšãäœæããããã«äžå¯æ¬ ã§ãã
- ARããŒãã²ãŒã ïŒ æ€åºãããããŒãã«ã«ä»®æ³ã®ããŒãã²ãŒã ãé 眮ãããã¬ã€ã€ãŒãçŸå®äžçã§ä»®æ³ã®é§ãšå¯Ÿè©±ã§ããããã«ããŸãã
- äœçœ®æ å ±ããŒã¹ã®ã²ãŒã ïŒ çŸå®äžçã®å Žæã«ä»®æ³èŠçŽ ãéãåãããã²ãŒã ãäœæããæ¢çŽ¢ãšçºèŠãä¿ããŸãã
- ã€ã³ã¿ã©ã¯ãã£ããªã¹ããŒãªãŒããªã³ã°ïŒ ãŠãŒã¶ãŒã®åšå²ã«ä»®æ³ã®ãã£ã©ã¯ã¿ãŒãç°å¢ãé 眮ããããšã§ãç©èªã«åœãå¹ã蟌ã¿ãŸãã
ã¢ã«ãŒã³ãã³ã®ããšãã¹ã¢ã€ã¬ã¹ã§å人ãã¡ãã³ãŒããŒããŒãã«ã§ARããŒãã²ãŒã ããã¬ã€ããŠããæ§åããã€ã¿ãªã¢ã®ããŒãã§èгå 客ãARã¢ããªã䜿ã£ãŠå€ä»£éºè·¡ã«æŽå²æ å ±ãéãåãããŠããæ§åãèããŠã¿ãŠãã ããã
3. æè²ãšãã¬ãŒãã³ã°
WebXRã¯ãã€ã³ã¿ã©ã¯ãã£ããªåŠç¿ãšãã¬ãŒãã³ã°ã®ããã®åŒ·åãªããŒã«ãæäŸããåŠçãå°éå®¶ãè€éãªæŠå¿µã«å®è·µçãªæ¹æ³ã§åãçµãããšãå¯èœã«ããŸãã平颿€åºãšè¡šé¢ãšããžèªèã¯ãçŸå®çã§æ²¡å ¥æã®ããåŠç¿ç°å¢ãæäŸããããšã§ããããã®äœéšãåäžãããããšãã§ããŸãã
- 3Dã¢ãã«ã®èŠèŠåïŒ è§£ååŠçæ§é ãå·¥åŠèšèšããŸãã¯ç§åŠçæŠå¿µã®ã€ã³ã¿ã©ã¯ãã£ããª3Dã¢ãã«ã衚瀺ããŸãã
- ããŒãã£ã«ã©ãïŒ åŠçãå®éšãè¡ã£ãããç§åŠã®åçãæ¢æ±ãããã§ããã·ãã¥ã¬ãŒããããå®éšå®€ç°å¢ãäœæããŸãã
- ãªã¢ãŒããã¬ãŒãã³ã°ïŒ æ©åšã®ã¡ã³ããã³ã¹ãå€ç§æè¡ãªã©ã®æè¡çãªã¹ãã«ã®ããã®ãªã¢ãŒããã¬ãŒãã³ã°ãæäŸããŸãã
ã€ã³ãã®ã ã³ãã€ã«ããå»åŠçãARã¢ããªã䜿ã£ãŠäººéã®å¿èã®3Dã¢ãã«ãå匷ããŠããæ§åããã«ããã®ããã³ãã«ããå·¥åŠéšã®åŠçãä»®æ³ãã¬ãŒãã³ã°ç°å¢ã§æ©åšã®ã¡ã³ããã³ã¹ãç·Žç¿ããŠããæ§åãæ³åããŠã¿ãŠãã ããã
4. å·¥æ¥ãã¶ã€ã³ãšå»ºç¯
WebXRã¯ã建ç¯å®¶ããã¶ã€ããŒããããžã§ã¯ããèŠèŠåããæç€ºããæ¹æ³ãé©åœçã«å€ããããšãã§ããŸãã平颿€åºãšè¡šé¢ãšããžèªèã«ããã建ç©ã空éã®çŸå®çã§ã€ã³ã¿ã©ã¯ãã£ããªèŠèŠåãå¯èœã«ãªããŸãã
- 建ç¯ã®èŠèŠåïŒ å»ºç©ã®3Dã¢ãã«ãçŸå®äžçã®å Žæã«éãåãããããšã§ãã¯ã©ã€ã¢ã³ãã宿ãããããžã§ã¯ããæå³ããæèã§èŠèŠåã§ããããã«ããŸãã
- ã€ã³ããªã¢ãã¶ã€ã³ã®èšç»ïŒ ä»®æ³ç©ºéã§ããŸããŸãªã¬ã€ã¢ãŠããå®¶å ·ã®é 眮ãã«ã©ãŒã¹ããŒã ã詊ããŸãã
- 建èšçŸå Žã®ç£èŠïŒ ããžã¿ã«ã¢ãã«ã建èšçŸå Žã«éãåãããããšã§ãé²æç¶æ³ã远跡ããæœåšçãªåé¡ãç¹å®ããŸãã
ã¢ã©ãéŠé·åœé£éŠã®ããã€ã«ãã建ç¯å®¶ããææ¡ããã建èšçŸå Žã«3Dã¢ãã«ãéãåãããARã¢ããªã䜿ã£ãŠã¯ã©ã€ã¢ã³ãã«æ°ãã建ç©ã®ãã¶ã€ã³ãæ«é²ããŠããæ§åãããã©ãžã«ã®ãµã³ããŠãã«ããã€ã³ããªã¢ãã¶ã€ããŒãWebXRã䜿ã£ãŠã¯ã©ã€ã¢ã³ããã¢ããŒãã®ããŸããŸãªå®¶å ·ã®é 眮ãèŠèŠåããã®ãæäŒã£ãŠããæ§åãæãæµ®ãã¹ãŠã¿ãŠãã ããã
5. ã¢ã¯ã»ã·ããªãã£
WebXRã¯ãå¹³é¢ããã³ãšããžæ€åºãšçµã¿åãããããšã§ãé害ãæã€äººã ã®ã¢ã¯ã»ã·ããªãã£ãå€§å¹ ã«åäžãããããšãã§ããŸãããŠãŒã¶ãŒã®ç°å¢ãçè§£ããããšã«ãããã¢ããªã±ãŒã·ã§ã³ã¯æèã«å¿ããæ å ±ãšæ¯æŽæ©èœãæäŸã§ããŸãã
- èŠèŠé害è åãã®ããã²ãŒã·ã§ã³æ¯æŽïŒ ã¢ããªã¯ãšããžãšå¹³é¢ã®æ€åºã䜿çšããŠç°å¢ã説æããé害ç©ãç¹å®ããããã²ãŒã·ã§ã³ã®ããã®é³å£°ã¬ã€ãã³ã¹ãæäŸã§ããŸããè±åœãã³ãã³ã®æ··éããéããèŠèŠé害è ãããã²ãŒãããã®ãå©ããã¢ããªãæ³åããŠã¿ãŠãã ããã
- èŽèŠé害è åãã®ã³ãã¥ãã±ãŒã·ã§ã³åŒ·åïŒ ARãªãŒããŒã¬ã€ã¯ãäŒè©±äžã«ãªã¢ã«ã¿ã€ã ã®ãã£ãã·ã§ã³ãšæè©±ç¿»èš³ãæäŸããã³ãã¥ãã±ãŒã·ã§ã³ã¢ã¯ã»ã¹ãåäžãããããšãã§ããŸãããªãŒã¹ãã©ãªã¢ã®ã·ãããŒã«ããèŽèŠé害è ãAR翻蚳ã¢ããªã®å©ããåããŠäŒè°ã«åå ããã·ããªãªãèããããŸãã
- èªç¥æ¯æŽïŒ ARã¢ããªã±ãŒã·ã§ã³ã¯ãèªç¥é害ãæã€åäººãæ¥åžžã®ã¿ã¹ã¯ãå®äºããã®ãå©ããããã«ãèŠèŠçãªæãããããªãã€ã³ããŒãæäŸã§ããŸããäŸãã°ãARã¢ããªã¯éåœãœãŠã«ã®èª°ããã«ãŠã³ã¿ãŒãããã«ã¹ããããã€ã¹ãããã®æç€ºãæåœ±ããããšã«ãã£ãŠé£äºã®æºåãã¬ã€ãããããšãã§ããŸãã
WebXRã§ã®å¹³é¢å¢çæ€åºãšè¡šé¢ãšããžèªèã®å®è£
ããã€ãã®ããŒã«ãšã©ã€ãã©ãªããéçºè ãWebXRãããžã§ã¯ãã§å¹³é¢å¢çæ€åºãšè¡šé¢ãšããžèªèãå®è£ ããã®ãæ¯æŽããŸãã
1. WebXR Device API
ã³ã¢ãšãªãWebXR Device APIã¯ããã©ãŠã¶ã§ARæ©èœã«ã¢ã¯ã»ã¹ããããã®åºç€ãæäŸããŸããããã«ã¯ä»¥äžã®æ©èœãå«ãŸããŸãïŒ
- ã»ãã·ã§ã³ç®¡çïŒ WebXRã»ãã·ã§ã³ã®éå§ãšç®¡çã
- ãã¬ãŒã è¿œè·¡ïŒ ã«ã¡ã©ç»åãšããã€ã¹ã®ããŒãºæ å ±ãžã®ã¢ã¯ã»ã¹ã
- ç¹åŸŽè¿œè·¡ïŒ æ€åºãããå¹³é¢ããã®ä»ã®ç¹åŸŽã«é¢ããæ å ±ãžã®ã¢ã¯ã»ã¹ã
APIã¯ãç°å¢å ã§æ€åºãããå¹³é¢ã衚ã `XRPlane` ãªããžã§ã¯ããæäŸããŸããå `XRPlane` ãªããžã§ã¯ãã«ã¯ã次ã®ãããªããããã£ãå«ãŸããŸãïŒ
- `polygon`: å¹³é¢ã®å¢çã衚ã3Dãã€ã³ãã®é åã
- `pose`: ã¯ãŒã«ã空éã«ãããå¹³é¢ã®ããŒãºïŒäœçœ®ãšåãïŒã
- `lastChangedTime`: å¹³é¢ã®ããããã£ãæåŸã«æŽæ°ãããã¿ã€ã ã¹ã¿ã³ãã
2. JavaScriptãã¬ãŒã ã¯ãŒã¯ãšã©ã€ãã©ãª
ããã€ãã®JavaScriptãã¬ãŒã ã¯ãŒã¯ãšã©ã€ãã©ãªã¯ãWebXRéçºãç°¡çŽ åãã平颿€åºãšè¡šé¢ãšããžèªèã®ããã®ããé«ã¬ãã«ã®æœè±¡åãæäŸããŸãã
- Three.js: WebXRã¬ã³ãã©ãŒãš3Dã·ãŒã³ãæ±ãããã®ãŠãŒãã£ãªãã£ãæäŸãã人æ°ã®3Dã°ã©ãã£ãã¯ã¹ã©ã€ãã©ãªã
- Babylon.js: å ç¢ãªWebXRãµããŒããšç©çæŒç®ãã¢ãã¡ãŒã·ã§ã³ãªã©ã®é«åºŠãªæ©èœãåãããããäžã€ã®åŒ·åãª3Dãšã³ãžã³ã
- AR.js: ãŠã§ãäžã§ARäœéšãæ§ç¯ããããã®è»œéã©ã€ãã©ãªã§ãããŒã«ãŒããŒã¹ããã³ããŒã«ãŒã¬ã¹ã®è¿œè·¡ãªãã·ã§ã³ãæäŸããŸãã
- Model-Viewer: ARã§3Dã¢ãã«ã衚瀺ããããã®ãŠã§ãã³ã³ããŒãã³ãã§ãARããŠã§ãããŒãžã«çµ±åããããã®ã·ã³ãã«ã§çŽæçãªæ¹æ³ãæäŸããŸãã
3. ARCoreããã³ARKitæœè±¡åã©ã€ãã©ãª
WebXRã¯ãã©ãããã©ãŒã ã«äŸåããªãããšãç®æããŠããŸãããGoogleã®ARCoreïŒAndroidïŒãAppleã®ARKitïŒiOSïŒã®ãããªåºç€ãšãªãARãã©ãããã©ãŒã ã¯ãå ç¢ãªå¹³é¢æ€åºæ©èœãæäŸããŸãããããã®ãã€ãã£ããã©ãããã©ãŒã ãæœè±¡åããã©ã€ãã©ãªã¯ãããé«åºŠãªæ©èœãšããã©ãŒãã³ã¹ãæäŸããããšãã§ããŸãã
äŸïŒ
- 8th Wall: ã€ã³ã¹ã¿ã³ããã©ããã³ã°ãç»åèªèããµãŒãã§ã¹ãã©ããã³ã°ãªã©ãããŸããŸãªããã€ã¹ã§åäœããé«åºŠãªARæ©èœãæäŸããåçšãã©ãããã©ãŒã ã
- MindAR: ç»å远跡ãé¡è¿œè·¡ãã¯ãŒã«ããã©ããã³ã°ããµããŒããããªãŒãã³ãœãŒã¹ã®WebARãšã³ãžã³ã
ã³ãŒãäŸïŒThree.jsã«ããå¹³é¢ã®æ€åºãšèŠèŠå
ãã®äŸã¯ãWebXR Device APIã䜿çšããŠå¹³é¢ãæ€åºããThree.jsã䜿çšããŠããããèŠèŠåããæ¹æ³ã瀺ããŠããŸãã
// Initialize Three.js scene
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// Enable WebXR
renderer.xr.enabled = true;
let xrSession;
async function startXR() {
try {
xrSession = await navigator.xr.requestSession('immersive-ar', {
requiredFeatures: ['plane-detection']
});
xrSession.updateRenderState({
baseLayer: new XRWebGLLayer(xrSession, renderer.getContext())
});
renderer.xr.setSession(xrSession);
xrSession.addEventListener('end', () => {
renderer.xr.setSession(null);
});
const referenceSpace = await xrSession.requestReferenceSpace('local');
xrSession.requestAnimationFrame(render);
} catch (e) {
console.error(e);
}
}
// Plane Mesh Cache
const planeMeshes = new Map();
function render(time, frame) {
if (frame) {
const session = frame.session;
const viewerPose = frame.getViewerPose(referenceSpace);
if (viewerPose) {
const planes = session.getWorldInformation().detectedPlanes;
planes.forEach(plane => {
if (!planeMeshes.has(plane.id)) {
// Create a mesh for the plane
const geometry = new THREE.BufferGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00, wireframe: true });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
planeMeshes.set(plane.id, mesh);
}
const mesh = planeMeshes.get(plane.id);
const polygon = plane.polygon;
// Update the mesh geometry with the plane's polygon
const vertices = [];
for (const point of polygon) {
vertices.push(point.x, point.y, point.z);
}
mesh.geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));
mesh.geometry.computeVertexNormals();
mesh.geometry.computeBoundingSphere();
mesh.geometry.attributes.position.needsUpdate = true;
const planePose = frame.getPose(plane.planeSpace, referenceSpace);
mesh.position.copy(planePose.transform.position);
mesh.quaternion.copy(planePose.transform.orientation);
});
}
}
renderer.render(scene, camera);
renderer.xr.getSession()?.requestAnimationFrame(render);
}
// Start the XR session when a button is clicked
const startButton = document.createElement('button');
startButton.textContent = 'Start WebXR';
startButton.addEventListener('click', startXR);
document.body.appendChild(startButton);
ãã®ã³ãŒãã¹ããããã¯åºæ¬çãªäŸãæäŸããŸããç¹å®ã®ãããžã§ã¯ããšèŠä»¶ã«åãããŠé©å¿ãããå¿ èŠããããŸãããšã©ãŒãã³ããªã³ã°ãšããå ç¢ãªå¹³é¢ç®¡çã远å ããããšãæ€èšããŠãã ããã
WebXRå¹³é¢å¢çæ€åºã®ãã¹ããã©ã¯ãã£ã¹
广çã§ãŠãŒã¶ãŒãã¬ã³ããªãŒãªARäœéšãäœæããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãèæ ®ããŠãã ããïŒ
- ããã©ãŒãã³ã¹ãåªå ããïŒ å¹³é¢æ€åºã¯èšç®ã³ã¹ããé«ãå ŽåããããŸããç¹ã«ã¢ãã€ã«ããã€ã¹ã§ã®ã¹ã ãŒãºãªããã©ãŒãã³ã¹ã確ä¿ããããã«ãã³ãŒããšã¢ã»ãããæé©åããŠãã ããã
- ãšã©ãŒãé©åã«åŠçããïŒ ç¹å®ã®ç°å¢ã§ã¯å¹³é¢æ€åºã倱æããå¯èœæ§ããããŸãããŠãŒã¶ãŒã«æçãªã¡ãã»ãŒãžãæäŸãã代æ¿ãœãªã¥ãŒã·ã§ã³ãæç€ºããããã®ãšã©ãŒãã³ããªã³ã°ãå®è£ ããŠãã ããã
- ãŠãŒã¶ãŒãã£ãŒãããã¯ãæäŸããïŒ èŠèŠçãªæãããã¯ããŠãŒã¶ãŒãã·ã¹ãã ãã©ã®ããã«å¹³é¢ãæ€åºããŠããããçè§£ããã®ã«åœ¹ç«ã¡ãŸããå¹³é¢ãæ€åºããããšãã«èŠèŠçãªã€ã³ãžã±ãŒã¿ã衚瀺ããæ€åºãæ¹åããæ¹æ³ã«é¢ããã¬ã€ãã³ã¹ãæäŸããããšãæ€èšããŠãã ããã
- ç°ãªãããã€ã¹åãã«æé©åããïŒ ARCoreãšARKitã¯ãç°ãªãæ©èœãšããã©ãŒãã³ã¹ç¹æ§ãæã£ãŠããŸããäžè²«ããäœéšã確ä¿ããããã«ãããŸããŸãªããã€ã¹ã§ã¢ããªã±ãŒã·ã§ã³ããã¹ãããŠãã ããã
- ãŠãŒã¶ãŒã®ãã©ã€ãã·ãŒãå°éããïŒ ããã€ã¹ã®ã«ã¡ã©ãšã»ã³ãµãŒããŒã¿ãã©ã®ããã«äœ¿çšããŠãããã«ã€ããŠéææ§ãä¿ã£ãŠãã ãããå人æ å ±ãåéãŸãã¯å ±æããåã«ããŠãŒã¶ãŒã®åæãåŸãŠãã ããã
- ã¢ã¯ã»ã·ããªãã£ãèæ ®ããïŒ é害ãæã€ãŠãŒã¶ãŒãã¢ã¯ã»ã¹ã§ããããã«ARäœéšãèšèšããŠãã ããã代æ¿ã®å ¥åæ¹æ³ã調æŽå¯èœãªãã©ã³ããµã€ãºãé³å£°èª¬æãæäŸããŠãã ããã
WebXRã«ããã衚é¢çè§£ã®æªæ¥
WebXRã«ããã衚é¢çè§£ã®åéã¯æ¥éã«é²åããŠããŸããå°æ¥ã®é²æ©ã«ã¯ã以äžãå«ãŸããå¯èœæ§ããããŸãïŒ
- 粟床ã®åäžãšå ç¢æ§ïŒ å°é£ãªç°å¢ã§ããããæ£ç¢ºã§ä¿¡é Œæ§ã®é«ã平颿€åºãšè¡šé¢ãšããžèªèã
- æå³ççè§£ïŒ è¡šé¢ãæ€åºããã ãã§ãªãããã®æå³ïŒäŸïŒããŒãã«ãæ€ åãå£ã®èå¥ïŒãçè§£ããèœåã
- ãªã¢ã«ã¿ã€ã 3Dåæ§ç¯ïŒ ç°å¢ã®ãªã¢ã«ã¿ã€ã 3Dã¢ãã«ãäœæããããé«åºŠãªARã€ã³ã¿ã©ã¯ã·ã§ã³ãå¯èœã«ããŸãã
- ã³ã©ãã¬ãŒã·ã§ã³ãšãã«ããŠãŒã¶ãŒARïŒ è€æ°ã®ãŠãŒã¶ãŒãåãARç°å¢ãå ±æãã察話ã§ããããã«ãã衚é¢çè§£ã®æ£ç¢ºãªåæãå®çŸããŸãã
WebXRæè¡ãæçããã«ã€ããŠãå¹³é¢å¢çæ€åºãšè¡šé¢ãšããžèªèã¯ãé åçã§æ²¡å ¥æã®ããARäœéšãåµé ããäžã§ãŸããŸãéèŠãªåœ¹å²ãæããããã«ãªããŸãããã®ã¬ã€ãã§æŠèª¬ãããååãšæè¡ãçè§£ããããšã§ãéçºè ã¯ãããã®èœåãæŽ»çšããŠããŠã§ããšã®å¯Ÿè©±æ¹æ³ãå€é©ãã驿°çã§é åçãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã
çµè«
WebXRã®å¹³é¢å¢çæ€åºãšè¡šé¢ãšããžèªèã¯ãæ²¡å ¥åã§ã€ã³ã¿ã©ã¯ãã£ããªæ¡åŒµçŸå®äœéšãåµé ããããã®åŒ·åãªããŒã«ã§ããåºç€ãšãªãæŠå¿µãçè§£ããå©çšå¯èœãªAPIãã©ã€ãã©ãªã掻çšãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãéçºè ã¯ä»®æ³äžçãšçŸå®äžçãã·ãŒã ã¬ã¹ã«èåããã驿°çãªARã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããæè¡ãé²åãç¶ããã«ã€ããŠãWebXRã®å¯èœæ§ã¯çã«ç¡é倧ã§ãããã¿ã€ã®ãã³ã³ã¯ã®è³ãããªéããã¢ã€ã¹ã©ã³ãã®ã¬ã€ãã£ãã¯ã®éããªã«ãã§ããããã¯ã¢ã³ãã¹å±±èã®é éã®æãªã©ãå Žæãåãããããžã¿ã«ã³ã³ãã³ããç§ãã¡ã®æ¥åžžç掻ã«ã·ãŒã ã¬ã¹ã«çµ±åãããæªæ¥ãçŽæããŸãã
ãã®æè¡ã¯ãç£æ¥ãåæ§ç¯ããã¢ã¯ã»ã·ããªãã£ãåäžãããç§ãã¡ãæ å ±ãäºããšå¯Ÿè©±ããæ¹æ³ãåå®çŸ©ããå¯èœæ§ãç§ããŠããŸããWebXRã®åãåãå ¥ãããŠã§ããçã«æ¡åŒµãããæªæ¥ã®æ§ç¯ã«è²¢ç®ããŠãã ããã