ã¹ãã¢ãªã³ã°åäœã¯ãåçŽãªåã䜿çšããããšã§èªåŸçãªãã£ã©ã¯ã¿ãŒãçŸå®çã«åãã®ãå©ããŸããåçŽãªåã®çµã¿åããã«ãããç°å¢ã®åšãã§èªç¶ãªèŠãç®ãšå³èã®åããäœæãããŸãã ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãã¹ãã¢ãªã³ã°åäœçè«ã®åºç€ãšãã®å®è£
ã«ã€ããŠèª¬æããŸãã
ãã®ãããªè¡åãæ§ç¯ãããã¢ã€ãã¢ã¯ã
ã¯ã¬ã€ã°ã»ã©ã€ã³ãã«ãºã«ãã£ãŠææ¡ãããŠããŸãã ãããã¯ãçµè·¯èšç»ãã°ããŒãã«ã³ã³ãã¥ãŒãã£ã³ã°ã䜿çšããè€éãªæŠç¥ã«åºã¥ããŠããã®ã§ã¯ãªããè¿é£ã®ãªããžã§ã¯ãã®åŒ·åºŠãªã©ã®ããŒã«ã«æ
å ±ãé©çšããŸãã ãã®ãããã§ãç解ãšå®è£
ãç°¡åã§ãããåæã«éåžžã«è€éãªåãã®ãã¿ãŒã³ãäœæã§ããŸãã
泚ïŒãã®ãã¥ãŒããªã¢ã«ã¯AS3ãšFlashã§äœæãããŠããŸãããã»ãŒãã¹ãŠã®ã²ãŒã éçºç°å¢ã§åãææ³ãšæŠå¿µã䜿çšã§ããŸãã æ°åŠçãªãã¯ãã«ã®åºæ¬çãªç解ãå¿
èŠã«ãªããŸãã
ããŒã1.ã·ãŒã¯åäœïŒæ€çŽ¢ïŒ
äœçœ®ãé床ããã³åã
æ°åŠçãã¯ãã«ã䜿çšããŠãã¹ãã¢ãªã³ã°åäœã«é¢ä¿ãããã¹ãŠã®åãå®çŸã§ããŸãã ãããã®åã¯ãã£ã©ã¯ã¿ãŒã®é床ãšäœçœ®ã«åœ±é¿ããããããã¯ãã«ã䜿çšããŠããããè¡šãããšãè«ççã§ãã
ãã¯ãã«ã«ã¯
æ¹åããã
ãŸãã ãäœçœ®ã«é¢ããŠã¯ç¡èŠããŸãïŒäœçœ®ãã¯ãã«ã¯ãã£ã©ã¯ã¿ãŒã®çŸåšäœçœ®ã瀺ããšä»®å®ããŸãïŒã
äžã®ç»åã¯ã
(x, y)
äœçœ®ã
(x, y)
é床
(a, b)
ãæã€æåã瀺ããŠããŸãã éåã¯
ãªã€ã©ãŒæ³ã䜿çšã
ãŠèšç®ãããŸãïŒ
position = position + velocity
é床ãã¯ãã«ã®æ¹åã¯ãã£ã©ã¯ã¿ãŒã®åãã®æ¹åãå¶åŸ¡ãããã®é·ãïŒãŸãã¯å€§ããïŒã¯åãã¬ãŒã ã®åãã®éãå¶åŸ¡ããŸãã é·ããé·ãã»ã©ããã£ã©ã¯ã¿ãŒã¯éãåããŸãã é床ãã¯ãã«ã¯ãç¹å®ã®å€ãè¶
ããªãããã«åãæšãŠãããšãã§ããŸãïŒéåžžãããã¯æ倧é床ã§ãïŒã 以äžã¯ããã®ã¢ãããŒãã瀺ãç»åã§ãã
èµ€ãæ£æ¹åœ¢ãã¿ãŒã²ããã«åãã£ãŠç§»åããŸãã ã¢ãŒã·ã§ã³ãã¿ãŒã³ã¯ã
seekã®åäœã瀺ããŠããŸããããããŸã§ã®ãšãã
ãå¶åŸ¡å
ãé©çšãããŠã
ãŸãã ã ç·ã®ç·ã¯ã次ã®ããã«èšç®ãããé床ãã¯ãã«ã瀺ããŸãã
velocity = normalize(target - position) * max_velocity
å¶åŸ¡åããªããã°ããã£ã©ã¯ã¿ãŒã¯çŽæ¥ã®ã«ãŒããèšè¿°ããã¿ãŒã²ããã移åãããšããã«æ¹åãå€ãããããçŸåšã®ã«ãŒããšæ°ããã«ãŒãã®éã§æ¥æ¿ãªç§»è¡ãè¡ãããšã«æ³šæããŠãã ããã
åã®èšç®
é床ã®åã®ã¿ãé¢ä¿ããå Žåããã£ã©ã¯ã¿ãŒã¯ãã®ãã¯ãã«ã®æ¹åã«ãã£ãŠå®çŸ©ãããçŽç·ã§ã®ã¿ç§»åããŸãã ã¹ãã¢ãªã³ã°åäœã®ååã®1ã€ã¯ãåïŒ
å¶åŸ¡åãšåŒã°ããïŒãè¿œå ããŠãã£ã©ã¯ã¿ãŒã®åãã«åœ±é¿ãäžããããšã§ãã ãããã®åã®ãããã§ããã£ã©ã¯ã¿ãŒã¯ããããã®æ¹åã«ç§»åããŸãã
ã·ãŒã¯åäœã®å Žåãåãã¬ãŒã ã®ãã£ã©ã¯ã¿ãŒã«å¶åŸ¡åãè¿œå ããããšã§ã圌ã¯ã¹ã ãŒãºã«é床ãå€æŽããã«ãŒãã®çªç¶ã®å€æŽãåé¿ããŸãã ã¿ãŒã²ããã移åãããšããã£ã©ã¯ã¿ãŒã¯
åŸã
ã«é床ãã¯ãã«ãå€æŽããæ°ããå Žæã§ã¿ãŒã²ããã«å°éããããšããŸãã
ã·ãŒã¯åäœã«ã¯ã
å¿
èŠãªé床ãš
å¶åŸ¡åã®2ã€ã®åãé¢ä¿ããŠããŸãã
å¿
èŠãªé床ã¯ãå¯èœãªéãæçã®ãã¹ã«æ²¿ã£ãŠãã£ã©ã¯ã¿ãŒããŽãŒã«ã«å°ãåã§ãïŒãããã®éã®çŽç·ã§-以åã¯ããããã£ã©ã¯ã¿ãŒã«äœçšããå¯äžã®åã§ããïŒã
é§ååã¯ãå¿
èŠãªé床ããçŸåšã®é床ãåŒããçµæã§ãã 圌女ã¯ãŸãããã£ã©ã¯ã¿ãŒããŽãŒã«ã«åããŸãã
ãããã®åã¯æ¬¡ã®ããã«èšç®ãããŸãã
desired_velocity = normalize(target - position) * max_velocity steering = desired_velocity - velocity
匷å¶é©çš
å¶åŸ¡åãèšç®ããåŸãããããã£ã©ã¯ã¿ãŒã«é©çšããå¿
èŠããããŸãïŒé床ã®åã«è¿œå ãããŸãïŒã ãã¬ãŒã ããšã«å¶åŸ¡åãè¿œå ãããšããã£ã©ã¯ã¿ãŒã¯ã¹ã ãŒãºã«å€ãçŽæ¥ã«ãŒããé¢ããŠãç®æšã«åãã£ãŠ
é²ã¿ãæ€çŽ¢ãã¹ã説æ
ããŸã ïŒäžå³ã®ãªã¬ã³ãžã®æ²ç·ïŒã
ãããã®åã®é©çšãšæçµçãªé床/äœçœ®ã®èšç®ã¯æ¬¡ã®ãšããã§ãã
steering = truncate (steering, max_force) steering = steering / mass velocity = truncate (velocity + steering , max_speed) position = position + velocity
å¶åŸ¡åã¯ããã£ã©ã¯ã¿ãŒãåŠçã§ãã蚱容åã®éãè¶
ããªãããã«åãæšãŠãããŸãã ããã«ãå¶åŸ¡åã¯ãã£ã©ã¯ã¿ãŒã®è³ªéã§é€ç®ãããŸããããã«ããããŠã§ã€ããç°ãªããã£ã©ã¯ã¿ãŒã«å¯ŸããŠç°ãªãé床ãäœæãããŸãã
ã¿ãŒã²ããã移åãããã³ã«ãããã«å¿ããŠåãã£ã©ã¯ã¿ãŒã«
å¿
èŠãªé床ã®ãã¯ãã«ãå€åããŸãã ãã ãã
é床ãã¯ãã«ãå€æŽããåã³ã¿ãŒã²ããã«
åããã«ã¯æéãããããŸãã ãã®çµæãåããã¹ã ãŒãºã«ç§»è¡ããŸãã
ããŒã2ãé亡ãšå°çã®è¡å
éãã
äžèšã®ã·ãŒã¯åäœã¯ããã£ã©ã¯ã¿ãŒãã¿ãŒã²ããã«åãã2ã€ã®åãã€ãŸãå¿
èŠãªé床ãšå¶åŸ¡åã«åºã¥ããŠããŸãã
desired_velocity = normalize(target - position) * max_velocity steering = desired_velocity - velocity
ãã®å Žåã
desired_velocity
ã¯ããã£ã©ã¯ã¿ãŒãšã¿ãŒã²ããã®éã®æçãã¹ã§ãã ãã£ã©ã¯ã¿ãŒã®äœçœ®ããç®æšäœçœ®ãåŒãããšã§åŸãããŸãã çµæã¯ã
ãã£ã©ã¯ã¿ãŒãã
ã¿ãŒã²ããã«æž¡ãããåãã¯ãã«ã§ãã
é亡ã¯åã2ã€ã®åã䜿çšããŸããããã£ã©ã¯ã¿ãŒ
ãã¿ãŒã²ãããã
éããããã«èšå®ãããŠããŸãã
é亡è¡åãã®æ°ãã
desired_velocity
ãã¯ãã«
desired_velocity
ã
ã¿ãŒã²ããã®äœçœ®ãã
ãã£ã©ã¯ã¿ãŒã®äœçœ®ãæžç®ããããšã«ãã£ãŠèšç®ããã
ã¿ãŒã²ãããã
ãã£ã©ã¯ã¿ãŒã«åãããããã¯ãã«ãåŸãããŸãã
çµæã®åã¯ãã·ãŒã¯åäœãšã»ãŒåãæ¹æ³ã§èšç®ãããŸãã
desired_velocity = normalize(position - target) * max_velocity steering = desired_velocity - velocity
ãã®å Žåã
desired_velocity
ã¯ããã£ã©ã¯ã¿ãŒãã¿ãŒã²ãããããšã¹ã±ãŒãããããã«äœ¿çšã§ããæçã®ãšã¹ã±ãŒããã¹ãè¡šããŸãã å¶åŸ¡åã«ããããã£ã©ã¯ã¿ãŒã¯çŸåšã®ã«ãŒããé¢ããåžæããé床ã®ãã¯ãã«ã®æ¹åã«ãã£ã©ã¯ã¿ãŒãæŒãåºããŸãã
fleeã®åäœã§å¿
èŠãªé床ã®ãã¯ãã«ããseekã®åäœã§åããã¯ãã«ãšæ¯èŒãããšã次ã®é¢ä¿ãå°ãåºãããšãã§ããŸãã
flee_desired_velocity = -seek_desired_velocity
èšãæãããšã1ã€ã®ãã¯ãã«ã¯å¥ã®ãã¯ãã«ã«å¯ŸããŠè² ã§ãã
åé¿
å¶åŸ¡åãèšç®ããåŸãããããã£ã©ã¯ã¿ãŒã®é床ãã¯ãã«ã«è¿œå ããå¿
èŠããããŸãã ãã®åã¯ãã£ã©ã¯ã¿ãŒãã¿ãŒã²ããããé ãããããããã£ã©ã¯ã¿ãŒã¯åãã¬ãŒã ã§ã¿ãŒã²ããã«åãã£ãŠåããæ¢ããããããé¢ãå§ãã
ãšã¹ã±ãŒããã¹ãäœæã
ãŸã ïŒäžå³ã®ãªã¬ã³ãžã®æ²ç·ïŒã
ãããã®åã®è¿œå ãšæçµé床/äœçœ®ã®èšç®ã¯ã以åãšåãæ¹æ³ã§å®è¡ãããŸãã
ãã¹ãŠã®åãé©çšãããšãåãã£ã©ã¯ã¿ãŒã¯çŸåšã®ã«ãŒããã¹ã ãŒãºã«é¢ããç®æšãåé¿ã§ããŸãã
ãŽãŒã«ã¯åãã£ã©ã¯ã¿ãŒã«åœ±é¿ããŸããããã£ã©ã¯ã¿ãŒéã®è·é¢ã¯èæ
®ããŸããã ã圱é¿ç¯å²ããå¶éããŠããã£ã©ã¯ã¿ãŒãã¿ãŒã²ããã«è¿ãããå Žåã«ã®ã¿éããããã«ããããšãã§ããŸãã
å°ç
ãããŸã§èŠãŠããããã«ãã·ãŒã¯åäœã¯ãã£ã©ã¯ã¿ãŒããŽãŒã«ã«åãã£ãŠç§»åãããŸãã 圌ãç®æšã«éãããšãæ¯é
åã¯åãã«ãŒã«ã«åŸã£ãŠåœŒã«åœ±é¿ãäžãç¶ãããã£ã©ã¯ã¿ãŒãã¿ãŒã²ããã®ååŸã«ããžã£ã³ãããããŸãã
å°çæã®åäœã§ã¯ããã£ã©ã¯ã¿ãŒãã¿ãŒã²ãããééããããšã¯ã§ããŸããã çµç¹ã«è¿ã¥ããšããã£ã©ã¯ã¿ãŒãç®æšã«å°éãããšã¹ããŒããŠã³ããŠåæ¢ããŸãã
ãã®åäœã¯2ã€ã®ã¹ãããã§æ§æãããŠããŸãã æåã®æ®µéã¯ããã£ã©ã¯ã¿ãŒãã¿ãŒã²ããããé ããšãã§ãã ã·ãŒã¯åäœãšåãããã«æ©èœããŸãïŒãã£ã©ã¯ã¿ãŒã¯æ倧é床ã§ã¿ãŒã²ããã«åãã£ãŠç§»åããŸãïŒã
第2段éã¯ããã£ã©ã¯ã¿ãŒãã¿ãŒã²ããã®è¿ãã«ããããã®ãæžéé åãïŒã¿ãŒã²ããã®äœçœ®ãäžå¿ãšããåïŒå
ã«ãããšãã«éå§ãããŸãã
ãã£ã©ã¯ã¿ãŒãåã«å
¥ããšãã¿ãŒã²ããã§æ¢ãŸããŸã§ã¹ããŒããŠã³ããŸãã
ã¹ããŒããŠã³
ãã£ã©ã¯ã¿ãŒãã¹ããŒããŠã³ã®é åã«å
¥ããšããã®é床ã¯ãŒããŸã§çŽç·çã«æžå°ããŸãã ããã¯ãæ°ããå¶åŸ¡åïŒ
å°çå ïŒããã£ã©ã¯ã¿ãŒã®é床ãã¯ãã«ã«é©çšããããšã§å®çŸã§ããŸãã ãã®å ç®ã®çµæã¯é
ããæ©ãããŒãã«çãããªããŸããã€ãŸããåãã¬ãŒã ã§ãã£ã©ã¯ã¿ãŒã®äœçœ®ã«äœãè¿œå ãããŸããïŒã€ãŸããåãã¯ãããŸããïŒã
ãã£ã©ã¯ã¿ãŒãåæ¢ããåã«ãã£ãããšæžéããããã«ãé床ãããã«ãŒãã«äœäžããããšã¯ãããŸããã 段éçãªæžéã®ããã»ã¹ã¯ãæžéé åã®ååŸãšããã£ã©ã¯ã¿ãŒãšã¿ãŒã²ããã®éã®è·é¢ã«åºã¥ããŠèšç®ãããŸãã
è·é¢ã
slowingRadius
ããã倧ããå Žåããã£ã©ã¯ã¿ãŒã¯ã¿ãŒã²ããããé ãã圌ã®é床ã¯
max_velocity
çãããŸãŸã§ããå¿
èŠããããŸãã
è·é¢ã
slowingRadius
ããå°ããå Žåããã£ã©ã¯ã¿ãŒã¯ã¹ããŒããŠã³ã®é åã«å
¥ããã¹ããŒããäœäžããŸãã
distance / slowingRadius
å€ã®ç¯å²ã¯ã
1
ïŒ
distance
ã
slowingRadius
å ŽåïŒãã
0
ïŒ
distance
ã»ãŒãŒãã®å ŽåïŒã§ãã ç·åœ¢ã«å€åãããšãé床ãåŸã
ã«äœäžããŸãã
äžèšã®ããã«ããã£ã©ã¯ã¿ãŒã®åãã¯æ¬¡ã®ãšããã§ãã
steering = desired_velocity - velocity velocity = truncate (velocity + steering , max_speed) position = position + velocity
å¿
èŠãªé床ããŒããŸã§äœäžããå Žåãå¶åŸ¡åã¯
-velocity
çãããªã
-velocity
ã ãããã£ãŠããã®å¶åŸ¡åãé床ã«è¿œå ããããšããŒãã«ãªãããã£ã©ã¯ã¿ãŒãåæ¢ããŸãã
åºæ¬çã«ãå°çæã®åäœã¯
-velocity
ã«çããåãèšç®ãããã®åãé©çšãããŠããéã¯ãã£ã©ã¯ã¿ãŒãåãããšãèš±å¯ããŸããã åæã®ãã£ã©ã¯ã¿ãŒé床ãã¯ãã«ã¯å€åããåäœãç¶ããŸãããå¶åŸ¡åãå ããããšã§ãŒãã«ãªã»ãããããŸãã
å°çã®å¶åŸ¡åãåãé€ããããšããã£ã©ã¯ã¿ãŒã¯å
ã®é床ãã¯ãã«ã䜿çšããŠåã³åãå§ããŸãã
ãããã«
éããè¡åã¯ãã£ã©ã¯ã¿ãŒãã¿ãŒã²ããããé ãããå°çããè¡åã¯ãã£ã©ã¯ã¿ãŒãã¹ããŒããŠã³ãããã¿ãŒã²ããã®äœçœ®ã§åæ¢ãããŸãã äž¡æ¹ã®åäœã䜿çšããŠãã¹ã ãŒãºãªãšã¹ã±ãŒããäœæãããããã¿ãŒã³ã«åŸãããšãã§ããŸãã ããã«ãããããçµã¿åãããŠãããã«è€éãªåããäœæã§ããŸãã
ããŒã3.è¡åã®ãµãã€ã
ããŸãã
ã²ãŒã ã§ã¯ããã£ã©ã¯ã¿ãŒãã©ã³ãã ã«æ©ãåãããšããã°ãã°å¿
èŠã§ãã éåžžããã®ãããªãã£ã©ã¯ã¿ãŒã¯ãäœããã®çš®é¡ã®ã€ãã³ãïŒããšãã°ããã¬ã€ã€ãŒãšã®æŠãïŒãåã«åŸ
ã£ãŠããããäœããæ¢ããŠããŸãã ãã¬ã€ã€ãŒããã®åäœãèŠãããšãã§ããå Žåããã£ã©ã¯ã¿ãŒã®æŸæµªæ©èœã¯éåžžã«çŸå®çã§çŸããèŠããã¯ãã§ãã
ãã¬ã€ã€ãŒãæ確ã«å®çŸ©ãããã«ãŒããŸãã¯éçŸå®çãªåããèŠããšãããã¯è¿·æã«ã€ãªãããŸãã ææªã®å Žåããã¬ã€ã€ãŒã¯ãã£ã©ã¯ã¿ãŒã®åããäºæž¬ããæ¹æ³ãç解ããã²ãŒã ãã¬ã€ã¯éå±ã«ãªããŸãã
ã¯ã³ããŒã³ã³ãããŒã«ã®åäœ
㯠ããã£ã©ã¯ã¿ãŒãå®éã«çããŠç¬ç«ããŠæ©ããŠããããšããã¬ã€ã€ãŒã«ç¢ºä¿¡ãããçŸå®çãªãèªç¶ãªãåããäœæããããã«èšèšãããŠããŸãã
æ€çŽ¢ãšã©ã³ãã æ§
ã¹ãã¢ãªã³ã°åäœã䜿çšããŠããŸãããã¿ãŒã³ãå®è£
ããã«ã¯ãããã€ãã®æ¹æ³ããããŸãã æãç°¡åãªã®ã¯ãåè¿°ã®ã·ãŒã¯åäœã§ãã ãã£ã©ã¯ã¿ãŒãæ€çŽ¢ãããšã圌ã¯ãŽãŒã«ã«åãã£ãŠåããŸãã
ãã®ç®æšã®äœçœ®ãæ°ç§ããšã«å€åããå Žåããã£ã©ã¯ã¿ãŒã¯ãããéæããããšã¯ã§ããŸããïŒãããŠå¯èœã§ããã°ãç®æšã¯åã³ç§»åããŸãïŒã ãã¬ã€ãšãªã¢ã«ã¿ãŒã²ãããã©ã³ãã ã«é
眮ãããšããã£ã©ã¯ã¿ãŒã¯ç°å¢ãåãåããã¿ãŒã²ãããè¿œããããŸãã
Flashã®ã€ã³ã¿ã©ã¯ãã£ããã¢ã¯
ãã¡ãã§ãã
ããã¯ã次ã®ã³ãŒãã§å®è£
ã§ããŸãã
ããã¯ã·ã³ãã«ã§åªããã¢ãããŒãã§ãããæçµçµæã¯å®å
šã«ä¿¡ãããããšã¯éããŸããã ã¿ãŒã²ããã圌ã®åŸãã«é
眮ãããããããã£ã©ã¯ã¿ãŒãã«ãŒããå®å
šã«å€æŽããå ŽåããããŸãã ããããããã£ã©ã¯ã¿ãŒã®è¡åã¯
ãããŸããŸãããããŒãå¿ããŠããŸã£ãïŒããšããŠèªèãã
ãŸãã ãã§ã¯ãä»ãç§ã¯ãã®æ¹åã«è¡ããŸã ã
ã
ããŸãã
ã¯ã¬ã€ã°ã¬ã€ãã«ãºããããã®è¡åãçºæãããšãã«ãã¯ã³ããŒè¡åã®å¥ã®å®è£
ãææ¡ãããŸããã äž»ãªã¢ã€ãã¢ã¯ãå°ããªã©ã³ãã ãªãã»ãããäœæããåã²ãŒã ãã¬ãŒã ã§ãããããã£ã©ã¯ã¿ãŒã®çŸåšã®æ¹åã®ãã¯ãã«ã«é©çšããããšã§ãïŒãã®å Žåãé床ãäžããããïŒã é床ãã¯ãã«ã¯ãã£ã©ã¯ã¿ãŒã®åãã®æ¹åãšåãã®é床ã決å®ããããããã®ãã¯ãã«ãžã®åœ±é¿ã¯çŸåšã®ã«ãŒãã®å€æŽã«ã€ãªãããŸãã
åãã¬ãŒã ã§å°ããªãªãã»ããã䜿çšãããšããã£ã©ã¯ã¿ãŒã®ã«ãŒãã®çªç¶ã®å€æŽãåé¿ã§ããŸãã ããšãã°ããã£ã©ã¯ã¿ãŒãäžã«ç§»åããŠå³ã«æ²ãã£ãå Žåãã²ãŒã ã®æ¬¡ã®ãã¬ãŒã ã§ã¯ã圌ã¯ãŸã äžã«ç§»åããŠå³ã«æ²ãããŸãããè§åºŠã¯ãããã«ç°ãªããŸãã
ãã®ã¢ãããŒãã¯ãããŸããŸãªæ¹æ³ã§å®è£
ããããšãã§ããŸãã ãããã®1ã€ã¯ããã£ã©ã¯ã¿ãŒã®åã«åãé
眮ããããã䜿çšããŠäœçšãããã¹ãŠã®åãèšç®ããããšã§ãã
å€äœåã®éå§ç¹ã¯åã®äžå¿ã«ããããã®ååŸã«ãã£ãŠå¶éãããŸãã ãã£ã©ã¯ã¿ãŒããåãŸã§ã®ååŸãšè·é¢ã倧ããã»ã©ãã²ãŒã ã®åãã¬ãŒã ã§ãã¬ãŒã€ãŒãåããå¢ãã匷ããªããŸãã
ãã®å€äœåã¯ããã£ã©ã¯ã¿ãŒã®ã«ãŒãã«åœ±é¿ãäžããããã«äœ¿çšãããŸãã
æŸæµªã®
åãèšç®ããã®ã«äœ¿çšãããŸãã
åã®äœçœ®èšç®
ããŸããåãèšç®ããããã«å¿
èŠãªæåã®èŠçŽ ã¯ãåã®äžå¿ã®äœçœ®ã§ãã åã¯ãã£ã©ã¯ã¿ãŒã®åã«é
眮ããå¿
èŠããããããé床ãã¯ãã«ãã¬ã€ããšããŠäœ¿çšã§ããŸãã
circleCenter
ãã¯ãã«ã¯ãé床ãã¯ãã«ã®ã¯ããŒã³ïŒã³ããŒïŒã§ããã€ãŸããåãæ¹åãæããŸãã æ£èŠåãããã¹ã«ã©ãŒå€ïŒãã®å Žåã¯
CIRCLE_DISTANCE
ïŒãä¹ç®ããã次ã®ãã¯ãã«ãåŸãããŸãã
å€äœå
次ã®èŠçŽ ã¯å€äœåã§ãããããã¯å·Šå³ã«æ²ãã圹å²ãæãããŸãã ãã®åã¯åå·®ã®äœæã«äœ¿çšããããããã©ãã«ã§ãåããããšãã§ããŸãã y軞ã«æãããããã¯ãã«ã䜿çšããŠã¿ãŸãããïŒ
var displacement :Vector3D; displacement = new Vector3D(0, -1); displacement.scaleBy(CIRCLE_RADIUS);
ãã€ã¢ã¹åãäœæãããåã®ååŸã«ãã£ãŠã¹ã±ãŒãªã³ã°ãããŸãã äžèšã®ããã«ãååŸã倧ããã»ã©ãæŸæµªã®åã匷ããªããŸãã
wanderAngle
ã¯ãå€äœåã®ãåŸé
ãã®å€§ããã決å®ããã¹ã«ã©ãŒå€ã§ãã ããã䜿çšããåŸãã©ã³ãã ãªå€ãããã«è¿œå ãããã²ãŒã ã®æ¬¡ã®ãã¬ãŒã ã§ç°ãªãããã«ãªããŸãã ããã«ããã移åã«å¿
èŠãªã©ã³ãã æ§ãäœæãããŸãã
ãããç解ããããã«ãäžèšã§èšç®ãããå€äœåãåã®äžå¿ã«ãããšæ³åããŸãããã åã®ååŸã®å€ã«ãã£ãŠã¹ã±ãŒãªã³ã°ãããããã次ã®ããã«ãªããŸãã
ãã³ãïŒæ°åŠãã¯ãã«ã¯ç©ºéå
ã«äœçœ®ãæãããæ¹åãšå€§ããïŒé·ãïŒã®ã¿ãæã€ããšãå¿ããªãã§ãã ããã ãããã£ãŠããããã¯ã©ãã«ã§ãé
眮ã§ããŸãã
ããŸããå
åã®äžå¿ãšå€äœãã¯ãã«ãèšç®ããåŸãããããçµã¿åãããŠ
æŸæµªåãååŸ
ããå¿
èŠããããŸãã ãã®åã¯ã次ã®2ã€ã®ãã¯ãã«ãè¿œå ããŠèšç®ãããŸãã
var wanderForce :Vector3D; wanderForce = circleCenter.add(displacement);
èŠèŠçã«ã¯ããããã®åã次ã®ããã«è¡šãããšãã§ããŸãã
æŸæµªã®åã¯ããã£ã©ã¯ã¿ãŒããåã®ååšäžã®ç¹ã«çºãããã¯ãã«ãšããŠè¡šãããšãã§ããŸãã ãã®ãã€ã³ãã®äœçœ®ã«å¿ããŠãæŸæµªã®åããã£ã©ã¯ã¿ãŒãå·Šå³ã«åŒ·ããŸãã¯åŒ±ãæŒããŸãã
ããŸããåãé床ãã¯ãã«ãšäžèŽããã»ã©ããã£ã©ã¯ã¿ãŒã¯çŸåšã®ã«ãŒããå€æŽããªããªããŸãã æŸæµªã®åã¯ãã·ãŒã¯ãšéããåãšãŸã£ããåãããã«æ©èœããŸãããã£ã©ã¯ã¿ãŒãæ£ããæ¹åã«æŒãåºããŸãã
ã·ãŒã¯ãšéãã®åäœã«ãããåã®æ¹åãã¿ãŒã²ããã«åºã¥ããŠèšç®ãããããã«ãããŸããæ¹åã¯åã®ååšäžã®ã©ã³ãã ãªãã€ã³ãã«åºã¥ããŠèšç®ãããŸãã æçµçãªããŸããã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
private function wander() :Vector3D {
åã®è¿œå
ããŸãããåãèšç®ããåŸããã£ã©ã¯ã¿ãŒã®åãã«åœ±é¿ãäžããããšãã§ããããã«ããã£ã©ã¯ã¿ãŒã®é床ã«å ããªããã°ãªããŸããã ãã®åã®è¿œå ã¯ã以åãšåãæ¹æ³ã§å®è¡ãããŸãã
steering = wander() steering = truncate (steering, max_force) steering = steering / mass velocity = truncate (velocity + steering , max_speed) position = position + velocity
ããŸãããåã¯ãäžèšã®è¡åãšåãããã«ãã£ã©ã¯ã¿ãŒã®ã«ãŒãã«åœ±é¿ãäžããŸãã éãã¯ãã²ãŒã ã®åãã¬ãŒã ã§ãã£ã©ã¯ã¿ãŒãã©ã³ãã ãªæ¹åã«æŒãããšã§ãã
Flashã®ã€ã³ã¿ã©ã¯ãã£ããã¢ã¯
ãã¡ãã§ãã
ãããã«
ãµãã€ãã®æ¯ãèãã¯ãã©ã³ãã ãªåããå®è£
ããçŽ æŽãããæ¹æ³ã§ãã ãã£ã©ã¯ã¿ãŒã®åã«ããæ³åäžã®åã«ãã£ãŠå¶åŸ¡ãããå¿
èŠãªåãã®ãã¿ãŒã³ãäœæããããã«å€æŽã§ããŸãã
ããŒã4.远跡ãšåé¿
远跡ãšã¯äœã§ããïŒ
远跡ãšã¯ãç®æšã
ãã£ããããããšãã欲æ±ã«åŸãããã»ã¹ã§ãã ããã§ã®å
šäœã®éãã¯ãã£ãããšããèšèã§ããããšã«æ³šæããããšãéèŠã§ãã ãªããžã§ã¯ããåçŽã«ç®æšããã©ãå Žåãã¿ãŒã²ããã®åããç¹°ãè¿ãã ãã§ååãªã®ã§ãç®æšããã©ããŸãã
誰ãã远跡ããå Žåã远跡è
ã¯ã¿ãŒã²ããã远跡ããå¿
èŠããããŸãããã¿ãŒã²ãããè¿ãå°æ¥ã©ãã«ããããäºæž¬ããå¿
èŠããããŸãã 次ã®æ°ç§ã§ã¿ãŒã²ããã®äœçœ®ãäºæž¬ïŒãŸãã¯è©äŸ¡ïŒã§ããå Žåã¯ãçŸåšã®ãã¹ãå€æŽããŠäžèŠãªã«ãŒããåé¿ã§ããŸãã
æªæ¥ãäºæž¬ãã
ãã¥ãŒããªã¢ã«ã®æåã®éšåã§è¿°ã¹ãããã«ãåãã¯
ãªã€ã©ãŒæ³ã䜿çšã
ãŠèšç®ãããŸãïŒ
position = position + velocity
ãã®ããšããããã£ã©ã¯ã¿ãŒã®çŸåšã®äœçœ®ãšé床ãããã£ãŠããå Žåã
T
ã²ãŒã ã®æŽæ°ãéããŠèªåãã©ãã«ããã®ããäºæž¬ããããšãã§ããŸãã ãã£ã©ã¯ã¿ãŒãçŽç·çã«ç§»åããäºæž¬ãããäœçœ®ã3åã®æŽæ°ïŒ
T=3
ïŒåŸã«é
眮ããããšããŸãã ãããšããã£ã©ã¯ã¿ãŒã®å°æ¥ã®äœçœ®ã¯æ¬¡ã®ããã«ãªããŸãã
position = position + velocity * T
æ£ããäºæž¬ãè¡ãã«ã¯ã
T
æ£ããå€ãéžæããå¿
èŠããããŸã
T
å€ã倧ããããå Žåã远跡è
ã¯ãŽãŒã¹ããè¿œããããŸãã
T
ãŒãã«è¿ãããå Žåã远跡è
ã¯å®éã«ã¯è¿œè·¡ãããåã«ç®æšã远跡ããŸãïŒäºæž¬ãªãïŒã
äºæž¬ãã²ãŒã ã®åãã¬ãŒã ã«å¯ŸããŠèšç®ãããå Žåãç®æšãåžžã«æ¹åãå€ããŠããŠããããã¯æ©èœããŸãã
åæŽæ°ã¯ããã£ã©ã¯ã¿ãŒã®çŸåšã®é床ãã¯ãã«ã«åºã¥ããŠæ°ãããå°æ¥ã®äœçœ®ããçæããŸãïŒããã¯ç§»åã®æ¹åãå¶åŸ¡ããŸãïŒã
è¿œæ±ãã
远跡ã®åäœã¯ãSeekãšã»ãŒåãããã«æ©èœããŸããå¯äžã®éãã¯ã远跡è
ãç®æšãã®ãã®ã§ã¯ãªããè¿ãå°æ¥ã®ç®æšãè¿œæ±ããããšã§ããã²ãŒã ã®ãã¹ãŠã®ãã£ã©ã¯ã¿ãŒãã¯ã©ã¹ã«ãã£ãŠè¡šããããšãBoid
ãŸãã次ã«ã次ã®æ¬äŒŒã³ãŒãã§ã远跡åäœã®åºæ¬çãªèãæ¹ãå®è£
ããŸãã public function pursuit(t :Boid) :Vector3D { T :int = 3; futurePosition :Vector3D = t.position + t.velocity * T; return seek(futurePosition); }
远跡åãèšç®ããåŸããããŸã§ã®ãã¹ãŠã®å¶åŸ¡åãšåæ§ã«ãé床ãã¯ãã«ã«è¿œå ããå¿
èŠããããŸãã public function update() :void { steering = pursuit(target) steering = truncate (steering, max_force) steering = steering / mass velocity = truncate (velocity + steering , max_speed) position = position + velocity }
次ã®å³ã¯ããã®ããã»ã¹ã瀺ããŠããŸãã远跡è
ïŒä»¥äžã®ãã£ã©ã¯ã¿ãŒïŒã¯ããªã¬ã³ãžè²ã®æ²ç·ã§ç€ºãããçµè·¯ããã©ã£ãŠãã¿ãŒã²ããã®å°æ¥ã®äœçœ®ãæ¢ããŸããå®æããçµæã以äžã«ç€ºããŸããããã§ã¯ãè¡å远跡ã§äœ¿çšããT=30
ãŸããFlashã®ã€ã³ã¿ã©ã¯ãã£ããã¢ã¯ãã¡ãã§ãã
远跡粟床ã®æ¹å
å€ãT
äžå®ã®å Žåãåé¡ãçºçããŸããã¿ãŒã²ãããè¿ã¥ããšè¿œè·¡ã®ç²ŸåºŠãäœäžããŸããããã¯ãç®æšãè¿ãå Žåã远跡ã¯ã¿ãŒã²ããã®äºæž¬äœçœ®ïŒT
ãåæ¹ãã®ãã¬ãŒã äžïŒã«åŸãããã§ããå®éã®è¿«å®³ã§ã¯ã远跡è
ã¯ãã§ã«ç®æšã«ååã«è¿ã¥ããŠããããã¯ããã®äœçœ®ãäºæž¬ããã¹ãã§ã¯ãªããšèªèããŠããããããã®ãããªåäœã¯çºçããŸããããã®åé¡ãåé¿ãã远跡ã®ç²ŸåºŠã倧å¹
ã«é«ããããšãã§ããç°¡åãªããªãã¯ããããŸããèãæ¹ã¯éåžžã«åçŽã§ããå®æ°å€ã®ä»£ããã«ãT
åçã䜿çšããå¿
èŠããããŸãã T = distanceBetweenTargetAndPursuer / MAX_VELOCITY
æ°ããå€ã¯T
ã2人ã®ãã£ã©ã¯ã¿ãŒéã®è·é¢ãšãŽãŒã«ãå°éã§ããæ倧é床ã«åºã¥ããŠèšç®ãããŸããç°¡åã«èšãã°ãæ°ãããšT
ã¯ããã¿ãŒã²ãããçŸåšã®äœçœ®ãã远跡è
ã®äœçœ®ã«ç§»åããããã«å¿
èŠãªæŽæ°ã®æ°ããæå³ããŸããè·é¢ã倧ãããªããšãè·é¢ã¯å€§ãããªããŸãT
ãã€ãŸãã远跡è
ã¯ã¿ãŒã²ããã®ã¯ããåæ¹ã«äœçœ®ããåŸåããããŸããè·é¢ãçããªããšãè·é¢ã¯å°ãããªããŸãT
ãã€ãŸããã¿ãŒã²ããã«éåžžã«è¿ããã€ã³ãã«ãªããŸãããã®å®è£
ã®æ°ããã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã public function pursuit(t :Boid) :Vector3D { var distance :Vector3D = t.position - position; var T :int = distance.length / MAX_VELOCITY; futurePosition :Vector3D = t.position + t.velocity * T; return seek(futurePosition); }
远跡åäœã§ã¯dynamicã䜿çšããŸãT
ãFlashã®ã€ã³ã¿ã©ã¯ãã£ããã¢ã¯ãã¡ãã§ãã
éãã
Evadeã®åäœã¯ãPursuitã®åäœã®å察ã§ããã¿ãŒã²ããã®å°æ¥ã®äœçœ®ãæ¢ãã®ã§ã¯ãªããEvadeã¯åäœäžã«ãã®äœçœ®ããéããŸããåé¿ã³ãŒãã¯ã»ãŒåãã§ãæåŸã®è¡ã®ã¿ãå€æŽãããŸãã public function evade(t :Boid) :Vector3D { var distance :Vector3D = t.position - position; var updatesAhead :int = distance.length / MAX_VELOCITY; futurePosition :Vector3D = t.position + t.velocity * updatesAhead; return flee(futurePosition); }
Flashã®ã€ã³ã¿ã©ã¯ãã£ããã¢ã¯ãã¡ãã§ãã
ãããã«
ãã®éšåã§ã¯ããã³ã¿ãŒããéããããšããåç©ã®çŸ€ããªã©ãããŸããŸãªãã¿ãŒã³ãæš¡å£ããã®ã«æé©ãªè¿œè·¡ãšåé¿ã®åäœã«æ³šç®ããŸãããããŒã5.ã¢ãŒã·ã§ã³ãããŒãžã£ãŒ
ã¹ãã¢ãªã³ã°åäœã¯ããªã¢ã«ãªã¢ãŒã·ã§ã³ãã¿ãŒã³ãäœæããã®ã«æé©ã§ãããããããå¶åŸ¡ã䜿çšãããã³çµã¿åãããããšãã§ããã°ããã«è¯ãã§ãããããã®ããŒãã§ã¯ãåè¿°ã®ãã¹ãŠã®åäœã®ã¢ãŒã·ã§ã³ãããŒãžã£ãŒã®å®è£
ã«ã€ããŠèª¬æããæ€èšããŸãã
ã³ã³ãããŒã·ã§ã³ã¹ãã¢ãªã³ã°ãã©ãŒã¹
åè¿°ã®ããã«ãåã¹ãã¢ãªã³ã°åäœã¯ãé床ãã¯ãã«ã«è¿œå ãããæ£å³ã®åïŒãå¶åŸ¡åããšåŒã°ããïŒãäœæããŸãããã®åã®æ¹åãšå€§ããã¯ãã£ã©ã¯ã¿ãŒã«æ瀺ãäžãããã¿ãŒã³ïŒã·ãŒã¯ãéãããæŸæµªãªã©ïŒã«åŸã£ãŠãã£ã©ã¯ã¿ãŒã移åãããŸããäžè¬çã«ãèšç®ã¯æ¬¡ã®ããã«ãªããŸãã steering = seek();
å¶åŸ¡åã¯ãã¯ãã«ã§ãããããä»ã®ãã¯ãã«ïŒããã³é床ïŒã«è¿œå ã§ããŸããããããæ¬åœã®ãéæ³ãã¯ãããŸããŸãªå¶åŸ¡åãè¿œå ã§ããããšã§ããããã§ååã§ãïŒ steering = nothing();
å¶åŸ¡åãè¿œå ãããšãããããã¹ãŠã®åãè¡šããã¯ãã«ãåŸãããŸããäžèšã®ã³ãŒãã¹ããããã§ã¯ãçµæãšããŠçããå¶åŸ¡åã«ããããã£ã©ã¯ã¿ãŒã«äœãã匷å¶çã«æ€çŽ¢ãããä»ã®äœããåé¿ãããŸãã以äžã¯ãåäžã®å¶åŸ¡åãäœæããå¶åŸ¡åã®çµã¿åããã®äŸã§ãã
è€éãªãã¿ãŒã³ãç°¡åã«äœæã§ããŸã
å¶åŸ¡åãçµã¿åãããããšã«ãããéåžžã«è€éãªã¢ãŒã·ã§ã³ãã¿ãŒã³ãç°¡åã«äœæã§ããŸãããã£ã©ã¯ã¿ãŒãç¹å®ã®ãšãªã¢ãé¿ããªããäœããç®æããŠåªåãããã¯ãã«ãšåã®å©ããåããŠã³ãŒããæžãããšãã©ãã»ã©é£ãããæ³åã§ããŸããïŒè·é¢ãé¢ç©ãçµè·¯ãã°ã©ãããã®ä»ã®åæ§ã®éãèšç®ããå¿
èŠããããŸãããªããžã§ã¯ãã移åããå Žåãç°å¢ã¯åžžã«å€åããŠãããããããããã¹ãŠã®èšç®ãæ¯åç¹°ãè¿ãå¿
èŠããããŸããã¹ãã¢ãªã³ã°åäœã§ã¯ããã¹ãŠã®åã¯åçã§ããã²ãŒã ãæŽæ°ããããã³ã«èšç®ããå¿
èŠããããããç°å¢ã®å€åã«èªç¶ã«å¯Ÿå¿ããããšãç解ãããŠããŸãã
ã¢ãŒã·ã§ã³ãããŒãžã£ãŒ
è€æ°ã®ã¹ãã¢ãªã³ã°åäœãåæã«äœ¿çšããã«ã¯ãã¢ãŒã·ã§ã³ãããŒãžã£ãŒãäœæãããšäŸ¿å©ã§ããã¢ã€ãã¢ã¯ãæ¢åã®ãšã³ãã£ãã£ã«æ¥ç¶ã§ããããã©ãã¯ããã¯ã¹ããèšè¿°ããããšã§ããããã«ããããããã®åäœãå®è¡ã§ããŸãããããŒãžã£ãŒã«ã¯ãæ¥ç¶å
ã®ãšã³ãã£ãã£ïŒããã¹ããïŒãžã®ãªã³ã¯ããããŸãããããŒãžã£ãŒã¯ãã¹ãã«ãããªæ¹æ³ãäžé£ã®éä¿¡seek()
ãšãflee()
ããããã®ã¡ãœãããåŒã³åºããããã³ã«ããããŒãžã£ãŒã¯ãã®å
éšããããã£ãæŽæ°ããŠå¶åŸ¡åãã¯ãã«ãäœæããŸãããã¹ãŠã®åŒã³åºããåŠçããåŸããããŒãžã£ãŒã¯çµæã®å¶åŸ¡åããã¹ãé床ãã¯ãã«ã«è¿œå ããŸããããã«ãããã¢ã¯ãã£ããªåäœã«å¿ããŠãã¹ãé床ãã¯ãã«ã®å€§ãããšæ¹åãå€æŽãããŸãã以äžã®å³ã¯ãã¢ãŒããã¯ãã£ã瀺ããŠããŸãã
èŠçŽ ãèŠçŽãã
ãããŒãžã£ãŒã«ã¯äžé£ã®ã¡ãœãããããããããããåºæã®åäœãè¡šããŸããååäœãæ©èœããããã«ã¯ãããŸããŸãªå€éšæ
å ±ãéä¿¡ããå¿
èŠããããŸããããšãã°ãã·ãŒã¯ã®åäœã«ã¯ããã®å Žæã«åããããå¶åŸ¡åã®èšç®ã«äœ¿çšããã空éå
ã®ãã€ã³ããå¿
èŠã§ãã远跡ã«ã¯ãçŸåšã®äœçœ®ãé床ãªã©ãã¿ãŒã²ããããã®ããã€ãã®æ
å ±ãå¿
èŠã§ãã空éå
ã®ãã€ã³ãã¯ãPoint
ãŸãã¯ã®ã€ã³ã¹ã¿ã³ã¹ãšããŠè¡šçŸã§ããŸãVector2D
ãã©ã¡ãããã©ã®ãã¬ãŒã ã¯ãŒã¯ã§ãããªãæšæºçãªã¯ã©ã¹ã§ãããã ããPursuitã®åäœã®ç®æšã¯äœã§ãããŸããŸãããã¢ãŒã·ã§ã³ãããŒãžã£ãŒãååã«äžè¬åããã«ã¯ããã®ã¿ã€ãã«é¢ä¿ãªããããã€ãã®ã質åãã«çããããšãã§ããç®æšãååŸããå¿
èŠããããŸããããšãã°ãçŸåšã®é床ã¯ïŒããªããžã§ã¯ãæåããã°ã©ãã³ã°ã®ããã€ãã®ååã®ãããã§ãããã¯ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠå®çŸã§ããŸããã€ã³ã¿ãŒãã§ã€ã¹IBoid
ã¯ãã¢ãŒã·ã§ã³ãããŒãžã£ãå¶åŸ¡ã§ãããšã³ãã£ãã£ãèšè¿°ããã²ãŒã å
ã®ãã¹ãŠã®ã¯ã©ã¹ãå®è£
ããå Žåãã¹ãã¢ãªã³ã°åäœã䜿çšã§ãããšä»®å®ããŸããIBoid
ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯æ¬¡ã®æ§é ãæã¡ãŸãã public interface IBoid { function getVelocity() :Vector3D; function getMaxVelocity() :Number; function getPosition() :Vector3D; function getMass() :Number; }
ã¢ãŒã·ã§ã³ãããŒãžã£ãŒã®æ§é
ãããŒãžã£ãŒãäžè¬åããã圢åŒã§ã²ãŒã ã®ãã¹ãŠã®ãšã³ãã£ãã£ãšããåãã§ããããã«ãªã£ãã®ã§ããã®åºæ¬æ§é ãäœæã§ããŸãããããŒãžã£ãŒã¯ã2ã€ã®ããããã£ïŒçµæã®å¶åŸ¡åãšãã¹ããžã®ãªã³ã¯ïŒãšãååäœã«å¯Ÿå¿ãããããªãã¯ã¡ãœããã®ã»ããã§æ§æãããŸãã public class SteeringManager { public var steering :Vector3D; public var host :IBoid;
ãããŒãžã£ãŒã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããšããæ¥ç¶å
ã®ãã¹ããžã®ãªã³ã¯ãåãåãå¿
èŠããããŸãããããŒãžã£ã¯ãã¢ã¯ãã£ããªåäœã«å¿ããŠãã¹ãé床ãã¯ãã«ãå€æŽã§ããŸããååäœã¯ããããªãã¯ãšãã©ã€ããŒãã®2ã€ã®ã¡ãœããã§è¡šãããŸããããšãã°ãSeekã®åäœãèããŠã¿ãŸãããã public function seek(target :Vector3D, slowingRadius :Number = 20) :void {} private function doSeek(target :Vector3D, slowingRadius :Number = 0) :Vector3D {}
Public seek()
ã¯ããã®ç¹å®ã®åäœãé©çšãããããããŒãžã£ãŒã«æ瀺ããããã«åŒã³åºãããŸãããã®ã¡ãœããã«ã¯æ»ãå€ããªãããã®ãã©ã¡ãŒã¿ãŒã¯åäœèªäœïŒããšãã°ã空éå
ã®ãã€ã³ãïŒã«é¢é£ä»ããããŠããŸããprivateã¡ãœããã¯inside doSeek()
ã§åŒã³åºããããã®æ»ãå€ãã€ãŸã ãã®ç¹å®ã®åäœã®èšç®ãããå¶åŸ¡åã¯ãsteering
ãããŒãžã£ãŒã®ããããã£ã«è¿œå ãããŸãã次ã®ã³ãŒãã¯ãseekã®å®è£
ã瀺ããŠããŸãã
ä»ã®ãã¹ãŠã®åäœã¯ãéåžžã«é¡äŒŒããæ¹æ³ã§å®è£
ãããŸããããšãã°ãã¡ãœããpursuit()
ã¯æ¬¡ã®ããã«ãªããŸãã public function pursuit(target :IBoid) :void { steering.incrementBy(doPursuit(target)); } private function doPursuit(target :IBoid) :Vector3D { distance = target.getPosition().subtract(host.getPosition()); var updatesNeeded :Number = distance.length / host.getMaxVelocity(); var tv :Vector3D = target.getVelocity().clone(); tv.scaleBy(updatesNeeded); targetFuturePosition = target.getPosition().clone().add(tv); return doSeek(targetFuturePosition); }
ãã¥ãŒããªã¢ã«ã®åã®éšåã®ã³ãŒãã䜿çšã§ããŸããè¡ãããã®å¯äžã®ããš-ã®åœ¢ã§ãããé©å¿ãããbehavior()
ãšdoBehavior()
ãããã¯ãã©ãã£ãã¯ãããŒãžã£ã«è¿œå ããããšãã§ããŸãã
å¶åŸ¡åã®é©çšãšæŽæ°
åäœã®ã¡ãœãããåŒã³åºããããã³ã«ãããã«ãã£ãŠèšç®ãããçµæã®åãsteering
ãããŒãžã£ãŒã®ããããã£ã«è¿œå ãããŸãããããã£ãŠããã®ããããã£ã«ã¯ãã¹ãŠã®å¶åŸ¡åãèç©ãããŸãããã¹ãŠã®åäœãåŒã³åºããåŸããããŒãžã£ã¯ãçŸåšã®å¶åŸ¡åããã¹ãé床ã«é©çšããŠãã¢ã¯ãã£ããªåäœã«åŸã£ãŠç§»åããããã«ããå¿
èŠããããŸããããã¯ãupdate()
ã¢ãŒã·ã§ã³ãããŒãžã£ãŒã¡ãœããã§è¡ãããŸãã public function update():void { var velocity :Vector3D = host.getVelocity(); var position :Vector3D = host.getPosition(); truncate(steering, MAX_FORCE); steering.scaleBy(1 / host.getMass()); velocity.incrementBy(steering); truncate(velocity, host.getMaxVelocity()); position.incrementBy(velocity); }
äžèšã®ã¡ãœããã¯ããã¹ãŠã®åäœãåŒã³åºããåŸããã¹ãïŒãŸãã¯ã²ãŒã ã®ä»ã®ãšã³ãã£ãã£ïŒã«ãã£ãŠåŒã³åºãããå¿
èŠããããŸããããããªããšããã¹ãã¯ã¢ã¯ãã£ããªåäœã«äžèŽããããã«é床ãã¯ãã«ãå€æŽã§ããŸããã
ç³èŸŒã¿
Prey
ã¹ãã¢ãªã³ã°åäœã䜿çšããŠç§»åããå¿
èŠãããã¯ã©ã¹ããããããããŸã§ã®ãšãããå¶åŸ¡ã³ãŒããã¢ãŒã·ã§ã³ãããŒãžã£ãŒããããŸããããã®æ§é ã¯æ¬¡ã®ããã«ãªããŸãã public class Prey { public var position :Vector3D; public var velocity :Vector3D; public var mass :Number; public function Prey(posX :Number, posY :Number, totalMass :Number) { position = new Vector3D(posX, posY); velocity = new Vector3D(-1, -2); mass = totalMass; x = position.x; y = position.y; } public function update():void { velocity.normalize(); velocity.scaleBy(MAX_VELOCITY); velocity.scaleBy(1 / mass); truncate(velocity, MAX_VELOCITY); position = position.add(velocity); x = position.x; y = position.y; } }
ãã®æ§é ã«ãããã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ã¯ãªã€ã©ãŒã¡ãœããã䜿çšããŠç§»åã§ããŸãããããŒãžã£ãŒã䜿çšã§ããããã«ãã¯ã©ã¹ã«ã¯ã¢ãŒã·ã§ã³ãããŒãžã£ãŒãåç
§ããããããã£ãå¿
èŠã§ãããã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããå¿
èŠããããŸãIBoid
ã public class Prey implements IBoid { public var position :Vector3D; public var velocity :Vector3D; public var mass :Number; public var steering :SteeringManager; public function Prey(posX :Number, posY :Number, totalMass :Number) { position = new Vector3D(posX, posY); velocity = new Vector3D(-1, -2); mass = totalMass; steering = new SteeringManager(this); x = position.x; y = position.y; } public function update():void { velocity.normalize(); velocity.scaleBy(MAX_VELOCITY); velocity.scaleBy(1 / mass); truncate(velocity, MAX_VELOCITY); position = position.add(velocity); x = position.x; y = position.y; }
update()
ãããŒãžã£ãŒãæŽæ°ã§ããããã«ãããã«å¿ããŠã¡ãœãããå€æŽããå¿
èŠããããŸãã public function update():void {
update()
ãããŒãžã£ãŒãåŒã³åºãããåã«ãã¹ãŠã®ã¡ãœããã®åŒã³åºããå®è¡ãããããããã¹ãŠã®åäœãåæã«äœ¿çšã§ããŸããããã«ãããèç©ããããã¹ãŠã®å¶åŸ¡åããã¹ãé床ãã¯ãã«ã«é©çšãããŸãã以äžã®ã³ãŒãã¯update()
Prey ã¡ãœããã®ç°ãªãããŒãžã§ã³ã瀺ããŠããŸãããä»åã¯ãããäžã®ãã€ã³ããæ¢ããå¥ã®ãã£ã©ã¯ã¿ãŒãåé¿ïŒåé¿ïŒããŸãïŒãã¹ãŠåæã«ïŒã public function update():void { var destination :Vector3D = getDestination();
äŸ
以äžã®äŸã¯ãããã€ãã®åäœãçµã¿åãããè€éãªã¢ãŒã·ã§ã³ãã¿ãŒã³ã瀺ããŠããŸããã·ãŒã³ã«ã¯ããã³ã¿ãŒïŒãã³ã¿ãŒïŒãšãã¬ã€ïŒç ç²è
ïŒã®2çš®é¡ã®ãã£ã©ã¯ã¿ãŒããããŸãããã³ã¿ãŒã¯ã被害è
ãååã«è¿ã¥ããšè¢«å®³è
ãè¿œããããŸãããšãã«ã®ãŒãæ®ã£ãŠããéã圌ã¯åœŒå¥³ãè¿œããããŸãïŒã¹ã¿ããïŒããšãã«ã®ãŒãçµäºãããšã远跡ã¯åæ¢ãããã³ã¿ãŒã¯ãšãã«ã®ãŒã¬ãã«ãå埩ãããŸã§ããŸããå§ããŸããHunterã¯ã©ã¹ã®ã¡ãœããã¯update()
次ã®ãšããã§ãã public function update():void { if (resting && stamina++ >= MAX_STAMINA) { resting = false; } if (prey != null && !resting) { steering.pursuit(prey); stamina -= 2; if (stamina <= 0) { prey = null; resting = true; } } else { steering.wander(); prey = getClosestPrey(position); } steering.update(); x = position.x; y = position.y; }
ç ç²è
ã¯ç¡å¶éã«ããŸããããã³ã¿ãŒãè¿ã¥ãããããšã圌女ã¯åœŒãé¿ããŸããããŠã¹ã«ãŒãœã«ãè¿ãã«ãããè¿ãã«ãã³ã¿ãŒãããªãå Žåã被害è
ã¯ã«ãŒãœã«ã䜿çšããåŸåããããŸããPreyã¡ãœããã¯æ¬¡ã®ããã«ãªãupdate()
ãŸãã public function update():void { var distance :Number = Vector3D.distance(position, Game.mouse); hunter = getHunterWithinRange(position); if (hunter != null) { steering.evade(hunter); } if (distance <= 300 && hunter == null) { steering.seek(Game.mouse, 30); } else if(hunter == null){ steering.wander(); } steering.update(); x = position.x; y = position.y; }
ãããã«
ã¢ãŒã·ã§ã³ãããŒãžã£ã¯ãè€æ°ã®ã¹ãã¢ãªã³ã°åäœãåæã«ç®¡çããã®ã«éåžžã«åœ¹ç«ã¡ãŸãããã®ãããªåäœã®çµã¿åããã«ãããã²ãŒã ãšã³ãã£ãã£ã1ã€ã®ãªããžã§ã¯ããç®æããšåæã«å¥ã®ãªããžã§ã¯ããåé¿ã§ããéåžžã«è€éãªã¢ãŒã·ã§ã³ãã¿ãŒã³ãäœæã§ããŸãããã®éšåã«å®è£
ããããããŒãžã£ãŒã·ã¹ãã ãæ°ã«å
¥ã£ãŠãã²ãŒã ã§äœ¿çšããããšãé¡ã£ãŠããŸããèšäºã®ç¬¬2éšã¯ãã¡ãã§ãã