WebXRããããã¹ãæé©åã«ãããã¬ã€ãã£ã¹ãã£ã³ã°åŒ·åã®åãæ¢æ±ããŸãããã®ã¬ã€ãã§ã¯ãæ²¡å ¥åWebã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãå€§å¹ ã«åäžããããã¯ããã¯ã«ã€ããŠè©³ãã解説ããŸãã
WebXRããããã¹ãæé©åãšã³ãžã³ïŒã¬ã€ãã£ã¹ãã£ã³ã°ã®åŒ·å
WebXRã¯ãWebãšã®ã€ã³ã¿ã©ã¯ã·ã§ã³æ¹æ³ã«é©åœãããããããã©ãŠã¶å ã§çŽæ¥æ²¡å ¥åãšã¯ã¹ããªãšã³ã¹ãå¯èœã«ããŠããŸããå€ãã®WebXRã¢ããªã±ãŒã·ã§ã³ãç¹ã«æ¡åŒµçŸå®ïŒARïŒãå«ãã¢ããªã±ãŒã·ã§ã³ã®ã³ã¢ã³ã³ããŒãã³ãã¯ãããããã¹ãã§ããããããã¹ãã¯ãéåžžã¯ãŠãŒã¶ãŒã®èŠç·ãŸãã¯ã³ã³ãããŒã©ãŒããçºããããã¬ã€ããçŸå®äžçã®è¡šé¢ãšäº€å·®ãããã©ããã倿ããŸãããã®ã€ã³ã¿ã©ã¯ã·ã§ã³ã¯ãä»®æ³ãªããžã§ã¯ãã®é 眮ãç©çäžçã«éããããããžã¿ã«ã³ã³ãã³ããšã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãããã³ãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã«åºã¥ãã€ãã³ãã®ããªã¬ãŒã«äžå¯æ¬ ã§ãããã ããããããã¹ãã¯ãç¹ã«è€éãªç°å¢ãé »ç¹ã«å®è¡ãããå Žåã«ã¯ãèšç®ã³ã¹ããé«ããªãå¯èœæ§ããããŸãããããã£ãŠãã¹ã ãŒãºã§å¿çæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããã«ã¯ãããããã¹ãããã»ã¹ãæé©åããããšãæãéèŠã§ãããã®èšäºã§ã¯ãWebXRããããã¹ãã®æé©åã®ããã®ã¬ã€ãã£ã¹ãã£ã³ã°åŒ·åæè¡ã®è€éããæãäžããWebXRã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžãããããã®å®è¡å¯èœãªæŠç¥ãæäŸããŸãã
WebXRããããã¹ãã®çè§£
æé©åæŠç¥ã«å ¥ãåã«ãWebXRããããã¹ãã®ä»çµã¿ãçè§£ããããšãéèŠã§ããWebXR Device APIã¯ãåºç€ãšãªãçŸå®ã«å¯ŸããŠããããã¹ããå®è¡ããããã®ã¡ãœãããæäŸããŸãããããã®ã¡ãœããã¯ãåºæ¬çã«ãŠãŒã¶ãŒã®èŠç¹ïŒãŸãã¯ã³ã³ãããŒã©ãŒã®äœçœ®ãšåãïŒããã·ãŒã³ã«ã¬ã€ããã£ã¹ãããæ€åºãããå¹³é¢ãŸãã¯ãã£ãŒãã£ãšäº€å·®ãããã©ããã倿ããŸãããã®äº€ç¹ãèŠã€ãã£ãå ŽåããµãŒãã§ã¹ã®äœçœ®ãšåãã«é¢ããæ å ±ãæäŸãããéçºè ã¯ãã®ãã€ã³ãã«ä»®æ³ãªããžã§ã¯ããé 眮ããããã€ã³ã¿ã©ã¯ã·ã§ã³ãéå§ãããã§ããŸãã
ããããã¹ãã«äœ¿çšãããäž»ãªã¡ãœããã¯æ¬¡ã®ãšããã§ãã
XRFrame.getHitTestResults(XRHitTestSource)
ïŒããããã¹ãã®çµæãååŸããXRHitTestResult
ãªããžã§ã¯ãã®é åãè¿ããŸããåXRHitTestResult
ã¯äº€ç¹ã衚ããŸããXRHitTestSource
ïŒã¬ã€ã®åç¹ãšæ¹åãæå®ããŠãããããã¹ããœãŒã¹ã®äœæãšç®¡çã«äœ¿çšãããã€ã³ã¿ãŒãã§ã€ã¹ã
ãããã®ããããã¹ãã®ããã©ãŒãã³ã¹ã¯ã次ã®ãããªããã€ãã®èŠå ã«ãã£ãŠå€§ãã圱é¿ãåããå¯èœæ§ããããŸãã
- ã·ãŒã³ã®è€éãïŒããªãŽã³æ°ã®å€ãè€éãªã·ãŒã³ã»ã©ãã¬ã€ã®äº€ç¹ã倿ããããã«ããå€ãã®åŠçèœåãå¿ èŠã§ãã
- ããããã¹ãã®é »åºŠïŒç¹ã«ã¢ãã€ã«ããã€ã¹ã§ã¯ããã¬ãŒã ããšã«ããããã¹ããå®è¡ãããšãããã€ã¹ã®ãªãœãŒã¹ã«è² æ ããããå¯èœæ§ããããŸãã
- ãã£ãŒãã£æ€åºã®ç²ŸåºŠïŒäžæ£ç¢ºãŸãã¯äžå®å šãªãã£ãŒãã£æ€åºã¯ã誀ã£ãããããã¹ãã®çµæãšåŠçæéã®æµªè²»ã«ã€ãªããå¯èœæ§ããããŸãã
ã¬ã€ãã£ã¹ãã£ã³ã°æé©åæè¡
ã¬ã€ãã£ã¹ãã£ã³ã°ã®æé©åã«ã¯ãã¬ã€ã®äº€ç¹ã倿ããããã®èšç®ã³ã¹ãã®åæžãå«ãŸããŸãããããå®çŸããããã«ãããã€ãã®ææ³ãæ¡çšã§ããŸãã
1. Bounding Volume Hierarchies (BVH)
Bounding Volume HierarchyïŒBVHïŒã¯ãã·ãŒã³ã®ãžãªã¡ããªãããŠã³ãã£ã³ã°ããªã¥ãŒã ã®éå±€ã«ç·šæããããªãŒç¶ã®ããŒã¿æ§é ã§ãããããã®ããŠã³ãã£ã³ã°ããªã¥ãŒã ã¯éåžžãäžè§åœ¢ã®ã°ã«ãŒããå²ãããã¯ã¹ãçã®ãããªåçŽãªåœ¢ç¶ã§ããã¬ã€ãã£ã¹ããå®è¡ãããšããã¢ã«ãŽãªãºã ã¯æåã«ããŠã³ãã£ã³ã°ããªã¥ãŒã ãšã®äº€å·®ããã§ãã¯ããŸããã¬ã€ãããŠã³ãã£ã³ã°ããªã¥ãŒã ãšäº€å·®ããªãå Žåããã®ããªã¥ãŒã å ã«å«ãŸãããµãããªãŒå šäœãã¹ãããã§ãããããå¿ èŠãªäžè§åœ¢ãšã¬ã€ã®äº€å·®ãã¹ãã®æ°ãå€§å¹ ã«åæžãããŸãã
äŸïŒARã䜿çšããŠãéšå±ã«ããã€ãã®ä»®æ³å®¶å ·ãé 眮ããããšãæ³åããŠãã ãããBVHã¯ããããã®å®¶å ·ãè¿æ¥æ§ã«åºã¥ããŠã°ã«ãŒãåã§ããŸãããŠãŒã¶ãŒãåºãã¿ããããŠæ°ãããªããžã§ã¯ããé 眮ãããšãã¬ã€ãã£ã¹ãã¯æåã«ãã¹ãŠã®å®¶å ·ãå²ãããŠã³ãã£ã³ã°ããªã¥ãŒã ãšäº€å·®ãããã©ããããã§ãã¯ããŸããããã§ãªãå Žåãã¬ã€ãã£ã¹ãã¯ãé ãã«ããåã ã®å®¶å ·ã«å¯ŸããŠãã§ãã¯ããããšãããã«ã¹ãããã§ããŸãã
BVHã®å®è£ ã«ã¯ãéåžžãæ¬¡ã®æé ãå«ãŸããŸãã
- BVHã®æ§ç¯ïŒã·ãŒã³ã®ãžãªã¡ããªãããå°ããªã°ã«ãŒãã«ååž°çã«åå²ããåã°ã«ãŒãã®ããŠã³ãã£ã³ã°ããªã¥ãŒã ãäœæããŸãã
- BVHã®ãã©ããŒã¹ïŒã«ãŒãããéå§ããŠãBVHããã©ããŒã¹ããã¬ã€ãšããŠã³ãã£ã³ã°ããªã¥ãŒã ã®äº€å·®ããã§ãã¯ããŸãã
- äžè§åœ¢ã®ãã¹ãïŒã¬ã€ãšäº€å·®ããããŠã³ãã£ã³ã°ããªã¥ãŒã å ã®äžè§åœ¢ã®ã¿ããã¹ãããŸãã
three-mesh-bvh for Three.jsããä»ã®WebGLãã¬ãŒã ã¯ãŒã¯çšã®åæ§ã®ã©ã€ãã©ãªãªã©ãã©ã€ãã©ãªã¯ãããã»ã¹ãç°¡çŽ åããäºåæ§ç¯æžã¿ã®BVHå®è£ ãæäŸããŸãã
2. 空éåå²
空éå岿è¡ã¯ãã·ãŒã³ããªã¯ãããªãŒãKDããªãŒãªã©ã®é¢æ£çãªé åã«åå²ããŸãããããã®æè¡ã䜿çšãããšãã·ãŒã³ã®ã©ã®é åãã¬ã€ãšäº€å·®ããå¯èœæ§ãé«ããããã°ãã倿ã§ããããã亀差ããã¹ãããå¿ èŠã®ãããªããžã§ã¯ãã®æ°ãæžããããšãã§ããŸãã
äŸïŒãŠãŒã¶ãŒãèªåã®ç©ççãªåšå²ã«éããããä»®æ³çŸè¡é€šã®å±ç€ºç©ãæ¢çŽ¢ã§ããARã¢ããªã±ãŒã·ã§ã³ãæ€èšããŠãã ããã空éåå²ã¢ãããŒãã§ã¯ãå±ç€ºã¹ããŒã¹ãããå°ããªã»ã«ã«åå²ã§ããŸãããŠãŒã¶ãŒãããã€ã¹ãç§»åãããšãã¢ããªã±ãŒã·ã§ã³ã¯ãçŸåšãŠãŒã¶ãŒã®èŠéå ã«ããã»ã«å ã«å«ãŸãããªããžã§ã¯ããšã®ã¬ã€ã®äº€å·®ã®ã¿ããã§ãã¯ããå¿ èŠããããŸãã
äžè¬çãªç©ºéå岿è¡ã«ã¯ã次ã®ãã®ããããŸãã
- ãªã¯ãããªãŒïŒã¹ããŒã¹ã8ã€ã®å «å空éã«ååž°çã«åå²ããŸãã
- KDããªãŒïŒç°ãªãè»žã«æ²¿ã£ãŠã¹ããŒã¹ãååž°çã«åå²ããŸãã
- ã°ãªããããŒã¹ã®åå²ïŒã¹ããŒã¹ãã»ã«ã®åäžãªã°ãªããã«åå²ããŸãã
空éå岿è¡ã®éžæã¯ãã·ãŒã³ã®ç¹å®ã®ç¹æ§ã«ãã£ãŠç°ãªããŸãããªã¯ãããªãŒã¯ãªããžã§ã¯ãã®ååžãäžåäžãªã·ãŒã³ã«é©ããŠãããKDããªãŒã¯ãªããžã§ã¯ãã®ååžãæ¯èŒçåäžãªã·ãŒã³ã«å¯ŸããŠããå¹ççã§ããã°ãªããããŒã¹ã®åå²ã¯å®è£ ãç°¡åã§ããããªããžã§ã¯ãå¯åºŠã倧ããç°ãªãã·ãŒã³ã§ã¯å¹çãäœäžããå¯èœæ§ããããŸãã
3. ç²ãã现ãžã®äº€å·®ãã¹ã
ãã®ææ³ã§ã¯ã詳现床ã®ã¬ãã«ãäžããŠäžé£ã®äº€å·®ãã¹ããå®è¡ããŸããæåã®ãã¹ãã¯ãããŠã³ãã£ã³ã°ã¹ãã£ã¢ãããã¯ã¹ãªã©ããªããžã§ã¯ãã®ç°¡ç¥åããã衚çŸã§å®è¡ãããŸããã¬ã€ãç°¡ç¥åããã衚çŸãšäº€å·®ããªãå Žåããªããžã§ã¯ãã¯ç Žæ£ã§ããŸããã¬ã€ãç°¡ç¥åããã衚çŸãšäº€å·®ããå Žåã«ã®ã¿ãå®éã®ãªããžã§ã¯ããžãªã¡ããªã䜿çšããŠãã詳现ãªäº€å·®ãã¹ããå®è¡ãããŸãã
äŸïŒARã¬ãŒãã³ã«ä»®æ³ãã©ã³ããé 眮ããå Žåãæåã®ããããã¹ãã§ã¯ããã©ã³ãã®ã¢ãã«ã®åšãã®åçŽãªããŠã³ãã£ã³ã°ããã¯ã¹ã䜿çšã§ããŸããã¬ã€ãããŠã³ãã£ã³ã°ããã¯ã¹ãšäº€å·®ããå Žåãå®éã®ãã©ã³ãã®èãšèã®ãžãªã¡ããªã䜿çšããããæ£ç¢ºãªããããã¹ããå®è¡ã§ããŸããã¬ã€ãããŠã³ãã£ã³ã°ããã¯ã¹ãšäº€å·®ããªãå Žåãããè€éãªããããã¹ãã¯ã¹ãããããã貎éãªåŠçæéãç¯çŽãããŸãã
ç²ãã现ãžã®äº€å·®ãã¹ãã®éµã¯ããã¹ããé«éã§ã亀差ããå¯èœæ§ã®äœããªããžã§ã¯ãã广çã«éžå¥ã§ããé©åãªç°¡ç¥åããã衚çŸãéžæããããšã§ãã
4. Frustum Culling
Frustum cullingã¯ãã«ã¡ã©ã®èŠéïŒfrustumïŒã®å€ã«ãããªããžã§ã¯ããç Žæ£ããããã«äœ¿çšãããææ³ã§ããããããã¹ããå®è¡ããåã«ããŠãŒã¶ãŒã«è¡šç€ºãããªããªããžã§ã¯ããèšç®ããé€å€ã§ãããããå šäœçãªèšç®è² è·ã軜æžãããŸãã
äŸïŒä»®æ³ã·ã§ãŒã«ãŒã ãã·ãã¥ã¬ãŒãããWebXRã¢ããªã±ãŒã·ã§ã³ã§ã¯ãfrustum cullingã䜿çšããŠãçŸåšãŠãŒã¶ãŒã®åŸãã«ããããèŠéã®å€ã«ããå®¶å ·ããã®ä»ã®ãªããžã§ã¯ããé€å€ã§ããŸããããã«ãããããããã¹ãäžã«èæ ®ããå¿ èŠã®ãããªããžã§ã¯ãã®æ°ãå€§å¹ ã«æžããããã©ãŒãã³ã¹ãåäžããŸãã
frustum cullingã®å®è£ ã«ã¯ãæ¬¡ã®æé ãå«ãŸããŸãã
- frustumã®å®çŸ©ïŒã«ã¡ã©ã®èŠéãå®çŸ©ããå¹³é¢ãèšç®ããŸãã
- ãªããžã§ã¯ãå¢çã®ãã¹ãïŒåãªããžã§ã¯ãã®ããŠã³ãã£ã³ã°ããªã¥ãŒã ãfrustumå ã«ãããã©ããã倿ããŸãã
- ãªããžã§ã¯ãã®ç Žæ£ïŒfrustumã®å€ã«ãããªããžã§ã¯ããããããã¹ãèšç®ããé€å€ããŸãã
5. Temporal Coherence
Temporal coherenceã¯ããŠãŒã¶ãŒãšã·ãŒã³å ã®ãªããžã§ã¯ãã®äœçœ®ãšåããéåžžãæéã®çµéãšãšãã«åŸã ã«å€åãããšããäºå®ãå©çšããŸããã€ãŸããåã®ãã¬ãŒã ããã®ããããã¹ãã®çµæã¯ãçŸåšã®ãã¬ãŒã ã®ããããã¹ãã®çµæãäºæž¬ããããã«äœ¿çšã§ããããšããããããŸããTemporal coherenceãæŽ»çšããããšã§ãå®å šãªããããã¹ãã®å®è¡é »åºŠãæžããããšãã§ããŸãã
äŸïŒãŠãŒã¶ãŒãARã䜿çšããŠããŒãã«ã«ä»®æ³ããŒã«ãŒãé 眮ãããŠãŒã¶ãŒããããã«ç§»åããå ŽåãããŒã«ãŒããŸã ããŒãã«äžã«ããå¯èœæ§ãéåžžã«é«ããªããŸããããã確èªããããã«å®å šãªããããã¹ããå®è¡ãã代ããã«ããŠãŒã¶ãŒã®åãã«åºã¥ããŠããŒã«ãŒã®äœçœ®ã倿¿ãããŠãŒã¶ãŒã®åããèããå ŽåããŸãã¯ããŒã«ãŒãããŒãã«ããç§»åããããã«èŠããå Žåã«ã®ã¿ãå®å šãªããããã¹ããå®è¡ã§ããŸãã
Temporal coherenceãæŽ»çšããææ³ã«ã¯ã次ã®ãã®ããããŸãã
- ããããã¹ãçµæã®ãã£ãã·ã¥ïŒåã®ãã¬ãŒã ããã®ããããã¹ãã®çµæãä¿åãããŠãŒã¶ãŒã®äœçœ®ãšåããå€§å¹ ã«å€æŽãããŠããªãå Žåã¯åå©çšããŸãã
- ãªããžã§ã¯ãäœçœ®ã®å€æ¿ïŒãªããžã§ã¯ãã®ä»¥åã®äœçœ®ãšé床ã«åºã¥ããŠããªããžã§ã¯ãã®äœçœ®ãäºæž¬ããŸãã
- ã¢ãŒã·ã§ã³äºæž¬ã®äœ¿çšïŒã¢ãŒã·ã§ã³äºæž¬ã¢ã«ãŽãªãºã ã䜿çšããŠããŠãŒã¶ãŒã®åããäºæž¬ããããã«å¿ããŠããããã¹ããã©ã¡ãŒã¿ãŒã調æŽããŸãã
6. Adaptive Hit Test Frequency
åºå®ãããé »åºŠã§ããããã¹ããå®è¡ãã代ããã«ããŠãŒã¶ãŒã®ã¢ã¯ãã£ããã£ãšã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«åºã¥ããŠãé »åºŠãåçã«èª¿æŽã§ããŸãããŠãŒã¶ãŒãã·ãŒã³ãã¢ã¯ãã£ãã«æäœããŠããå ŽåããŸãã¯ã¢ããªã±ãŒã·ã§ã³ãã¹ã ãŒãºã«å®è¡ãããŠããå Žåã¯ãããããã¹ãã®é »åºŠãäžããŠãããå¿çæ§ã®é«ããã£ãŒãããã¯ãæäŸã§ããŸããéã«ããŠãŒã¶ãŒãã¢ã€ãã«ç¶æ ã®å ŽåããŸãã¯ã¢ããªã±ãŒã·ã§ã³ã§ããã©ãŒãã³ã¹ã®åé¡ãçºçããŠããå Žåã¯ãããããã¹ãã®é »åºŠãäžããŠãªãœãŒã¹ãç¯çŽã§ããŸãã
äŸïŒãŠãŒã¶ãŒãä»®æ³çºå°ç©ãå°æããWebXRã²ãŒã ã§ã¯ããŠãŒã¶ãŒãç §æºãåãããŠçºå°ããŠããå Žåã¯ããããã¹ãã®é »åºŠãäžãããŠãŒã¶ãŒãåã«ç°å¢ãããã²ãŒãããŠããå Žåã¯é »åºŠãäžããããšãã§ããŸãã
ããããã¹ãã®é »åºŠã調æŽããéã«èæ ®ãã¹ãèŠçŽ ã«ã¯ã次ã®ãã®ããããŸãã
- ãŠãŒã¶ãŒã¢ã¯ãã£ããã£ïŒãŠãŒã¶ãŒãã·ãŒã³ãã¢ã¯ãã£ãã«æäœããŠããå Žåã¯ãé »åºŠãäžããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ïŒã¢ããªã±ãŒã·ã§ã³ã§ããã©ãŒãã³ã¹ã®åé¡ãçºçããŠããå Žåã¯ãé »åºŠãäžããŸãã
- ããã€ã¹ã®æ©èœïŒãŠãŒã¶ãŒã®ããã€ã¹ã®æ©èœã«åºã¥ããŠãé »åºŠã調æŽããŸãã
7. ã¬ã€ãã£ã¹ãã£ã³ã°ã¢ã«ãŽãªãºã ã®æé©å
åºç€ãšãªãã¬ã€ãã£ã¹ãã£ã³ã°ã¢ã«ãŽãªãºã èªäœãããã©ãŒãã³ã¹ã®ããã«æé©åã§ããŸããããã«ã¯ãSIMDïŒSingle Instruction, Multiple DataïŒåœä»€ã䜿çšããŠè€æ°ã®ã¬ã€ãåæã«åŠçããããããå¹ççãªäº€å·®ãã¹ãã¢ã«ãŽãªãºã ãæ¡çšãããããããšãå«ãŸããŸãã
äŸïŒåºãç¥ãããŠããé«éãã€å¹ççãªMöllerâTrumboreã¢ã«ãŽãªãºã ãªã©ã®æé©åãããã¬ã€äžè§åœ¢äº€å·®ã¢ã«ãŽãªãºã ãå©çšãããšãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸããSIMDåœä»€ã䜿çšãããšãã¬ã€ãã£ã¹ãã£ã³ã°ã§äžè¬çãªãã¯ãã«ã®æŒç®ã䞊ååŠçã§ãããããããã»ã¹ãããã«é«éåãããŸãã
8. ãããã¡ã€ãªã³ã°ãšç£èŠ
WebXRã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ããããã¡ã€ãªã³ã°ããã³ç£èŠããŠãããã«ããã¯ãšæé©åã®é åãç¹å®ããããšãéèŠã§ãããã©ãŠã¶ã®éçºè ããŒã«ãŸãã¯å°éã®ãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãããããã¹ãããã®ä»ã®ããã©ãŒãã³ã¹ãéèŠãªæäœã®å®è¡ã«ãããæéãæž¬å®ããŸãããã®ããŒã¿ã¯ãæé©åã®åãçµã¿ã«éäžããæã圱é¿åã®ããé åãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
äŸïŒChrome DevTools Performanceã¿ãã䜿çšããŠãWebXRã»ãã·ã§ã³ãèšé²ã§ããŸããã¿ã€ã ã©ã€ã³ãã¥ãŒãåæããŠãããããã¹ãã«é¢é£ããCPU䜿çšçã®é«ãæéãç¹å®ã§ããŸããããã«ãããããã©ãŒãã³ã¹ã®ããã«ããã¯ã®åå ãšãªã£ãŠããç¹å®ã®ã³ãŒãã»ã¯ã·ã§ã³ãã¿ãŒã²ããã«æé©åã§ããŸãã
ç£èŠããäž»èŠãªææšã«ã¯ã次ã®ãã®ããããŸãã
- ãã¬ãŒã ã¬ãŒãïŒ1ç§ãããã«ã¬ã³ããªã³ã°ããããã¬ãŒã æ°ã枬å®ããŸãã
- ããããã¹ãã®å®è¡æéïŒããããã¹ãã®å®è¡ã«ãããæéãæž¬å®ããŸãã
- CPU䜿çšçïŒã¢ããªã±ãŒã·ã§ã³ã®CPU䜿çšçãç£èŠããŸãã
- ã¡ã¢ãªäœ¿çšéïŒã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªæ¶è²»éã远跡ããŸãã
ã³ãŒãäŸ
以äžã¯ãåºæ¬çãªã¬ã€ãã£ã¹ãã£ã³ã°ã瀺ãThree.jsã䜿çšããç°¡åãªã³ãŒãäŸã§ãã
const raycaster = new THREE.Raycaster();
const mouse = new THREE.Vector2();
function onMouseMove( event ) {
mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
raycaster.setFromCamera( mouse, camera );
const intersects = raycaster.intersectObjects( scene.children );
if ( intersects.length > 0 ) {
// Handle intersection
console.log("Intersection found:", intersects[0].object);
}
}
window.addEventListener( 'mousemove', onMouseMove, false );
ãã®äŸã§ã¯ãããŠã¹ã®åãã«åºã¥ããŠæŽæ°ãããã·ãŒã³å ã®ãã¹ãŠã®ãªããžã§ã¯ããšäº€å·®ããã¬ã€ãã£ã¹ã¿ãŒãèšå®ããŸããåçŽã§ãããããã¯ããã«ããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸãã`three-mesh-bvh`ã䜿çšããŠBVHæ§é ãå®è£ ãããã¹ã察象ã®ãªããžã§ã¯ãã®æ°ãå¶éããäŸã以äžã«ç€ºããŸãã
import { MeshBVH, Ray } from 'three-mesh-bvh';
// Assume `mesh` is your Three.js Mesh
const bvh = new MeshBVH( mesh.geometry );
mesh.geometry.boundsTree = bvh;
const raycaster = new THREE.Raycaster();
const mouse = new THREE.Vector2();
const ray = new Ray(); // BVH expects a Ray object
function onMouseMove( event ) {
mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
raycaster.setFromCamera( mouse, camera );
ray.copy(raycaster.ray);
const intersects = bvh.raycast( ray, mesh.matrixWorld ); //Using raycast directly on the BVH
if ( intersects ) {
// Handle intersection
console.log("Intersection found:", mesh);
}
}
window.addEventListener( 'mousemove', onMouseMove, false );
ãã®äŸã§ã¯ãthree-mesh-bvhã䜿çšããŠBVHãã¬ã€ãã£ã¹ãã£ã³ã°ãšçµ±åããæ¹æ³ã瀺ããŸããã¡ãã·ã¥ãžãªã¡ããªã®BVHããªãŒãæ§ç¯ãã`bvh.raycast`ã䜿çšããŠäº€å·®ãã§ãã¯ãé«éåããŸããããã«ãããã·ãŒã³å ã®ãã¹ãŠã®äžè§åœ¢ã«å¯ŸããŠã¬ã€ããã¹ããããªãŒããŒããããåé¿ãããŸãã
WebXRããããã¹ãã®æé©åã®ããã®ãã¹ããã©ã¯ãã£ã¹
WebXRããããã¹ããæé©åããããã®ãã¹ããã©ã¯ãã£ã¹ã®æŠèŠã次ã«ç€ºããŸãã
- Bounding Volume HierarchyïŒBVHïŒãŸãã¯ãã®ä»ã®ç©ºéå岿è¡ã䜿çšããŸãã
- ç²ãã现ãžã®äº€å·®ãã¹ããå®è£ ããŸãã
- Frustum cullingã䜿çšããŠãç»é¢å€ã®ãªããžã§ã¯ããç Žæ£ããŸãã
- Temporal coherenceãæŽ»çšããŠãããããã¹ãã®é »åºŠãæžãããŸãã
- ãŠãŒã¶ãŒã®ã¢ã¯ãã£ããã£ãšã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«åºã¥ããŠãããããã¹ãã®é »åºŠã調æŽããŸãã
- SIMDãªã©ã®ææ³ã䜿çšããŠãã¬ã€ãã£ã¹ãã£ã³ã°ã¢ã«ãŽãªãºã ãæé©åããŸãã
- ã¢ããªã±ãŒã·ã§ã³ããããã¡ã€ã«ããã³ç£èŠããŠãããã«ããã¯ãç¹å®ããŸãã
- ã¡ã€ã³ã¹ã¬ããã®ãããã¯ãåé¿ããããã«ãå¿ èŠã«å¿ããŠéåæããããã¹ãã®äœ¿çšãæ€èšããŸãã
- ã·ãŒã³å ã®ãªããžã§ã¯ãã®æ°ãæå°éã«æãããããžãªã¡ããªãç°¡ç¥åããŸãã
- æé©åãããWebGLã¬ã³ããªã³ã°æè¡ã䜿çšããŠãå šäœçãªããã©ãŒãã³ã¹ãåäžãããŸãã
WebXRéçºã®ããã®ã°ããŒãã«ãªèæ ®äºé
ã°ããŒãã«ãªèŠèŽè åãã®WebXRã¢ããªã±ãŒã·ã§ã³ãéçºããå Žåãæ¬¡ã®ç¹ãèæ ®ããããšãéèŠã§ãã
- ããã€ã¹ã®å€æ§æ§ïŒWebXRã¢ããªã±ãŒã·ã§ã³ã¯ããã€ãšã³ãPCããããŒãšã³ãã®æºåž¯é»è©±ãŸã§ãå¹ åºãããã€ã¹ã§ã¹ã ãŒãºã«å®è¡ã§ããããã«èšèšããå¿ èŠããããŸããããã«ã¯ãã¢ãããã£ãã¬ã³ããªã³ã°æè¡ã䜿çšããããããã€ã¹ã®æ©èœã«åºã¥ããŠç°ãªã詳现ã¬ãã«ãæäŸãããããããšãå«ãŸããŸãã
- ãããã¯ãŒã¯æ¥ç¶ïŒäžéšã®å°åã§ã¯ããããã¯ãŒã¯æ¥ç¶ãå¶éãããŠããããä¿¡é Œæ§ãäœãå ŽåããããŸããWebXRã¢ããªã±ãŒã·ã§ã³ã¯ããããã¯ãŒã¯ã®äžæã«å¯ŸããŠå埩åãããããã«èšèšãããããã¯ãŒã¯çµç±ã§è»¢éããå¿ èŠã®ããããŒã¿ã®éãæå°éã«æããå¿ èŠããããŸãã
- ããŒã«ãªãŒãŒã·ã§ã³ïŒWebXRã¢ããªã±ãŒã·ã§ã³ã¯ãããŸããŸãªèšèªãæåã«åãããŠããŒã«ã©ã€ãºããå¿ èŠããããŸããããã«ã¯ãããã¹ãã®ç¿»èš³ãUIèŠçŽ ã®èª¿æŽãããã³é©åãªæåçåç §ã®äœ¿çšãå«ãŸããŸãã
- ã¢ã¯ã»ã·ããªãã£ïŒWebXRã¢ããªã±ãŒã·ã§ã³ã¯ãé害ã®ãããŠãŒã¶ãŒãã¢ã¯ã»ã¹ã§ããããã«ããå¿ èŠããããŸããããã«ã¯ãé³å£°å¶åŸ¡ãã¢ã€ãã©ããã³ã°ãªã©ã®ä»£æ¿å ¥åæ¹æ³ãæäŸããããã¢ããªã±ãŒã·ã§ã³ãæ¯æŽæè¡ãšäºææ§ãããããšã確èªãããããããšãå«ãŸããŸãã
- ããŒã¿ã®ãã©ã€ãã·ãŒïŒããŸããŸãªåœãå°åã®ããŒã¿ãã©ã€ãã·ãŒèŠå¶ã«æ³šæããŠãã ãããå人ããŒã¿ãåéãŸãã¯ä¿åããåã«ããŠãŒã¶ãŒã®åæãåŸãŠãã ããã
äŸïŒæŽå²çãªã©ã³ãããŒã¯ã玹ä»ããARã¢ããªã±ãŒã·ã§ã³ã¯ãããŒãšã³ãã®ã¢ãã€ã«ããã€ã¹ã§ã¹ã ãŒãºãªãã¬ãŒã ã¬ãŒããç¶æããããã«ãäœè§£å床ã®ãã¯ã¹ãã£ãšç°¡ç¥åããã3Dã¢ãã«ãæäŸããããšã«ãããããã€ã¹ã®å€æ§æ§ãèæ ®ããå¿ èŠããããŸãããŸãããŠãŒã¶ãŒã®åªå èšèªã§ã©ã³ãããŒã¯ã®èª¬æã衚瀺ããå¿ èŠã«å¿ããŠå³ããå·Šãžã®èšèªçšã«ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã調æŽããããšã«ãããããŸããŸãªèšèªããµããŒãããããã«ããŒã«ã©ã€ãºããå¿ èŠããããŸãã
çµè«
WebXRããããã¹ããæé©åããããšã¯ãã¹ã ãŒãºã§å¿çæ§ãé«ããæ¥œãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããäžã§éåžžã«éèŠã§ããã¬ã€ãã£ã¹ãã£ã³ã°ã®åºæ¬çãªååãçè§£ãããã®èšäºã§æŠèª¬ãããŠããææ³ãå®è£ ããããšã«ãããWebXRã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããå¹ åºãèŠèŽè ãã¢ã¯ã»ã¹ã§ããæ²¡å ¥åãšã¯ã¹ããªãšã³ã¹ãäœæã§ããŸããã¢ããªã±ãŒã·ã§ã³ããããã¡ã€ã«ããããã©ãŒãã³ã¹ãç£èŠããã·ãŒã³ãšã¿ãŒã²ããããã€ã¹ã®ç¹å®ã®ç¹æ§ã«åãããŠæé©åæŠç¥ã調æŽããããšãå¿ããªãã§ãã ãããWebXRãšã³ã·ã¹ãã ãé²åãç¶ããã«ã€ããŠãæ°ãã驿°çãªæé©åæè¡ãç»å ŽããŸããææ°ã®é²æ©ãšãã¹ããã©ã¯ãã£ã¹ãåžžã«ææ¡ããããšã¯ãæ²¡å ¥åWebãšã¯ã¹ããªãšã³ã¹ã®éçãæŒãåºãã髿§èœWebXRã¢ããªã±ãŒã·ã§ã³ãéçºããããã«äžå¯æ¬ ã§ãã