WebVR-Vive-Draggingã«äŒŒãVRã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŸãããããã«ãããVRã³ã³ãããŒã©ãŒã䜿çšããŠå€æ°ã®3Dãªããžã§ã¯ããæäœã§ããŸãã ããã¯ããŠãŒã¶ãŒãVRã³ã³ãããŒã©ãŒã§ãªããžã§ã¯ããã€ãã¿ã移åãŸãã¯æ¡å€§çž®å°ã§ããããšãæå³ããŸãã
åé¡ïŒã·ãŒã³ã«è€éãª3Dãªããžã§ã¯ããããå Žåãã€ãŸããé ç¹ã®æ°ãéåžžã«å€ããžãªã¡ããªãæã€THREE.Mesh
ãªããžã§ã¯ãã®å Žåãè¡çªæ€åºäžã®ã¬ã€ãã£ã¹ãã£ã³ã°ã¯éåžžã«é
ããªããŸãã ãããã£ãŠãåé¡ã¯1ã€ã®ãªããžã§ã¯ãã®ãžãªã¡ããªã®è€éãã§ãã
OctreeãR-Treeãªã©ãé«é空éæ€çŽ¢çšã®ããªãŒããŒã¿æ§é ããããŸãã ãžãªã¡ããªãå°ããªãã£ã³ã¯ã«åå²ã§ããthreeocttreeãèŠã€ããŸããããå°ãå€ããªã£ãŠããããã§ãïŒThree.jsr60ïŒã
ç§ãèŠãéãã THREE.Mesh
ãªããžã§ã¯ãã®raycast
ã¡ãœããã«ã¯ããã§ã«ããã€ãã®ããã©ãŒãã³ã¹ã®æé©åããããŸãïŒå®éã®ã¬ã€ãã£ã¹ããå®è¡ããåã«ãæåã«å¢çããã¯ã¹ãšçããã§ãã¯ããŸãïŒã å€åã空éæ¢çŽ¢æšã䜿çšããŠå¥ã®ãã®ãããªãã§ãã¯ã¹ããŒãžãæã€ããšã¯çã«ããªã£ãŠããŸããïŒïŒ ã©ãæããŸããïŒ
æ¬å ·
æçœãªããšãè¿°ã¹ããªã¹ã¯ããããŸããããã§ã«ãªããžããªïŒ examples / js / Octre.js ïŒã«ããããŒãžã§ã³ã®threeocttree
ãè©ŠããŸãããïŒ
three.js
ã§ã®ç©ºéæ¢çŽ¢æšã®ããŒãã¯ã€ã€ãŒã䜿çšã«ã¯æ祚ããŸããã ãã®ãããªã¢ã«ãŽãªãºã ã®ãªãŒããŒããã/è€éãã¯ãå€ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã®ããã©ãŒãã³ã¹ã®åäžãé倧ã«ãã©ã³ã¹ãããŸãã
å®éã®ã¬ã€ãã£ã¹ããè¡ãåã«ããŸãããŠã³ãã£ã³ã°ããã¯ã¹ãšçããã§ãã¯ããŸã
ããã¯åççã§ãããååãªã¯ãã§ãã ãŠãŒã¶ãŒãããé«åºŠãªãŠãŒã¹ã±ãŒã¹ã®ã³ã³ããã¹ãã§ããé«ãããã©ãŒãã³ã¹ãå¿ èŠãšããå ŽåããŠãŒã¶ãŒã¯åè¿°ã®äŸãåºçºç¹ãšããŠäœ¿çšã§ããŸãã å «åæšã¯è¯ãéžæãããããŸããã ãããããã®ã¢ãããŒãã¯éåžžã«æŽç·ŽãããŠãããããã€ã³ã¿ã©ã¯ãã£ããª3Dã¢ããªã±ãŒã·ã§ã³ã§R-Treeãœãªã¥ãŒã·ã§ã³ãèŠãããšããããŸããïŒã¢ã«ãŽãªãºã ã¯ã¹ããŒã¹åå²ã®ä»£ããã«ããŒã¿ãå®è¡ããŸãïŒã
ããã«ã¡ã¯ãè¿ä¿¡ããããšãããããŸãã
@Mugen87ç§ã¯å€ãã®ãŠãŒã¹ã±ãŒã¹ããã®ãããªé«éæ€çŽ¢ãå¿
èŠãšããªãããšã«åæããŸãã ãã ãã3Dãªããžã§ã¯ããšå¯Ÿè©±ããããã®ã¡ã«ããºã ãããïŒãããäž»ã«äœ¿çšãããŠãããšæããŸãïŒãæåã«å¢çããã¯ã¹/çããã§ãã¯ããããšããã®THREE.Raycaster
ã®ã¹ãããïŒããã¯å®å
šã«åççã§ããããšã«åæããŸãïŒ ïŒå®éã®ã¬ã€ãã£ã¹ããè¡ããšãã®ç·åœ¢æéã®åªåã«å¯Ÿããäžå®ã®æéã¯ããªã倧ãããšããŸãããã 1ã€ã®ã°ããŒãã«æ€çŽ¢ããªãŒã§ã¯ãªããäžçš®ã®ããžãªã¡ããªæ€çŽ¢ããªãŒããæ³åããããšãã§ããŸããã ãžãªã¡ããªãå€æŽãããªãéãïŒå€ãã®å Žåããžãªã¡ããªã®å€æŽãããå€æã®å¯èœæ§ãã¯ããã«é«ããªããŸãïŒãæ€çŽ¢ããªãŒãæŽæ°ããå¿
èŠã¯ãããŸããã
ãã®ããã空éæ¢çŽ¢æšã䜿çšãããã®ãããªæé©åã¯ã three.js
ã®ããäžå¯æ¬ ãªéšåã«ãªãå¯èœæ§ããããšæããŸããã ããããããã«ããè€éããšãªãŒããŒããããå¢ããããšãç解ããŠããŸãã
@moraxyãµã³ãã«ããŒãžã§ã³ãèŠãŠã¿ãŸãããã ãã®ãããªæ©èœãæå³ããªããã©ãããç¥ãããã£ãã ãã§ãã
ãããããé¡ãããŸã
ãã¶ãããã£ãšåçŽãªæ¢çŽ¢æšãTHREE.BufferGeometry
ã«çµ±åããããšãã§ããŸãã ããšãã°ã computeBoundingBox
ãåŒã³åºããšã察å¿ããé ç¹ãåç
§ããäžçš®ã®èªã¿åãå°çšæ€çŽ¢ããªãŒãæ§ç¯ããããšãã§ããŸãã THREE.BufferGeometry
ã¯
ãžãªã¡ããªãã€ã³ã¹ã¿ã³ã¹åããåŸããžãªã¡ããªãããŸãæäœããå¿ èŠããªãéçãªããžã§ã¯ãã«æé©ã§ã
ãã®æ€çŽ¢ããªãŒã¯ãåæååŸã«å€æŽããå¿ èŠã¯ãããŸããã ããã«ãããæŽæ°/åé€ã®ãªãŒããŒããããããããåæžãããŸãã Octreeã¯è¯ãåºçºç¹ã«ãªããŸãïŒ BabylonJSã®åæ§ã®æŠå¿µïŒã
ãžãªã¡ããªãã€ã³ã¹ã¿ã³ã¹åããåŸããžãªã¡ããªãããŸãæäœããå¿ èŠããªãéçãªããžã§ã¯ãã«æé©ã§ã
FWIWãç§ã¯ãããæ¬åœã®å£°æã ãšã¯æããªãã
THREE.BufferGeometry
ããã¥ã¡ã³ãããã®@WestLangleyã®åŒçš
THREE.BufferGeometryããã¥ã¡ã³ã
ããããåé€ããå¿ èŠããããŸãããããã«ãããããã¯æè¡çãªèª¬æã§ã¯ãªããäœæåŸã«ãŠãŒã¶ãŒããžãªã¡ããªãæäœããã®ãé£ããããšãæå³ããŠãããšæããŸãã
ããããåé€ããå¿ èŠããããŸã
確å®ã«ã
PlaneBufferGeometryã§ã¬ã€ãã£ã¹ãã£ã³ã°ããããã®ããè¯ãã¡ãœãããå®è£ ããŸããã farãã©ã¡ãŒã¿ãŒã䜿çšããŠãæåãšæåŸã®ã€ã³ããã¯ã¹äœçœ®ãèŠã€ããŸãã ã€ã³ããã¯ã¹é åã¯x/yã®é åºã§ãããããããã¯ãã¬ãŒã³ãããã¡ã§æ©èœããŸãã x / yããŠã³ãã£ã³ã°ããã¯ã¹ã®å€ã«åºããšããã¹ãŠã®è¡çªã¯é è·é¢ã®å€ã«ããå¿ èŠããããŸãã ãããã©ããã«ã³ãããããããšããé¡æã¯ãããŸããïŒ çŸåšã®å®è£ ã¯ç§ã®ãŠãŒã¹ã±ãŒã¹ã«åºæã§ãããå¿ èŠã«å¿ããŠãããäžè¬çãªãã®ã«ããããšæã£ãŠããŸãã 倧ããªplaneBufferïŒ2.5ç§ãã10msïŒã§ã¬ã€ãã£ã¹ãã£ã³ã°ã®ããã©ãŒãã³ã¹ãå€§å¹ ã«äœäžãããããšãã§ããŸãã
@kpetrowthree.jsoctreeã®äŸã§ååã ãšæããŸãã ãã¡ãããä»ã®äººã«åœ¹ç«ã€ãšæãããå Žåã¯ãGitHubã§ã³ãŒããèªç±ã«å ±æã§ããŸãã
éå»ã«ã空éã€ã³ããã¯ã¹ãthreejsã«å«ããããšãææ¡ããŸããã ãã®æ¹åã§ããã€ãã®äœæ¥ãè¡ãããŠãããæ¢åã®oct-treeã®äŸã¯ãã®1ã€ã§ãã çµå±ã®ãšããããã®æ©èœã3çŽã®ç¬¬äžçŽåžæ°ãšããŠæã€ããšã«é¢ããŠãã³ã¢ã³ãã¥ããã£ããã®é¢å¿ãæ¬ åŠããŠãããšæããŸãã
BVHã³ãŒããã¡ã€ã³ã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ã«å«ããã®ã«ååãªé¢å¿ãšæå³ãããå Žåã¯ããããžã§ã¯ãã«BVHã³ãŒããå¯ä»ã§ããã°å¹žãã§ãïŒäŸã§ã¯ãããŸããïŒã
ç§ã®ã³ãŒãã¯2ã€ã®åŽé¢ã«çŠç¹ãåœãŠãŠããŸãïŒ
ç§ã«ã¯2ã€ã®å®è£ ããããŸãïŒ
å人çã«ã¯ã空éã€ã³ããã¯ã¹ãªãã§ã¯çããŠãããŸãããããã¯n ^ 2ãšlogïŒnïŒã®ããã©ãŒãã³ã¹ã®éãã§ãã ããšãã°ãç§ã®çŸåšã®ãããžã§ã¯ãã§ã¯ã次ã®éšåã空éã€ã³ããã¯ã¹ã«äŸåããŠããŸãã
http://server1.lazy-kitty.com/komrade
å°åœ¢ã«ã¯çŽ1mã®ããªãŽã³ããããäœåæ¬ãã®æš¹æšãé 眮ãããã®äžã§ãªã¢ã«ã¿ã€ã ã®ã¬ã€ãã£ã¹ããå®è¡ããããšã¯ãç¹ã«ããŒãšã³ãããã€ã¹ã®å Žåã¯ç°¡åã§ãã
ã¬ã€ãã£ã¹ããæé©åãããã®ã¯äœã§ãèŠããã§ãã è€éããå¢ãããã«æé©åããäœå°ã¯ãããŸããïŒ Octreeã«ã¯ããã¹ãŠã®æ°ããã©ã€ãã©ãªãšããã¹ãŠã®æ°ããè¿œå ãæŽæ°ãªã©ãå¿ ââèŠã§ãã
ç§ãæ°ã¥ããããšã®1ã€ã¯ããžãªã¡ããªãã€ã³ããã¯ã¹ä»ããããã¡é åã«å€æããããšãå ã®ãžãªã¡ããªã®ããããã£ãã¹ããŒãã«äœ¿çšããªããªãããšã§ãã äžèšã®ããã«ãplaneBufferã®ãžãªã¡ããªã¯ãarrayBufferãPlaneGeometryããã®ãã®ã§ããããšãç¥ãããšã§è¶ æé©åã§ããŸãã ãã¶ããMESH.raycastïŒraycasterãintersectsïŒã¡ãœããããžãªã¡ããªã¿ã€ãã«åºã¥ãããã«äžæžãããŸããïŒ
ãã1ã€ã®ã¢ãããŒãã¯ãRaycasterãåå¥ã®ãã©ã°ã€ã³ãšããŠäœ¿çšããããšã§ããã€ã³ã¿ã©ã¯ãã£ãã³ã³ãããŒã«ãšããŒããŒãåæ§ã§ãã 次ã«ã @Usnulãææ¡ãããã®ãšåæ§ã®ããã©ãŒãã³ã¹ã®é«ãã¬ã€ãã£ã¹ã¿ãŒãè¿œå ããã®ã¯çŽ æŽãããããšã§ãã
ãã©ã°å¯èœãªã¬ã€ãã£ã¹ã¿ãŒã䜿çšãããšããã¢ã€ãã¢ã¯æ°ã«å ¥ã£ãŠããŸãããå°ãæ··ä¹±ããŠãããšæããŸãã ç§ã圹ç«ã€ãšæãã®ã¯ãã¬ã€ãã£ã¹ã¿ãŒèªäœã§ã¯ãªãã空éã€ã³ããã¯ã¹ã§ãã 空éã€ã³ããã¯ã¹ã§ã¯ã次ã®ãããªããšãã§ããŸãã
çŸåšãthree.jsã¯ããããã®ãã¡2ã€ãæ瀺çã«ïŒãœãŒããšã«ãªã³ã°ïŒã1ã€ãäŸãä»ããŠïŒã¬ã€ãã¬ãŒã¹ã¬ã³ãã©ãŒïŒå®è¡ããŸãã
空éã€ã³ããã¯ã¹ãå éšçã«ç¶æãããšã䞊ã¹æ¿ããšã«ãªã³ã°ãé«éåãããã€ã³ããã¯ã¹ã®ä¿åã«å¿ èŠãªè¿œå ã®RAMãç ç²ã«ããŠããã倧ããªã·ãŒã³ã«åŸã ã«å€ãã®ã¡ãªãããããããããŸãã
GPUãããã³ã°ã ãã䜿çšããŠã¿ãŸãããïŒ ããã€ãã®äŸããããå®è£ ã¯ããªãç°¡åã§ãã å ¬æŒã¯æŒãšå€ã§ãã ç§ãã¡ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ã100äžãè¶ ããããªãŽã³ã®ã¢ãã«ã䜿çšããŠãã¢ãã«äžã§ç©äºããã©ãã°ããªããããããã³ã°ã1ç§è¿ããã60fpsã§ãªã¢ã«ã¿ã€ã ã§å®è¡ãããããã«ãªããŸããã
@hccampos
GPUã®éžæã¯ãCPUã§å®è¡ãããããå¿
ãããé«éã§ã¯ãããŸãããGPUã®å Žåãå¿
èŠãªç²ŸåºŠã«æ¯äŸãã解å床ã§ã¬ã³ããªã³ã°ããå¿
èŠãããããããã¯ã»ã«ã®ç²ŸåºŠãå¿
èŠãªå Žåã¯ã1ïŒ1ã®ç»é¢è§£å床ã§ã¬ã³ããªã³ã°ããå¿
èŠããããŸãã ããã¯åå¥ã®ã¬ã³ããªã³ã°ãã¹ã§ããããªããžã§ã¯ããåå¥ã®ç°ãªãè²ãšããŠã¬ã³ããªã³ã°ããŠããããšã«æ³šæããŠãã ããã è¿œå ã®ã¬ã³ããªã³ã°ãã¹ã¯ãã°ã©ãã£ãã¯ã¡ã¢ãªã®äœ¿çšéãæå³ããŸãïŒéåžžãé
延ãã€ãã©ã€ã³ã®å ŽåïŒã
ãã€ããªç©ºéåå²ã€ã³ããã¯ã¹ã䜿çšãããšããããã³ã°ã®logïŒnïŒã¿ã€ãã³ã°ãããã¡ã€ã«ãåŸãããããã1,000,000ããªãŽã³ã®å Žåãå
ç·ã¯ãšãªã解決ããããã®çŽ14ã®æäœã確èªããããšã«ãªããŸãã ããŒã¿æ§é ã«ãã£ãŠã¯ãæ°ãã€ã¯ãç§ãããå¯èœæ§ãããããã¬ãŒã ããžã§ããã«å¹ã¿ãäœãå§ããåã«äœåãã®ã¯ãšãªãå¯èœã«ãªããŸãã
æ¯èŒããŠã¿ãŸããããããšãã°ã1mã®ããªã¢ãã«ããããç»é¢ã¹ããŒã¹ããã«ã¡ã©ã®æ¹åã«æ²¿ã£ãŠçŽæ¥ã·ãŒã³ã«å
ç·ãæ圱ããããšããŸãïŒãŠãŒã¹ã±ãŒã¹ãéžæïŒã ãã¬ã«è§£å床ã®äžéãããã«HDãããŸãã¯1920Ã1080ã䜿çšããŠãããšä»®å®ããŸããRGBã®ã¿ïŒãã¯ã»ã«ããã24ãããïŒãã¬ã³ããªã³ã°ãããšä»®å®ãããšãã¬ã³ããªã³ã°ã«ã¯6220800ãã€ãïŒçŽ6 MbïŒãŸãã¯ã°ã©ãã£ãã¯RAMãå¿
èŠã«ãªããŸããããã CPUãœãªã¥ãŒã·ã§ã³ã䜿çšããå ŽåããªãŒãããšã«10ããªãŽã³ã®AABB BVHã䜿çšãããšããŸããã€ãŸããçŽ200,000ããŒããå¿
èŠã§ããããšãã°ãåããŒãã¯åº§æšçšã«çŽ6 * 8ãã€ããäžéããŒãã«ã¯åãã€ã³ã¿ãŒçšã«2*4ãã€ããè¿œå ãããŸãããªãŒãããŒãã«ã¯ãããªãŽã³ãã€ã³ã¿çšã«10 * 4ãã€ããã€ãŸã14,400,000ãã€ãïŒçŽ14MbïŒããããŸãã äž»ãªéãã¯ãBVHã¯ãšãªãGPUã®å Žåãšæ¯èŒããŠãRAM垯åå¹
ã«å¯ŸããèŠæ±ãã»ãšãã©ãªããå®å
šãª1mã®ããªãžãªã¡ããªãã¬ã³ããªã³ã°ããå Žåãšæ¯èŒããŠãã¯ãšãªããšã«å¿
èŠãªæäœãã»ãã®ãããã§ãããšããäºå®ãèãããšãã«é¢ä¿ããŸãã
2560x1440ãªã©ããã¹ã¯ãããã§ããäžè¬çãªè§£å床ã䜿çšãããšãæçµçã«11059200ãã€ãã®ã¬ã³ããªã³ã°ã¿ãŒã²ããïŒ11MbïŒã«ãªããŸãã
ã°ã©ãã£ãã¯ã¹RAM垯åå¹ ã®äºç®ã倧ãããã·ã§ãŒããŒã³ã¢æ°ãããªãé©åãªå Žåã¯ãããããããã³ã°ãè¡ãããã®ã·ã³ãã«ã§ç°¡åãªæ¹æ³ã§ãã
@Usnulã¯çµ¶å¯Ÿã§ãããããããå®è£ ããã®ãæãç°¡åãªãœãªã¥ãŒã·ã§ã³ã§ãã 空éã€ã³ããã¯ã¹ããŒã¿æ§é ã®å®è£ ãšä¿å®ã¯ãããããthreejsã¡ã³ããã«ãšã£ãŠéèŠã§ã¯ãªãè² æ ã«ãªãã§ãããã
ããã¯èšã£ãŠãã3ã€ã®äžéšãšããŠããŸãã¯åå¥ã®npmããã±ãŒãžãšããŠãååã«ãã¹ããããç¶æãããŠããåªãã空éã€ã³ããã¯ã¹ããŒã¿æ§é ãå¿ èŠã§ãã
䜿çšãããžãªã¡ããªã«ãã®ãããªç©ºéã€ã³ããã¯ã¹ãå®è£ ããããšã«èå³ããã£ãã®ã§ãBufferGeomtryãåå²ããéåžžã«åçŽãªOctreeïŒäœæãšæ€çŽ¢ã®ã¿ïŒãå®è£ ããŸããã ãã®åçŽãªãœãªã¥ãŒã·ã§ã³ã§ãç§ã¯éåžžã«ææãªçµæãéæããŸãããçŽ500Kã®é ç¹ãæã€ãžãªã¡ããªã«é©çšãããšãã¬ã€ãã£ã¹ãæéãçŽ120ããªç§ããçŽ2.3ããªç§ã«ççž®ãããŸããã ããªãŒã®æ§ç¯ã«ã¯çŸåšçŽ500ããªç§ããããŸããããžãªã¡ããªãšããªãŒã®äœæã¯ã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«Webã¯ãŒã«ãŒå ã§1åã ãè¡ããããããããã¯ããã»ã©åé¡ã«ã¯ãªããŸããã
ã¢ã«ãŽãªãºã ã¯THREE.BufferGeometry
ã«éåžžã«ç°¡åã«çµ±åã§ãã THREE.BufferAttribute
ã®dynamic
ãªã©ã®ãã©ã°ã䜿çšããŠãªã³ãŸãã¯ãªãã«åãæ¿ããããšãã§ãããšæããŸãã ãã®ããã«ãBufferGeometryãå€æŽãããªãå Žåã«ã®ã¿äœ¿çšã§ããŸãã æ®å¿µãªããã THREE.Mesh
ã®raycast
ã¡ãœãããäžæžãããå¿
èŠããããŸããããå€æŽããå¿
èŠãããã®ã¯2è¡ã ãã§ããïŒOctreeæ€çŽ¢åŒã³åºããšäœçœ®é
åã®å埩ïŒã
ãšã«ãããç§ã®VRã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããŠã¹ã¯ãªãã¯ã§1åã ãã§ãªããã¬ã³ããªã³ã°ã«ãŒãäžã«ãªããžã§ã¯ããšã³ã³ãããŒã©ãŒã®è¡çªãæ€åºããå¿ èŠããããŸãã ãããã£ãŠãçŸåšã®ãœãªã¥ãŒã·ã§ã³ã«äŸåããå¿ èŠããããŸãã ããã«æ¹åã§ãããè©ŠããŠã¿ãŸãã
æŽæ°ã¬ã€ãã£ã¹ãæéã枬å®ããã®ãééããŸããã æ£ããå€ã¯ã2.3msã§ãïŒã0.3msã§ã¯ãããŸããïŒã ããã«å¿ããŠäžèšã®å€ãå€æŽããŸããã
three.jsäžã«æ§ç¯ãããæãè€éãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãé«éãªç©ºéã«ãã¯ã¢ããããªããã€ã³ããæ¹æ³ãå¿ èŠã ãšæããŸãã ããšãã°ã3Dãšãã£ã¿ã ç§ã¯ããã«ããã€ãã®å®è£ ãããããåããŸãããããããã¯ããŸãçµ±åãããŠããªããããŸãã¯ç¹å®ã®ããŒãžã§ã³ã®three.jsã«ããŸãã«ãç·å¯ã«ã©ãããããŠããŸãã ãããã£ãŠã誰ããæ°ããããŒãžã§ã³ã®three.jsãžã®ã¢ããã°ã¬ãŒããã¹ãå£ãããšãªããããè¡ããªããã€ã³ã®æ¹æ³ãæã£ãŠãããªããããã¯çŽ æŽãããããšã§ãã
@ matthias-w objã¢ãã«ã®raycasterãè©ŠããŸããããã³ã³ãããŒã©ãŒãäœãæ€åºããŠããŸããã å ç·ã¯ã¢ãã«ãééããŠããŸãã ãã®åé¡ãã©ã®ããã«ä¿®æ£ãããæããŠãã ãã
ãªãã·ã§ã³ã®ç©ºéã€ã³ããã¯ã¹ãæã€ããšã«ã€ããŠã ã¬ã³ãã©ãŒèªäœïŒã«ãªã³ã°ãªã©ïŒããšã³ãžã³ã®äžå¯æ¬ ãªéšåã§ããå Žåã§ããååã«åœ¹ç«ã€ãšæããŸãã é¢é£ãããã£ã¹ã«ãã·ã§ã³ã¯æ¬¡ã®ãšããã§ãã
ããïŒ ç§ãããã«å°ãèå³ããããŸãããïŒã¬ã€ãã£ã¹ãã®ããŒãºã«å¯ŸããŠä»ã®è§£æ±ºçãèŠã€ããŸãããïŒãå®éšã®ããã€ãã«ãè²¢ç®ããããšæããŸããã å°ãã©ãã§ãããæ°ãæåã«ãŸãšããŸããã
https://github.com/gkjohnson/threejs-fast-raycast
3ã€ã®ãžãªã¡ããªãªããžã§ã¯ãã«computeBoundsTree
é¢æ°ãè¿œå ããããã䜿çšããããã«raycasté¢æ°ããªãŒããŒã©ã€ãããŸãïŒè¿œå ã®æé©åãšããŠæåã®ãããã®ã¿ãè¿ããŸãïŒã ããã¯ãéçã§éåžžã«è€éãªã¡ãã·ã¥ã«ã®ã¿æ¬åœã«æçã§ãããã·ãŒã³ã空éçã«ã»ã°ã¡ã³ãåããããã«äœãããŸããã ããã¯ã80,000ã®äžè§åœ¢ã¡ãã·ã¥ã§ã®ã¬ã€ãã£ã¹ãããã©ãŒãã³ã¹ã®éãã確èªã§ãããã¢ã§ãã å¢çããªãŒã®èšç®ã¯å°ãé
ãã§ãããå°ãã®äœæ¥ã§ãããããã£ãšã¹ã ãŒãºã«ãªãã§ãããã
ããã«ã€ããŠã®ç§ã®æèŠã«é¢ããŠã¯ãç§ã¯å°ãççŸããŠãããšæããŠããŸãã ããã¯ãTHREEã®æ¡åŒµãšããŠããªãããŸãæ§ç¯ã§ãããã®ã®ããã«æããŸãã ãããŠæçµçã«ã¯ãè€éãªã¡ãã·ã¥ãã¢ãã¡ãŒã·ã§ã³åãããã¡ãã·ã¥ã«å¯ŸããŠäžè§åœ¢ããšã®ãã§ãã¯/è¡çª/ãã£ã¹ããè¡ãã®ãæé©ã§ã¯ãªãããã§ãã åçŽãªã±ãŒã¹ã§ã¯åé¡ãªããããããŸããããè€éãªã±ãŒã¹ã§è¶ é«éã®ã¬ã€ãã£ã¹ãã£ã³ã°ïŒãŸãã¯ãªã¯ã«ãŒãžã§ã³ã«ãªã³ã°ãè¡çªãªã©ïŒãæå¹ã«ããã«ã¯ãäžè¬çãªå¹³é¢/ç«æ¹äœ/ç/ã«ãã»ã«è¡šçŸãŸãã¯ç°¡ç¥åãããã¡ãã·ã¥ã䜿çšããæ¹ãé©ããŠããããã§ãã ãã¡ããããã¯ã»ã«ããŒãã§ã¯ããªãã£ã¹ããæ¢ããŠããå Žåãããã¯ããŸãæ©èœããŸããããé©åãªãœãªã¥ãŒã·ã§ã³ã¯å®éã«ã¯ãŠãŒã¹ã±ãŒã¹ã«ãã£ãŠç°ãªããŸãã
@Usnul @matthias-w octree / BVHã®å®è£ ã¯ãªãŒãã³ãœãŒã¹ã§ããããããšããªã³ã©ã€ã³ã§å ¥æã§ããŸããïŒ ãã²èŠãŠã¿ããã§ãïŒ
@gkjohnson
octree / BVHã®å®è£ ã¯ãªãŒãã³ãœãŒã¹ã§ããããããšããªã³ã©ã€ã³ã§å ¥æã§ããŸããïŒ ãã²èŠãŠã¿ããã§ãïŒ
çŸåšãã³ãŒãã¯ãªãŒãã³ãœãŒã¹ã§ã¯ãããŸããã ããªããç§ã«å人çã«é£çµ¡ããã°ãç§ã¯ããªãã«æ å ±æºãæäŸããããšãã§ããŸãã
ã€ã³ã¹ã¿ã³ã¹åãããã¡ãã·ã¥ã«å¯ŸããŠè¡ã£ãäŸããããŸãã
http://server1.lazy-kitty.com/tests/instanced-foliage-1mil/
äžèšã®äŸã«ã¯ã次ã®ãã®ãå«ãŸããŸãã
ç§ãåãçµãã§ããã²ãŒã ã§å®è¡ããŠããããŒãžã§ã³ããããŸãïŒ
http://server1.lazy-kitty.com/komrade/
ããªãã®å®è£ ã«é¢ããŠã ç§ã¯ããã奜ãã§ããç§ã®ãã®ã¯2ã€ã®äž»èŠãªç¹ã§ç°ãªããŸãïŒ
ããå ·äœçãªãã€ã³ãïŒ
@Usnulããªãã®ã¡ãŒã«ã¢ãã¬ã¹ãªã©ã¯ããããŸãããã空éã€ã³ããã¯ã¹ãœãªã¥ãŒã·ã§ã³ã®ç 究ã«éåžžã«èå³ããããŸãã
çŸåšãé¢é£ãããã¹ãŠã®ã·ãŒã³ãªããžã§ã¯ããã«ãŒãããŠãã«ã¡ã©ããã®è·é¢ãèšç®ããŠããŸãã æé©ãªã¢ãããŒãã§ã¯ãããŸããã
@titansoftime
ããã¯travnick at gmail com
å
¬éãããŠããªãããšã«æ°ã¥ããŠããŸããã§ããã ç§ã®æªãã
@Usnulç§ã100äžãããžã§ã¯ãã«èå³ããããŸãã å¯èœã§ããã°ããããã1,000äžãã2,000äžã§ãã ç§ã«ã¡ãŒã«ããŠãã ããïŒkaori.nakamotoã [email protected]
ã©ããããããšãããããŸããïŒ
http://server1.lazy-kitty.com/tests/instanced-foliage-10mil/
ããã¯1000äžã®ããŒãžã§ã³ã§ã
è¿äºãé
ããªã£ãŠãããã
@gkjohnsonã³ãŒãã¯ãªãŒãã³ãœãŒã¹ã§ã¯ãããŸããã ããã«ãããªãã®ãœãªã¥ãŒã·ã§ã³ã¯ç§ã®ãã®ãããã¯ããã«æŽç·ŽãããŠããããã«èãããŸãã ãããã£ãŠãç§ã®ãœãªã¥ãŒã·ã§ã³ããåŠã¶ããšã¯ããã»ã©å€ããªããšæããŸãã
@sid3007ããªãã®åé¡ãç解ããŠãããã©ããããããŸããã ç§ã®ã¢ãããŒãã説æããããšãã§ããŸãã å€åããã¯åœ¹ã«ç«ã¡ãŸãã
ç§ã®ãŠãŒã¹ã±ãŒã¹ã¯éåžžã«åçŽã§ãã ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšãããŸããŸãªã¢ãã«ã®ãžãªã¡ããªãèªã¿èŸŒãŸããŸãã ãããã®ã¢ãã«ã¯ããŠãŒã¶ãŒãå€æã§ããŸãã 圢ç¶ã¯å€ãããŸããã ãžãªã¡ããªã®å€åœ¢ã¯ãããŸããã ãããã£ãŠãã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«ãã¹ãŠã®ãžãªã¡ããªã«å¯ŸããŠ1åäœæãããéåžžã«åçŽãªOctreeãå®è£
ããŸããã å
«åæšã¯åçã§ã¯ãããŸããã ããã¯ãæå®ããããžãªã¡ããªã®ããŠã³ãã£ã³ã°ããã¯ã¹ãšé ç¹ã®é
åã«åºã¥ããŠæ§ç¯ãããŸãã æ§ç¯äžã«ããªã¯ã¿ã³ãã«é ç¹ãå«ãŸããŠãããããªã¯ã¿ã³ãã®Box3
ããŠã³ãã£ã³ã°ããã¯ã¹ãäžè§åœ¢ïŒã€ã³ããã¯ã¹ä»ããããŠããªããžãªã¡ããªã®3ã€ã®é£ç¶ããé ç¹ïŒãšäº€å·®ããŠãããã©ããããã§ãã¯ããé ç¹é
ååç
§ãoctreeã®ããŒãã«æ ŒçŽããŸãã
ã¡ãã·ã¥ããšã®å
«åæšã¯ãã¡ãã·ã¥ãšäžç·ã«ä¿åãããŸãã ãŸããå®éã«octree亀差ãã¹ãã¡ãœãããåŒã³åºãããã«ãã¡ãã·ã¥ã€ã³ã¹ã¿ã³ã¹ã®THREE.Mesh
ã®raycast
ã¡ãœããïŒ1è¡ã®ã¿ïŒãäžæžãããŸãã ããã«ãããã¡ãã·ã¥ã®ããã©ã«ãã®äº€å·®ããžãã¯ã§äœ¿çšã§ãããžãªã¡ããªé¢ã®é ç¹ã€ã³ããã¯ã¹ãè¿ãããŸãã
ç§ã¯1ã€ã®æé©åãè¡ããŸãããoctreeã®äœæã¯ãWebWorkerïŒå®éã«ã¯ã¯ãŒã«ãŒã®ããŒã«ïŒå
ã§ã¢ããªã®èµ·åæã«1åè¡ãããŸãã ãã®çç±ã¯ã倧ããªãžãªã¡ããªã®ããªãŒäœæã«ã¯ããªãã®æéïŒæ°ç§ïŒããããããã§ãã ããã«ãããã©ãŠã¶ã®UIããããã¯ããããããå¥ã®ã¹ã¬ããã«ç§»åããŸããã
ç§ã®ã¢ãããŒããæ確ã«ãªãããšãé¡ã£ãŠããŸãã
@ matthias-wãã°ãããä»äºã®ããã§ããïŒ ç§ã¯ç¬ç«ããŠã»ãŒåãããšãããŸããããããã©ãŒãã³ã¹ã®å€§å¹ ãªåäžã¯éæã§ããªãã£ããšæããŸãã https://discourse.threejs.org/t/octree-injection-for-faster-raytracing/8291/2 ïŒãªããžã§ã¯ãæåã®octreeå®è£ ãããã³Mesh.raycastãžã®ããŸãã¯ãªãŒã³ã§ãªãå€æŽïŒ
Octreeã®å®è£ ããªãŒãã³ãœãŒã¹å/è²¢ç®ããŠãä»ã®äººã«ããããå€ãã®å®éšãå¯èœã«ããããšã¯å¯èœã§ããããïŒ
@EliasHasleããããšãããããŸãã å®ã¯ãæåã®å¯Ÿçãééããã®ã§ãããã©ãŒãã³ã¹ã®åäžã¯ããã»ã©è¯ããããŸããã å€ãä¿®æ£ããŸããïŒäžèšã®ç§ã®æçš¿ãåç §ïŒã Octreeã®å¯Ÿæ°æ¢çŽ¢ã®è€éãã«é¢ããŠã¯ãã¿ã€ãã³ã°ãããçã«ããªã£ãŠããŸãã æ®å¿µãªãããçŸæç¹ã§ã¯ã³ãŒããå©çšã§ããããã«ããããšã¯ã§ããŸããããããããä»å¹Žã®åŸåã«ãªããŸãã ãšã«ãããç§ã®å®è£ ã¯éåžžã«ç°¡åã§ãïŒãããŠããã»ã©ã¯ãªãŒã³ãªãšããã§ã¯ãããŸãã;ïŒïŒã ãããã£ãŠãç¹å¥ãªæŽå¯ã¯ãªããšæããŸãã
@matthias-w 500ké ç¹ã¡ãã·ã¥ã§ã®ã¬ã€ãã£ã¹ãã®2.3ããªç§å¯Ÿ120ããªç§ã¯ããŸã å€§å¹ ãªæ¹åã§ãããšæããŸããããšãã°ãã²ãŒã ã§çºå°ããã匟䞞ã®ãªã¢ã«ã¿ã€ã 解決ãå¯èœã«ãªããŸãïŒèšç®ã®ããªãã®éšåã§ïŒãã¬ãŒã ãããã®äºç®ïŒã
ã¬ã€ãã¬ãŒã·ã³ã°ãè©ŠããŸãããïŒ
å®è£ ã¯JSãªããžã§ã¯ãã®ããªãŒã«åºã¥ããŠããŸããïŒ ãªãã©ã«ãªããžã§ã¯ããŸãã¯ãããã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ïŒ é±å±±ã¯å®å šã«èªå·±çžäŒŒã§ããããããã¹ãŠã®ããŒãã¯ã¡ãœãããšãã¹ãŠãåããå «åæšã§ãã
@EliasHasle
éçãžãªã¡ããªã«å¯Ÿããã¬ã€ãã£ã¹ãã£ã³ã°ã«èå³ãããå Žåãç§ãä»ã®äººã¯ãBVHã䜿çšããŠäžè§åœ¢ã«ã€ã³ããã¯ã¹ãä»ããéçãªè€éãªãžãªã¡ããªã«å¯Ÿãã亀差æ€åºã ãã§ãªããé«æ§èœã®ã¬ã€ãã£ã¹ãã£ã³ã°ãå¯èœã«ãã3ã¡ãã·ã¥bvhã«å€å€§ãªåªåãæã£ãŠããŸãã ããªãŒæ§ç¯ããã»ã¹ã¯ããè€éã§ãããããå°ãæéãããããŸãããæ°åäžã®äžè§åœ¢ãæã€ãžãªã¡ããªã«å¯ŸããŠã¬ã€ãã£ã¹ãããå Žåã1ããªç§æªæºãå€ãã®å Žå0.1ããªç§æªæºã®ã¬ã€ãã£ã¹ããå¿ èŠã«ãªããŸãã
ãã«ãæéã¯ããã€ãã®ç°ãªãæ¹æ³ã§æ¹åã§ããŸãããããã§ç§ãããããã£ãããšã«ã¯ååã§ãã-ãããããããæ¹åããããšã¯ãªã¹ãã«ãããŸãã
åçãªã·ãŒã³ããŒã¹ã®å «åæšãæ§ç¯ããŠãã¡ãã·ã¥ã®å€ãã·ãŒã³ã®ã¬ã€ãã£ã¹ãã£ã³ã°ãšè¡çªæ€åºãæ¹åããããšæããŸãããç§èªèº«ã¯è¯ããŠãŒã¹ã±ãŒã¹ãæã£ãŠããŸããã§ããã å€åãã€ãïŒ
@EliasHasleç§ã®å®è£ ã¯JSã¯ã©ã¹ãªããžã§ã¯ãã®ããªãŒã§ãïŒç§ã¯ES6ã¯ã©ã¹ãã€ãŸããããã¿ã€ãã€ã³ã¹ã¿ã³ã¹ã䜿çšããŠããŸãïŒã åºæ¬çã«ãããŒãã¯ç§ã®å®è£ ã§ã¯ããªãŒã§ãã ãã ããã«ãŒãããŒããä¿æããããªãŒãæ§ç¯ããã³æ€çŽ¢ïŒããã³ãããã°ãšèŠèŠåïŒããããã®ã¡ãœãããæäŸããè¿œå ã®Octreeã¯ã©ã¹ããããŸãã
ããªãŒããŒãã®æ倧ã¬ãã«ãšãªãŒãããŒããããã®é ç¹ã®æ倧æ°ã®å€ã«ã€ããŠã¯ãããŸãå®éšããŸããã§ããã ãã¶ããã£ãšè¯ãçµã¿åããããããŸãã
ãŸãã亀差ãã¹ããé«éåããããã«ãããŠã³ãã£ã³ã°ããªã¥ãŒã éå±€ã䜿çšããŸãã ããã§ãã¡ãã·ã¥ãžãªã¡ããªã®å
«åæšãå®éã«ãã§ãã¯ããåã«ãã¡ãã·ã¥ã®ããŠã³ãã£ã³ã°çãšããŠã³ãã£ã³ã°ããã¯ã¹ããã¹ãããŸãã
è¡çªæ€åºã¢ãããŒãã®éåžžã«åªããã³ã¬ã¯ã·ã§ã³ã§ããæ¬ããå§ãããŸãïŒCãEricsonãReal-Time Collision DetectionãCRC Pressã2004
@gkjohnsonããããã ïŒ ããã©ãŒãã³ã¹ã¯å°è±¡çã§ãã ã©ããªBVHã䜿ã£ãŠããŸããïŒ
@ matthias-wããããšãïŒ
ããã€ãã®åå²æŠç¥ãªãã·ã§ã³ããããŸãããæãé·ãåŽã®äžå€®ã§BVHããŒããåå²ãããšãããªãŒãæãéãæ§ç¯ãããŸãã äžè§åœ¢ã¯å¢çã®äžå¿ã«åºã¥ããŠèŸºã«åå²ãããããªãŒããŒãã¯åäžè§åœ¢ãå®å šã«å«ãããã«æ¡åŒµãããŸãïŒãããã£ãŠãããªãŒããŒãã®ãªãŒããŒã©ããããããã«ãããŸãïŒã
@gkjohnsonã§ã¯ãBVHã®å®è£ ã¯ãããã¯ã¹ã®åœ¢ç¶ã«äŸåãã軞ã®éžæã䌎ãäžçš®ã®äžåè¡¡ãªKdããªãŒã§ãã ãããããªããç§ã¯ã«ãŒãBBãç«æ¹äœããé ãããå Žåã«ãã®ãããªããšãããŠãæ¡ä»¶ä»ãåå²ã®åŸã«å «åæšã䜿çšããããšãèããŠããŸããã ããã¯ããããã @ Usnulã®ãããã¯ãŒã«ããªã©ãæåã®åå²ã2ã€ã®ããããã次å ã§è¡ããããã®åŸã®åå²ã3Dã§é²è¡ããå Žåã«é©ããŠããŸãã ã«ãŒãBBãåãäžå¿ãæã€å¢çãã¥ãŒãã«æ¡åŒµãããã®åŸãå «åæšåå²ã䜿çšãããšããç§ã®è§£æ±ºçãããã¯ããã«åªãã解決çã ãšæããŸãã
PlaneBufferGeometryã§ã¬ã€ãã£ã¹ãã£ã³ã°ããããã®ããè¯ãã¡ãœãããå®è£ ããŸããã
@kpetrow PlaneBufferGeometry
ã§ã¬ã€ãã£ã¹ããæé©åãããšãé ç¹ã®äœçœ®ãå€æŽãããªããšããä»®å®ã¯ãç·åœ¢æ¢çŽ¢ãäžååãªé«è§£å床ã®ãžãªã¡ããªã§ã¯æå¹ã§ãªãå¯èœæ§ãéåžžã«é«ããªããŸãã ç§ã®ç¥ãéããé«è§£å床ã®PlaneBufferGeometry
ã®äž»ãªçšéã¯ãå°åœ¢ãç¶æããªãããé ç¹ã移åããŠåœ¢ç¶ãå€æŽããããšã§ããããšãã°ãå°åœ¢ãæ§ç¯ããããã§ãã
ïŒ13909ãæ¯æããŠéäŒã
æãåèã«ãªãã³ã¡ã³ã
éå»ã«ã空éã€ã³ããã¯ã¹ãthreejsã«å«ããããšãææ¡ããŸããã ãã®æ¹åã§ããã€ãã®äœæ¥ãè¡ãããŠãããæ¢åã®oct-treeã®äŸã¯ãã®1ã€ã§ãã çµå±ã®ãšããããã®æ©èœã3çŽã®ç¬¬äžçŽåžæ°ãšããŠæã€ããšã«é¢ããŠãã³ã¢ã³ãã¥ããã£ããã®é¢å¿ãæ¬ åŠããŠãããšæããŸãã
BVHã³ãŒããã¡ã€ã³ã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ã«å«ããã®ã«ååãªé¢å¿ãšæå³ãããå Žåã¯ããããžã§ã¯ãã«BVHã³ãŒããå¯ä»ã§ããã°å¹žãã§ãïŒäŸã§ã¯ãããŸããïŒã
ç§ã®ã³ãŒãã¯2ã€ã®åŽé¢ã«çŠç¹ãåœãŠãŠããŸãïŒ
ç§ã«ã¯2ã€ã®å®è£ ããããŸãïŒ
å人çã«ã¯ã空éã€ã³ããã¯ã¹ãªãã§ã¯çããŠãããŸãããããã¯n ^ 2ãšlogïŒnïŒã®ããã©ãŒãã³ã¹ã®éãã§ãã ããšãã°ãç§ã®çŸåšã®ãããžã§ã¯ãã§ã¯ã次ã®éšåã空éã€ã³ããã¯ã¹ã«äŸåããŠããŸãã
http://server1.lazy-kitty.com/komrade
å°åœ¢ã«ã¯çŽ1mã®ããªãŽã³ããããäœåæ¬ãã®æš¹æšãé 眮ãããã®äžã§ãªã¢ã«ã¿ã€ã ã®ã¬ã€ãã£ã¹ããå®è¡ããããšã¯ãç¹ã«ããŒãšã³ãããã€ã¹ã®å Žåã¯ç°¡åã§ãã