äžéšã®ã¢ãã©ã¯ã¿ã¯ã鿢ç»ã§ããã®çŸããã«é äºãããŸããç§ãã¡ã¯ãã»ãšãã©ã®ã¢ãã©ã¯ã¿ããã€ããã¯ã¹ã3Dãã©ã°ãªãã§èŠèŠåã§ããã¢ããªã±ãŒã·ã§ã³ãäœãããã£ãã®ã§ãã
ç§ãã¡ã«é¢ããŠã¯
ç§ãã¡ã¯RomanVenediktovãVladislav NosivskoyãKirillKarnaukhovã§ãããµã³ã¯ãããã«ãã«ã¯ã®é«ççµæžåŠéšã®åŠå£«èª²çšãå¿çšæ°åŠãšæ å ±åŠãã®2幎çã§ããç§ãã¡ã¯åŠçæä»£ããããã°ã©ãã³ã°ã奜ãã§ããã3äººå šå¡ããªãªã³ããã¯ããã°ã©ãã³ã°ã«åŸäºããç°ãªã幎ã«ã³ã³ãã¥ãŒã¿ãµã€ãšã³ã¹ã®åŠç«¥ã®ããã®å šãã·ã¢ãªãªã³ããã¯ã®æçµæ®µéã«ç§»è¡ããŸãããã圌ãã¯ä»¥åã«ç£æ¥ããã°ã©ãã³ã°ã®çµéšããªããããã¯ç§ãã¡ã«ãšã£ãŠæåã®å€§èŠæš¡ãªããŒã ãããžã§ã¯ãã§ããC ++ã«é¢ããã¿ãŒã ããŒããŒãšããŠæè·ããŸããã
ã¢ããªã³ã°
å¥åŠãªã¢ãã©ã¯ã¿ã䜿çšããŠåçã·ã¹ãã ãå®çŸ©ããæ¹æ³ã¯ãããããããŸãããæãäžè¬çãªã®ã¯3ã€ã®1æ¬¡åŸ®åæ¹çšåŒã®ã·ã¹ãã ã§ããç§ãã¡ã¯åœŒå¥³ããå§ããŸããã
äœããèŠèŠåããåã«ãããã»ã¹èªäœãã·ãã¥ã¬ãŒããããã€ã³ãã®è»éãèŠã€ããå¿ èŠããããŸããæ£ç¢ºãªã¢ããªã³ã°æ¹æ³ã¯éåžžã«æéãããããããã§ããã ãæ©ãå®è¡ããããšèããŠããŸãã
ã¢ããªã³ã°ãå®è£ ããéã«ãã¡ã¿ããã°ã©ãã³ã°ã䜿çšããstd ::颿°ãä»ã®åæ§ã®ã¡ã«ããºã ãæŸæ£ããããšã«ããŸãããã¢ãŒããã¯ãã£ãšã³ãŒãã£ã³ã°ãç°¡çŽ åããããšãã§ããŸãããããã©ãŒãã³ã¹ãå€§å¹ ã«äœäžãããããæãŸãããããŸããã§ããã
æåã¯ãäžå®ã®ã¹ãããã§4次ã®ç²ŸåºŠã®æãåçŽãªRunge-Kuttaã¡ãœãããã¢ããªã³ã°ã«äœ¿çšãããŸããããããŸã§ã®ãšãããã¢ãã«ã®ã¡ãœããããã®ä»ã®æ°åŠã³ã³ããŒãã³ãã®æ°ãå¢ããããšã«æ»ã£ãŠããŸãããçŸåšããããæç€ºãããŠããå¯äžã®ã¡ãœããã§ããèŠã€ãã£ãã»ãšãã©ã®ã·ã¹ãã ã§ã¯ãä»ã®ãœãŒã¹ããã®ç»åãšåæ§ã®ç»åãçæããã®ã«ååãªç²ŸåºŠããããŸãã
ã¢ãã«ã¯å ¥åãšããŠåãå ¥ããŸãïŒ
- ãã€ã³ãã®åº§æšã«ãã£ãŠå°é¢æ°ãååŸããããã®ãå°é¢æ°ã颿°ã
- ããªãã¶ãŒããŒããã¡ã³ã¯ã¿ãŒãåä¿¡ãããšããã«ãã®ãã€ã³ãããåŒã³åºãããŸãã
- ã·ãã¥ã¬ãŒã·ã§ã³ãã©ã¡ãŒã¿ïŒéå§ç¹ãã¹ããããµã€ãºãç¹æ°ïŒã
å°æ¥çã«ã¯ãæç€ºãããç»åãå®éã®ç»åãšã©ã®ããã«äžèŽãããã確èªããããã®ãã§ãã¯ãã¢ããªã³ã°ã®ãã匷åãªæ¹æ³ïŒBoost.Numeric.Odeintã©ã€ãã©ãªãæ¥ç¶ãããªã©ïŒãããã³æ°åŠã®ç¥èããŸã ååã§ãªããã®ä»ã®åææ¹æ³ã远å ã§ããŸãã
ã·ã¹ãã
ç§ãã¡ã¯ããããããæé«ã®ããã©ãŒãã³ã¹ãåŒãåºãããã«æã人æ°ã®ããå¥åŠãªã¢ãã©ã¯ã¿ã·ã¹ãã ãèŠã€ããŸãããããã§ã¯ããã®æ€çŽ¢ãéåžžã«ç°¡åã«ãããµã€ãchaoticatmospheres.comã«æè¬ããŸãã
ãã¹ãŠã®ã·ã¹ãã ã¯ããã¹ãŠããã³ãã¬ãŒããã§ããã«ãããããããã³ã³ããã«å ¥ããŠã³ã³ãããŒã©ã§æ£åžžã«åäœã§ããããã«ãã©ããããå¿ èŠããããŸãããæ¬¡ã®è§£æ±ºçã«å°éããŸããã
- DynamicSystem âobserverâ, (, ...) std::function âcomputeâ. âComputeâ , , âderivativesâ .
- std::function , DynamicSystemInternal compute .
- DynamicSystemInternal âobserverâ, âderivativesâ. âderivativesâ, .
DynamicSystemãææããèŠèŠåã«å¿ èŠãªååŠçïŒæ£èŠåã®ããã®å®æ°ã®éžæãã¹ãããé·å¶åŸ¡ã䜿çšããã¡ãœããã®èš±å®¹å¯èœãªãšã©ãŒãªã©ïŒãå®è¡ã§ããDynamicSystemWrapperã®è¿œå äœæ¥ãéå§ããŸããããçµäºããæéããããŸããã§ããã
èŠèŠå
ããã©ãŒãã³ã¹ãšæ©èœã®ããã«ã¬ã³ããªã³ã°ã©ã€ãã©ãªãšããŠOpenGLãéžæããŸããããŸããOpenGLã®äŸ¿å©ãªã©ãããŒãæã€Qt5ãéžæããŸããã
ãŸããå°ãªããšãäœããæãæ¹æ³ãåŠã³ããã£ãã®ã§ããããã°ããããŠæåã®ãã¥ãŒããäœãããšãã§ããŸããããã®åŸãŸããªããæ°åŠã¢ãã«ã®åçŽãªããŒãžã§ã³ãç»å ŽããŸããããããã¢ãã©ã¯ã¿ã®æåã®èŠèŠåã§ãã
èŠèŠåã®æåã®ããŒãžã§ã³ã§ã¯ãéåžžã«ã·ã³ãã«ãªããŒãžã§ã³ã®ã«ã¡ã©ãçšæãããŠããŸããã圌女ã¯äžç¹ãäžå¿ã«å転ããè¿ã¥ã/é¢ããæ¹æ³ãç¥ã£ãŠããŸãããç§ãã¡ã¯å®å®ã§ãã£ãšèªç±ãæãã§ããŸãããã¢ãã©ã¯ã¿ã¯ç°ãªããããŸããŸãªæ¹æ³ã§æ¢çŽ¢ããå¿ èŠããããŸããæ¬¡ã«ãã«ã¡ã©ã®2çªç®ã®ããŒãžã§ã³ãç»å ŽããŸãããããã¯ããã¹ãŠã®æ¹åã«èªç±ã«å転ããã³ç§»åã§ããŸãïŒMinecraftã®ã«ã¡ã©ã«ãã£ãŠã¬ã€ããããŸããïŒãåœæãç·åœ¢ä»£æ°ã¯å§ãŸã£ãã°ããã ã£ããããååãªç¥èããããŸããã§ãããã€ã³ã¿ãŒãããã§å€ãã®æ å ±ãæ¢ãå¿ èŠããããŸããã
ãã®éãã£ãšãåçã¯çœããéçã§ãé¢çœããããŸããã§ãããè²ãšãã€ããã¯ã¹ã远å ãããã£ããæåã«ãå šäœåã1ã€ã®è²ã§ãã€ã³ãããæ¹æ³ãåŠã³ãŸãããããããé¢çœããªãããšãããããŸãããæ¬¡ã«ã次ã®è§£æ±ºçãèãåºããŸããã
- äºãã«è¿ãéå§ç¹ãããããïŒ100ã500ãèšå®ã§ããã«éžæã§ããŸããäž»ãªããšã¯ååãªããã©ãŒãã³ã¹ãããããšã§ãïŒã
- ãããã®ããããããã®è»éãã·ãã¥ã¬ãŒãããŸãã
- è»éãç°ãªãè²ã§è²ä»ãããªããåæã«ã¬ã³ããªã³ã°ããè»éã®ã»ã°ã¡ã³ãã®ã¿ã衚瀺ããŸãã
ãã®çµæã次ã®ããšã倿ããŸããã
ã»ãŒãã®ã¹ããŒã ã¯æåŸãŸã§æ®ã£ãŠããŸããã
ç·ããè§åŒµã£ãŠãããããšã«æ°ã¥ããæ»ããã«ããæ¹æ³ãåŠã¶ããšã«ããŸããããã¡ãããã·ãã¥ã¬ãŒã·ã§ã³ã®ã¹ããããæžããããã«åªããŸããããæ®å¿µãªãããææ°ã®ããã»ããµã§ããããã®ãããªæ°ã®ãã€ã³ããã«ãŠã³ãããããšã¯ã§ããŸãããå¥ã®ãªãã·ã§ã³ãæ¢ãå¿ èŠããããŸããã
æåã¯ãOpenGLã«ã¯ã¢ã³ããšã€ãªã¢ã·ã³ã°ããŒã«ãå¿ èŠã ãšèããŠããŸããããå€ãã®æ€çŽ¢ãè¡ã£ãçµæãããã§ã¯ãªãããšãããããŸãããæ¬¡ã«ãæ²ç·ãè£éããååã«é¢ããŠãã飿¥ãããã€ã³ãã®åãã¢ã®éã«ããã«ããã€ãã远å ãããšããã¢ã€ãã¢ãæãæµ®ãã³ãŸããããããè¡ãã«ã¯ãæ²ç·ãè£éããæ¹æ³ãéžæããå¿ èŠãããããã®ãããªæ¹æ³ã¯ãããããããŸããæ®å¿µãªããããããã®ã»ãšãã©ïŒããšãã°ãããžãšæ²ç·ïŒã§ã¯ãããã«ããã€ãã®ãã€ã³ããæå®ããå¿ èŠããããŸããããããã¯æããã«ç§ãã¡ã®ã¿ã¹ã¯ã«ã¯é©ããŠããŸããã§ããããã°ããããŠãé©åãªè£éãèŠã€ããŸããïŒCatmull-Romaæ²ç·ãããã¯æ¬¡ã®ããã«ãªããŸããïŒ
ãã®åŸãã¢ããªå ã§åç»ãé²ç»ãããšãããšæããŸãããã¯ãã¹ãã©ãããã©ãŒã ãç¶æãããã£ãã®ã§ãlibavã©ã€ãã©ãªã«æ±ºããŸããïŒã©ã€ãã©ãªéã§ã»ãšãã©éžæã®äœå°ã¯ãããŸããã§ããïŒãæ®å¿µãªãããã©ã€ãã©ãªå šäœãCã§èšè¿°ãããŠãããã€ã³ã¿ãŒãã§ã€ã¹ãéåžžã«äžäŸ¿ã§ãããããäœãã®èšè¿°æ¹æ³ãåŠã¶ã®ã«é·ãæéãããããŸããã以éã®ãã¹ãŠã®gifã¯ãçµã¿èŸŒã¿ã®èšé²ã䜿çšããŠäœæãããŸãã
ãããŸã§ããã¹ãŠã®æ²ç·ã®è²ã¯äœææã«æç€ºçã«æå®ãããŠããŸãããçŸããåçãæ®ãã«ã¯ãè²ãå€ããå¿ èŠããããšå€æããŸããããããè¡ãããã«ãã³ã³ãããŒã«ã«ã©ãŒã®ã¿ã衚瀺ããå§ããæ®ãã¯ç·åœ¢åŸé ã䜿çšããŠèšç®ãããŸããããã®éšåã¯ã·ã§ãŒããŒã«ç§»ãããŸããïŒä»¥åã¯æšæºã§ããïŒã
ãããããé ããå°Ÿãžãšè²ãå€ãããããªæ¹æ³ã§è»éã«è²ãä»ããã®ã¯è峿·±ãããšã§ãããããã«ãããé床ã®åœ±é¿ã芳å¯ã§ããŸãã
次ã«ãè»éã®ååŠçæéãççž®ãã䟡å€ããããšèããŸãããæ²ç·ã®è£éã¯ãé«äŸ¡ãªãæäœã§ããè»éã®äžéšãæç»ããããã«èŠæ±ããããã³ã«GPUãè£éãèšç®ããããã«ããã®éšåãã·ã§ãŒããŒã«è»¢éããããšã決å®ãããŸããããã®ããã«ãGeometryShaderã䜿çšããŸããããã®ãœãªã¥ãŒã·ã§ã³ã«ã¯å€ãã®å©ç¹ããããŸããæç»åã®ã¬ã³ããªã³ã°åŽã§ã®é å»¶ããªããæ²ç·ãããã«æ»ããã«ããæ©èœïŒãã®ãããªèšç®ã¯CPUãããGPUã§é«éã«å®è¡ãããŸãïŒã䜿çšããRAMãå°ãªããªããŸãïŒãã®åã¯ããã¹ãŠã®è£éãã€ã³ããä¿åããå¿ èŠããããŸããããä»ã¯-ãããïŒã
ã³ã³ãããŒã©ãšãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹
åºæ¬ãã¬ãŒã ã¯ãŒã¯ãšããŠQt5ãéžæããåŸãã€ã³ã¿ãŒãã§ãŒã¹ã®ãã¯ãããžãŒãéžæãããšããåé¡ã¯ããã«æ¶ããŸãããçµã¿èŸŒã¿ã®QtCreatorã¯ãå°ããªã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ããŒãºãååã«æºãããŸãã
ãŠãŒã¶ãŒã®èŠæ±ã«å¿çããã«ã¯ãã³ã³ãããŒã©ãŒãäœæããå¿ èŠããããŸããã幞ããQtã«ã¯ãããŒã¹ãããŒã¯ãåŠçããŠãã£ãŒã«ãã«å€ãå ¥åããããã®äŸ¿å©ãªæ¹æ³ããããŸããããã¯ãQtã®äž»ãªã¢ã€ãã¢ã§ããä¿¡å·ãšã¹ãããã®ã¡ã«ããºã ã䜿çšããŠããŸããããšãã°ãã¢ããªã±ãŒã·ã§ã³ã§ã¢ãã«ã®åæ§ç¯ãæ åœãããã¿ã³ãæŒããšããã³ãã©ã¹ãããã«ãã£ãŠåãå ¥ããããä¿¡å·ãçæãããŸããåæ§ç¯èªäœãéå§ãããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ãåããã»ãšãã©ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ãéçºãããšããé ããæ©ãããã¢ããªã±ãŒã·ã§ã³ããã«ãã¹ã¬ããã«ãããšããã¢ã€ãã¢ãæµ®ãã³äžãããŸããçµã¿èŸŒã¿ã¢ãã«ã®æ§ç¯ã«ã¯æ°ç§ããããã«ã¹ã¿ã ã¢ãã«ã®æ§ç¯ã«ã¯10ç§ããããŸãããåæã«ããã¡ããããã¹ãŠã®èšç®ã1ã€ã®ã¹ã¬ããã§å®è¡ããããããã€ã³ã¿ãŒãã§ã€ã¹ããã³ã°ããŸãããããªãé·ãéãããŸããŸãªãªãã·ã§ã³ã«ã€ããŠè©±ãåããstd :: asyncã䜿çšããŠéåæã«ã€ããŠèããŸããããæçµçã«ã¯ãå¥ã®ã¹ã¬ããã§èšç®ãäžæã§ããããã«ããããšèããŸããããããè¡ãã«ã¯ãstd :: threadã®ã©ãããŒãäœæããå¿ èŠããããŸããããã¹ãŠãå¯èœãªéãåçŽã§ãããã§ãã¯çšã®ã¢ãããã¯ãã©ã°ãšããã§ãã¯ã倱æããå Žåã®é©åãªå²ã蟌ã¿ã§ãã
ããã«ãããæãŸããçµæãåŸãããã ãã§ãªããã€ã³ã¿ãŒãã§ã€ã¹ããã³ã°ããªããªããŸããããŸããã¢ãŒããã¯ãã£ã®ç¹æ®æ§ãšã¢ãã«ããŒã¿ãšèŠèŠåã®éã®çžäºäœçšã«ãããã«ãŠã³ãã®éçšã§ãã¹ãŠããªã³ã©ã€ã³ã§æç»ã§ããããã«ãªããŸããã以åã¯ããã¹ãŠã®ããŒã¿ãåŸ ã€å¿ èŠããããŸããã
ã«ã¹ã¿ã ã·ã¹ãã
ã¢ããªã±ãŒã·ã§ã³ã«ã¯ãã§ã«å€ãã®ã¢ãã©ã¯ã¿ãçšæãããŠããŸããããŠãŒã¶ãŒãèªåã§æ¹çšåŒãå ¥åã§ããããã«ãããã£ãã®ã§ãããã®ããã«ã倿°ïŒxãyãzïŒãæšæºã®æ°åŠæŒç®ïŒ+-* / ^ïŒã宿°ãå€ãã®æ°åŠé¢æ°ïŒsinãcosãlogãatanãsinhãexpãªã©ïŒããµããŒãããããŒãµãŒãäœæããŸããããšãã©ã±ãããããããã®ä»çµã¿ã§ãïŒ
- å ã®ã¯ãšãªæååã¯ããŒã¯ã³åãããŸããæ¬¡ã«ãããŒã¯ã³ãå·Šããå³ã«è§£æãããåŒããªãŒãæ§ç¯ãããŸãã
- å¯èœãªæäœã¯ã°ã«ãŒãã«åããããŸããåã°ã«ãŒãã«ã¯ç¬èªã®ããŒãããããŸããã°ã«ãŒãïŒãã©ã¹ãã€ãã¹ãä¹ç®é€ç®ãææ°ãåé ãã€ãã¹ãããããã·ãŒãïŒããã«ã¯å®æ°ã倿°ã颿°åŒã³åºããå«ãŸããŸãïŒã
- åã°ã«ãŒãã«ã¯ãç¬èªã®ã¬ãã«ã®èšç®ããããŸããåã¬ãã«ã¯ã次ã®ã¬ãã«ã§ååž°çãªèšç®ãåŒãèµ·ãããŸããåŒã³åºãã®é åºãæäœã®åªå é äœã®ååžã«åœ±é¿ãäžããããšãããããŸããäžèšã®é çªã§ãçšæããŠãããŸãã
ããŒãµãŒã®ãœãŒã¹ã³ãŒãã§ è©³çŽ°ãæ¢ããŠãã ããã
åã¬ãã«ã¯ãããŒãã®ããçš®ã®ç¶æ¿è ãè¿ããŸãããããã®4ã€ããããŸãïŒ
- ãã€ããªæŒç®å-2ã€ã®åãžã®ãã€ã³ã¿ãšç¬èªã®ã¿ã€ãã®æäœãæ ŒçŽããŸãã
- unaryæŒç®å-åãžã®ãã€ã³ã¿ãšããèªäœã®æäœã¿ã€ããæ ŒçŽããŸããããã¯ãåäžæäœã®ç¹æ®ãªã±ãŒã¹ã§ããããã颿°ãå«ãŸããŸãã
- 宿°-ãã®å€ãæ ŒçŽããŸãã
- variable-å€ãååšããã¡ã¢ãªå ã®å Žæãžã®ãã€ã³ã¿ãæ ŒçŽããŸãã
ããŒãæ§é ã«ã¯ããã®ãµãããªãŒã®å€ãè¿ãä»®æ³èšç®é¢æ°ã®ã¿ããããŸãã
çµæã®åºåã¯ãåè¿°ã®ã·ã¹ãã ã¢ãŒããã¯ãã£ã«åãããŠéåžžã«äŸ¿å©ã«èª¿æŽãããŸããã©ã ãã¯åã«DynamicSystemInternalã«æž¡ãããååŸããã3ã€ã®ããªãŒã®ã«ãŒãããŒããžã®ãã€ã³ã¿ãŒãšå€ã®xyzã¡ã¢ãªäœçœ®ãæ ŒçŽãããŸããåŒã³åºããããšãããã«ããå€ãæäŸãããå€ã«å€æŽããã«ãŒãé ç¹ããcalcãåŒã³åºããŸãã
çµæ
ãã®çµæããŠãŒã¶ãŒå®çŸ©ã®ã·ã¹ãã ãèŠèŠåã§ãã倿°ã®ã¢ãã©ã¯ã¿ãåºç€ãšããããã°ã©ã ãæã«å ¥ããŸããã圌女ã¯ãããéåžžã«ããŸãè¡ããæé©åããŠããŸããããã¯æå ±ã§ãã
ãããããŸã å€ãã®äœæ¥ããããŸãã
- ããæ£ç¢ºãªã¡ãœããã远å ããŸãã
- ã·ã¹ãã åŠçã®ã¬ã€ã€ãŒããã1ã€è¿œå ããŸãïŒããè€éãªæ¹æ³ã§ã®æ£èŠåãšèªåãšã©ãŒéžæïŒã
- ãŠãŒã¶ãŒã·ã¹ãã ã§ã®äœæ¥ãæ¹åããŸãïŒå€æ°ã®ãµããŒããä¿åïŒã
- äœæ¥ãæé©åããŸãïŒJITã³ã³ãã€ã«ããŸãã¯ä¿åãããã·ã¹ãã ãc ++ã³ãŒãã«å€æããçµã¿èŸŒã¿ã·ã¹ãã ã®ããã©ãŒãã³ã¹ãå®çŸããããã«åã³ã³ãã€ã«ãéå§ãããŠãŒãã£ãªãã£ïŒã
- ãã®ãããªã·ã¹ãã ã§äœæ¥ãã人ã ãæ¬åœã«å¿ èŠãšããçµæåæãŸãã¯èŠèŠåã®ããã®æ©èœã远å ããŸãã
- ..ã
ç§ãã¡ã®ãªããžããªã
ãããŠãã¢ãã©ã¯ã¿ãåããããã€ãã®ãããªïŒ