ç®æ¬¡
ããŒã2ïŒãšã³ãžã³ã³ã¢
- çµ±å
- ã¿ã€ã ã¹ã¿ã³ã
- ã¢ãžã¥ã©ãŒã¢ãŒããã¯ãã£
- æ¬äœ
- ãã©ãŒã
- å
- çŽ æ
- åºãäœçž
- éè€ããé£çµ¡å
ãã¢ã®ã¯ãªããã³ã°
- ã¬ã€ã€ãŒã·ã¹ãã
- å空éã®äº€ç¹ã確èªãã
ããŒã3ïŒæ©æŠãã·ãŒã³ãããã³é·ç§»è¡š
- æ©æŠ
- ã·ãŒã³
- è¡çªé·ç§»è¡š
ããŒã4ïŒæåæ§ãœãªãã
- æ°åŠå転
- ãªãªãšã³ããããã©ãŒã
- è¡çªèªè
- è¡çªè§£æ±º
ããŒã2ïŒãšã³ãžã³ã³ã¢
èšäºã®ãã®ããŒãã§ã¯ãåãã«ã¹ã®å解èœã«ä»ã®æ©èœãè¿œå ããŸãã ç¹ã«ãçµ±åãã¿ã€ã ã¹ã¿ã³ããã³ãŒãã§ã®ã¢ãžã¥ã©ãŒã¢ãŒããã¯ãã£ã®äœ¿çšãããã³åºããã§ãŒãºã§ã®è¡çªæ€åºãæ€èšããŸãã
ã¯ããã«
åã®æçš¿ã§ã
åãã«ã¹ã®
解決ã®ãããã¯ã調ã¹ãŸããã ãŸã èªãã§ããªãå Žåã¯æåã«èªãã§ãã ããïŒ
ãã®èšäºã§åãäžãããããã¯ãæãäžããŠã¿ãŸãããã ããããã¹ãŠã®ãããã¯ã¯ãå€ããå°ãªãã䟡å€ã®ããç©çãšã³ãžã³ã«å¿
èŠã§ãããããåã®æçš¿ã§ç¯ããåºç€ã®äžã«æ°ããæ©èœãäœæãããšããæ¥ãŸããã
- çµ±å
- ã¿ã€ã ã¹ã¿ã³ã
- ã¢ãžã¥ã©ãŒã¢ãŒããã¯ãã£
- æ¬äœ
- ãã©ãŒã
- å
- çŽ æ
- åºãäœçž
- éè€ããé£çµ¡å
ãã¢ã®ã¯ãªããã³ã°
- ã¬ã€ã€ãŒã·ã¹ãã
- å亀差ãã§ãã¯
çµ±å
çµ±åã¯éåžžã«ç°¡åã«å®è£
ã§ããã€ã³ã¿ãŒãããäžã®å埩統åã«é¢ããå€ãã®æ
å ±ããããŸãã ãã®ã»ã¯ã·ã§ã³ã§ã¯ãäž»ã«é©åãªçµ±åã®æ©èœã«æ³šç®ããèå³ãããã°ãã詳现ãªæ
å ±ãèŠã€ããããšãã§ããå Žæã説æããŸãã
ãŸããå éãšã¯äœããç解ããå¿
èŠããããŸãã
ãã¥ãŒãã³ã®ç¬¬äºæ³åã¯
次ã®ããã«è¿°ã¹ãŠããŸãã
æ¹çšåŒ \ïŒ1 ïŒF = m a
圌ã¯ãç©äœã«äœçšãããã¹ãŠã®åã®åèšã¯ããã®ç©äœã®è³ªé
m
ã«å é床
a
æãããã®ã«çãããšäž»åŒµããŠ
a
ãŸãã
m
ããã°ã©ã ãa-ã¡ãŒãã«/ sã
F
ãã¥ãŒãã³
m
瀺ãããŸãã
a
ãèšç®
a
ããã®æ¹çšåŒããããã«å€æãã以äžãååŸããŸãã
æ¹çšåŒ \ïŒ2 ïŒa = f r a c F m \ããããã£ãŠããŸããa = F â f r a c 1 m
次ã®ã¹ãããã§ã¯ããªããžã§ã¯ããããå Žæããå¥ã®å Žæã«ç§»åããããã«å éããŸãã ã²ãŒã ã¯ã¢ãã¡ãŒã·ã§ã³ã®é¯èŠãäœãåºãåå¥ã®ãã¬ãŒã ã«è¡šç€ºãããããããããã®åå¥ã®ã¹ãããã®åäœçœ®ã®äœçœ®ãèšç®ããå¿
èŠããããŸãã ãããã®æ¹çšåŒã®ãã詳现ãªåæã«ã€ããŠã¯ã
Erin Cattoã®GDC 2009ãš
ã®çµ±åãã¢ããã³
Hannã®ãªã€ã©ãŒã®ã·ã³ãã¬ã¯ãã£ãã¯æ³ã®è£è¶³ãåç
§ããŠãäœFPSç°å¢ã§ã®å®å®æ§ãé«ããŠãã ããã
ãªã€ã©ãŒã®æ¹æ³ã«ããæ瀺çãªçµ±åã次ã®ã³ãŒããã©ã°ã¡ã³ãã«ç€ºããŸããããã§ã
x
ã¯äœçœ®ã
v
ã¯é床ã§ãã äžã§èª¬æããããã«ã
1/m * F
ã¯å é床ã§ããããšã«æ³šæããŠãã ããã
ããã§ã®
dt
ã¯ãæéã®ãã«ã¿ïŒå¢å ïŒã瀺ããŸãã Îã¯ãã«ã¿èšå·ã§ãããæåéãã倧ããã®å€åããšèªããã
t
æžãããšãã§ããŸãã ãããã£ãŠã
dt
ãèŠããšããæéã®å€åããšèªãããšãã§ããŸãã
dv
ã¯ãé床ã®å€æŽãã§ãã
ãã®ã·ã¹ãã ã¯æ©èœããéåžžã¯åºçºç¹ãšããŠäœ¿çšãããŸãã ãã ããæ°å€ã®äžæ£ç¢ºãããããäžå¿
èŠãªãã©ãã«ãªãã«é€å»ã§ããŸãã 以äžã¯ãã·ã³ãã¬ã¯ãã£ãã¯ãªã€ã©ãŒæ³ãšåŒã°ããã¢ã«ãŽãªãºã ã§ãã
2è¡ã®ã³ãŒãã®é åºãå€æããã°ããã§ããããšã«æ³šæããŠãã ããã
äžèšã®Hannahã®èšäºãåç
§ããŠãã ããã
ãã®æçš¿ã§ã¯ãæ瀺çãªãªã€ã©ãŒæ³ã®æ°å€ã®äžæ£ç¢ºãã«ã€ããŠèª¬æããŸããããã³ãã¯RK4ã®æ€èšãéå§ããŠããããšã«æ³šæããŠãã ããã
ãããã®åçŽãªæ¹çšåŒã¯ãç·åœ¢ã®é床ãšå é床ã§ãã¹ãŠã®ãªããžã§ã¯ãã移åããã®ã«ååã§ãã
ã¿ã€ã ã¹ã¿ã³ã
ã²ãŒã ã¯åå¥ã®æéééã§è¡šç€ºãããããããããã®ã¹ãããéã§å¶åŸ¡ãããæ¹æ³ã§æéãæäœããæ¹æ³ãå¿
èŠã§ãã ç°ãªãã³ã³ãã¥ãŒã¿ãŒã§ç°ãªãé床ã§å®è¡ãããã²ãŒã ãèŠãããšããããŸããïŒ ããã¯ãã³ã³ãã¥ãŒã¿ãŒã®èœåã«å¿ããé床ã§å®è¡ãããã²ãŒã ã®äŸã§ãã
ç©çãšã³ãžã³ãäžå®ã®æéãçµéããåŸã«ã®ã¿å®è¡ãããããšãä¿èšŒããæ¹æ³ãå¿
èŠã§ãã ãããã£ãŠãèšç®ã§äœ¿çšããã
dt
ã¯åžžã«åãæ°ã®ãŸãŸã§ãã ã³ãŒãã®ã©ãã§ãæ£ç¢ºãªå®æ°å€
dt
ã䜿çšãããšãç©çãšã³ãžã³ã¯
決å®è«çãªãã®ã«å€ããããã®ããããã£ã¯
äžå®ã®ã¿ã€ã ã¹ã¿ã³ããšããŠç¥ãããŠ
ããŸãã ããã¯éåžžã«äŸ¿å©ãªããšã§ãã
決å®è«çç©çãšã³ãžã³ã¯ãåãå
¥åã§åžžã«åãããšãè¡ããšã³ãžã³ã§ãã ããã¯ãã²ãŒã ãã¬ã€ãç©çãšã³ãžã³ã®åäœã«æ確ã«çµã³ä»ããå¿
èŠãããå€ãã®çš®é¡ã®ã²ãŒã ã§å¿
èŠã§ãã ããã«ããšã³ãžã³ã®åäœã®ãšã©ãŒãæ€åºããããã«ã¯ããšã³ãžã³ãå€æŽããå¿
èŠããªãããããšã³ãžã³ããããã°ããå¿
èŠããããŸãã
å§ããããã«ãäžå®ã®ã¿ã€ã ã¹ã¿ã³ãã®åçŽãªããŒãžã§ã³ãèŠãŠã¿ãŸãããã 以äžã«äŸã瀺ããŸãã
const float fps = 100 const float dt = 1 / fps float accumulator = 0
ãã®ã³ãŒãã¯ãç©çãæŽæ°ããã®ã«ååãªæéãçµéãããŸã§åŸ
æ©ããã²ãŒã ãã¬ã³ããªã³ã°ããŸãã çµéæéãèšé²ããã
dt
ãµã€ãºã®é¢æ£æéãããã¯ãã¢ãã¥ã ã¬ãŒã¿ãŒããååŸãããç©çåŠã«ãã£ãŠåŠçãããŸãã ããã«ããããã¹ãŠã®æ¡ä»¶ã§åãå€ãç©çã«éä¿¡ãããç©çã«éä¿¡ãããå€ãå®éã®ç掻ã§çµéããå®éã®æéãæ£ç¢ºã«åæ ããããšãä¿èšŒãããŸãã
accumulator
ã
dt
ãããã¯ããå°ãããªããŸã§ã
dt
ãããã¯ã¯
accumulator
ããåé€ãããŸãã
ããã§ãããã€ãã®åé¡ãä¿®æ£ã§ããŸãã 1ã€ç®ã¯ãç©çåŠã®æŽæ°ã«å¿
èŠãªæéã«é¢é£ããŠããŸããç©çåŠã®æŽæ°ã«æéãããããããŠãã²ãŒã ãµã€ã¯ã«ããšã«
accumulator
ãå¢ãããšã©ããªããŸããã ããã¯ãæ»ã®ã¹ãã€ã©ã«ããšåŒã°ããŸãã ãã®åé¡ã解決ãããªãå Žåãç©çåŠã®èšç®ãååã«éããªããã°ããšã³ãžã³ã¯ããã«å®å
šã«åæ¢ããŸãã
ãã®åé¡ã解決ããããã«ã
accumulator
ã倧ãããªããããå Žåããšã³ãžã³ã¯ç©ççãªæŽæ°ãå°ãªãããå¿
èŠããããŸãã ãããè¡ãæãç°¡åãªæ¹æ³ã®1ã€ã¯ã
accumulator
ä»»æã®å€ãã倧ãããªããªãããã«
accumulator
ãå¶éãã
accumulator
ã§ãã
const float fps = 100 const float dt = 1 / fps float accumulator = 0
ããŠããã®ãµã€ã¯ã«ãå®è¡ããã²ãŒã ãäœããã®çç±ã§åçŽã§ãããšããã£ãå Žåãç©çåŠã¯æ»ã®ã¹ãã€ã©ã«ã«åŒãããããŸããã ã²ãŒã ã®å®è¡é床ã¯å°ãé
ããªããŸãã
次ã®åé¡ã¯ãæ»ã®ãããã«æ¯ã¹ãŠã¯ããã«å°ããã§ãã ãã®ã«ãŒãã¯ã
accumulator
ã
dt
æªæºã«ãªããŸã§ã
accumulator
ãã
dt
ãããã¯ãååŸããŸãã ããã¯çŽ æŽãããããšã§ããã
accumulator
ãŸã å°ãæéããããŸãã ãããåé¡ã§ãã
accumulator
åãã¬ãŒã ã
dt
ãããã¯ã®1/5ã®ãŸãŸã§ãããšããŸãã 6çªç®ã®ãã¬ãŒã ã§ã¯ã
accumulator
ã«ä»ã®ãã¹ãŠã®ãã¬ãŒã ã®ç©çæŽæ°ãå®è¡ããã®ã«ååãªæ®ãæéããããŸãã ããã«ããã1ç§ãããçŽ1ãã¬ãŒã çšåºŠã§ããããã«å€§ããªé¢æ£ãžã£ã³ããå®è¡ãããã²ãŒã å
ã§éåžžã«é¡èã«ãªããŸãã
ãã®åé¡ã解決ããã«ã¯ã
ç·åœ¢è£éã䜿çšããå¿
èŠããããŸãã æãã§ãããæããŠã¯ãããŸãã-å®è£
ã瀺ããŸãã å®è£
æ¹æ³ãç解ãããå Žåã¯ãã€ã³ã¿ãŒãããäžã«ç·åœ¢è£éå°çšã®å€ãã®ãªãœãŒã¹ããããŸãã
ãã®ã³ãŒãã䜿çšãããšã2ã€ã®ç°ãªãæéééã®éã«ããå¯èœæ§ã®ããå Žæãè£éïŒæŠç®ïŒã§ããŸãã ãã®äœçœ®ã䜿çšããŠã2ã€ã®ç©çæŽæ°éã®ã²ãŒã ã®ç¶æ
ãã¬ã³ããªã³ã°ã§ããŸãã
ç·åœ¢è£éã䜿çšãããšãç©çãšã³ãžã³ãšã¯ç°ãªãé床ã§ãšã³ãžã³ãã¬ã³ããªã³ã°ã§ããŸãã ããã«ãããç©çæŽæ°ãã
accumulator
ã®æ®ãããšã¬ã¬ã³ãã«åŠçã§ããŸãã
å®å
šãªäŸã次ã«ç€ºããŸãã
const float fps = 100 const float dt = 1 / fps float accumulator = 0
ãããã£ãŠãã²ãŒã å
ã®ãã¹ãŠã®ãªããžã§ã¯ãã¯ãç©çåŠã®åå¥ã®ã¿ã€ã ã¹ã¿ã³ãã®éã®ããŸããŸãªæç¹ã§æç»ã§ããŸãã ããã«ããããã¹ãŠã®ãšã©ãŒããšã¬ã¬ã³ãã«åŠçããæ®ãã®æéãèç©ã§ããŸãã å®éãã¬ã³ããªã³ã°ã¯èšç®ãããç©çåŠãããå°ãé
ããŠå®è¡ãããŸãããã²ãŒã ã芳å¯ãããšããã¹ãŠã®åããè£éã«ãã£ãŠèããæ»ããã«ãªããŸãã
ãã¬ã€ã€ãŒã¯ãèªåãèŠãŠãããã®ã ããç¥ã£ãŠããã®ã§ãã¬ã³ããªã³ã°ãåžžã«ç©çåŠã«é
ããŠãããšæšæž¬ããããšã¯ãããŸããããŸãããããã¬ãŒã ããå¥ã®ãã¬ãŒã ãžã®å®å
šã«æ»ãããªé·ç§»ãèŠãããã§ãã
äžæè°ã«æããããããŸããïŒãªãçŸåšã®äœçœ®ãã次ã®äœçœ®ãŸã§è£éããªãã®ã§ããïŒ ç§ã¯ãããããããšããŸããããããã«ã¯ããªããžã§ã¯ããå°æ¥ååšããå Žæããæšæž¬ãããã¬ã³ããªã³ã°ãå¿
èŠã§ããããšãããããŸããã ç©çãšã³ãžã³å
ã®ãªããžã§ã¯ãã¯ãããšãã°è¡çªäžã«çªç¶åããå€æŽããããšãå€ãããã®ãããªçªç¶ã®å€æŽãçºçãããšããªããžã§ã¯ãã¯å°æ¥ã®äžæ£ç¢ºãªè£éã«ããå¥ã®å Žæã«ãã¬ããŒããããŸãã
ã¢ãžã¥ã©ãŒã¢ãŒããã¯ãã£
åç©çãªããžã§ã¯ãã«ã¯ãããã€ãã®ããããã£ãå¿
èŠã§ãã ãã ããç¹å®ã®åãªããžã§ã¯ãã®ãã©ã¡ãŒã¿ãŒã¯ãããã«ç°ãªãå ŽåããããŸãã ãã®ãã¹ãŠã®ããŒã¿ãæŽçããã¹ããŒããªæ¹æ³ãå¿
èŠã§ãããã®ãããªé
眮ã§ã¯ãã§ããã ãå°ãªãã³ãŒããæžãããšããå§ãããŸãã ãã®å Žåãã¢ãžã¥ã©ãŒã¢ãŒããã¯ãã£ããããŸãã
ãã¢ãžã¥ãŒã«åŒã¢ãŒããã¯ãã£ããšãããã¬ãŒãºã¯åãã§è€éãããããã«èããããããããŸããããå®éã«ã¯éåžžã«è«ççã§éåžžã«åçŽã§ãã ããã«é¢é£ããŠããã¢ãžã¥ãŒã«ã¢ãŒããã¯ãã£ããšã¯ãç©çãªããžã§ã¯ãã䟿å©ãªæ¹æ³ã§æ¥ç¶ããã³åæã§ããããã«ãç©çãªããžã§ã¯ããåå¥ã®éšåã«åå²ã§ããããšãæå³ããŸãã
æ¬äœ
èäœã¯ãç¹å®ã®èäœã«é¢ãããã¹ãŠã®æ
å ±ãå«ããªããžã§ã¯ãã§ãã ãªããžã§ã¯ããæ§æãããã©ãŒã ïŒè€æ°å¯ïŒã質éãå€æïŒäœçœ®ãå転ïŒãé床ããã«ã¯ãªã©ã®ããŒã¿ãä¿åããŸãã ããã£ã¯æ¬¡ã®ããã«ãªããŸãã
struct body { Shape *shape; Transform tx; Material material; MassData mass_data; Vec2 velocity; Vec2 force; real gravityScale; };
ããã¯ã身äœã®æ§é ãäœæããããã®çŽ æŽãããåºçºç¹ã§ãã ããã§ã¯ãé©åãªã³ãŒãæ§é ãäœæããããã«è«ççãªæ±ºå®ãè¡ãããŸãã
ãŸãããã©ãŒã ããã€ã³ã¿ãŒã䜿çšããŠæ¬æã«é
眮ãããããšã¯æ³šç®ã«å€ããŸãã ããã«ãããäœãšãã®åœ¢ç¶ã®éã«åŒ±ãã€ãªãããäœæãããŸãã ããã£ã«ã¯ä»»æã®åœ¢ç¶ãå«ããããšãã§ããããã£ã®åœ¢ç¶ã¯ä»»æã«å€æŽã§ããŸãã å®éãããã£ã¯ããã€ãã®åœ¢åŒã§è¡šãããšãã§ãããã®ãããªããã£ã¯ããã€ãã®åœ¢åŒã§æ§æãããŠããããããè€åããšåŒã°ããŸãã ïŒãã®ãã¥ãŒããªã¢ã«ã§ã¯ãè€åããã£ã¯èæ
®ããŸãããïŒ
æ¬äœãšãã©ãŒã ã®ã€ã³ã¿ãŒãã§ãŒã¹ãshape
èªäœã¯ãå¢ç圢ç¶ã®èšç®ãå¯åºŠã«åºã¥ã質éã®èšç®ãããã³ã¬ã³ããªã³ã°ãæ
åœããŸãã
mass_data
ã¯ã質éé¢é£æ
å ±ãä¿åããããã®å°ããªããŒã¿æ§é ã§ãã
struct MassData { float mass; float inv_mass;
質éãšæ
£æ§ã«é¢é£ãããã¹ãŠã®å€ãåäžã®æ§é ã«ä¿åãããšéåžžã«äŸ¿å©ã§ãã 質éã¯æ±ºããŠæåã§èšå®ããªãã§ãã ãã-質éã¯åžžã«ãã©ãŒã èªäœããèšç®ããå¿
èŠããããŸãã 質éã¯ããçŽæã«åããå€ã¿ã€ãã§ãããæåã§èšå®ããã«ã¯åŸ®èª¿æŽã«æéãããããŸãã 次ã®ããã«å®çŸ©ãããŸãã
åŒ 3 ïŒè³ªé = å¯åºŠ * äœç©
ãã¶ã€ããŒããã©ãŒã ãããã倧ããŸãã¯ãéãã«ããå¿
èŠãããå Žåããã©ãŒã ã®å¯åºŠãå€æŽããå¿
èŠããããŸãã ãã®å¯åºŠã¯ãäœç©ã䜿çšããŠãã©ãŒã ã®è³ªéãèšç®ããããã«äœ¿çšã§ããŸãã ããã¯ãå¯åºŠãé³éã®åœ±é¿ãåãããã²ãŒã ã®å®è¡äžã«å€åããªãããïŒç¹å¥ãªã³ãŒããæäŸãããŠããªãéãïŒããã®ãããªç¶æ³ã§åäœããæ£ããæ¹æ³ã§ãã
AABBãåãªã©ã®åœ¢ç¶ã®äŸã¯
ããã¥ãŒããªã¢ã«ã®åã®éšåã§èŠã€ããããšãã§ããŸãã
çŽ æ
質éãšå¯åºŠã«é¢ãããã®ãã¹ãŠã®è©±ãããå¯åºŠå€ã¯ã©ãã«ä¿åãããŠããã®ããšããçåãçããŸãã
Material
æ§é ã«ãããŸãïŒ
struct Material { float density; float restitution; };
ãããªã¢ã«å€ãèšå®ããåŸããã®ãããªã¢ã«ãããã£ã·ã§ã€ãã«è»¢éããŠãããã£ã質éãèšç®ã§ããããã«ããããšãã§ããŸãã
æåŸã«èšåãã䟡å€ãããã®ã¯
gravity_scale
ã§ãã ããŸããŸãªãªããžã§ã¯ãã®éåã®ã¹ã±ãŒãªã³ã°ã¯ãã²ãŒã ãã¬ã€ã埮調æŽãããšãã«éåžžã«åœ¹ç«ã€ããšãå€ãããããã®ã¿ã¹ã¯å°çšã«ãã®å€ãåããã£ã«è¿œå ãã䟡å€ããããŸãã
æãäžè¬çãªãããªã¢ã«ã®äŸ¿å©ãªèšå®ã䜿çšããŠã
Material
ãªããžã§ã¯ãã®åæå€ãäœæã§ããŸãã
Rock Density : 0.6 Restitution : 0.1 Wood Density : 0.3 Restitution : 0.2 Metal Density : 1.2 Restitution : 0.05 BouncyBall Density : 0.3 Restitution : 0.8 SuperBall Density : 0.3 Restitution : 0.95 Pillow Density : 0.1 Restitution : 0.2 Static Density : 0.0 Restitution : 0.4
å
body
æ§é ã®å¥ã®åŽé¢ãè°è«ããå¿
èŠããããŸãã ããã¯
force
ãšåŒã°ããããŒã¿é
ç®ã§ãã åç©çã®æŽæ°ã®éå§æããã®å€ã¯ãŒãã§ãã ç©çãšã³ãžã³ã®ä»ã®å¹æïŒéåãªã©ïŒã¯ããã®
force
ããŒã¿èŠçŽ ã«
Vec2
ãã¯ãã«ãè¿œå ããŸãã çµ±åã®çŽåã«ããããã®åã¯ãã¹ãŠã身äœã®å é床ãèšç®ããããã«äœ¿çšãããçµ±å段éã§é©çšãããŸãã çµ±ååŸããã®
force
ããŒã¿é
ç®ã¯ãªã»ãããããŸãã
ããã«ãããä»»æã®æ°ã®åã§ãªããžã§ã¯ãã«äœçšã§ããæ°ããã¿ã€ãã®åããªããžã§ã¯ãã«é©çšããããã«ãæ°ããã³ãŒããèšè¿°ããå¿
èŠããªããªããŸãã
äŸãèŠãŠã¿ãŸãããã éåžžã«éããªããžã§ã¯ãã§ããå°ããªåããããšããŸãã ãã®å°ããªåã¯ã²ãŒã ã®äžçãé£ã³åããéåžžã«éããããä»ã®ãªããžã§ã¯ããåžžã«å°ããã€åŒãå¯ããŠããŸãã ããã瀺ãããã®ç²ãæ¬äŒŒã³ãŒãã次ã«ç€ºããŸãã
HeavyObject object for body in game do if(object.CloseEnoughTo( body ) object.ApplyForcePullOn( body )
ApplyForcePullOn()
é¢æ°ã¯ã
body
ãååã«è¿ãå Žåã«ã®ã¿ã
body
ã
HeavyObject
åŒã£åŒµãå°ããªåãæããŸãã
2ã€ã®ãªããžã§ã¯ãããããããéãéãã倧ããªãªããžã§ã¯ãã«åŒãä»ããããŸããã åŒåã¯ã倧ããªé·æ¹åœ¢ãŸã§ã®è·é¢ã«äŸåããŸãã身äœã®
force
ã©ãã ãã®åãããããã¯é¢ä¿ãããŸããããªããªãããããã¯ãã®èº«äœã®åäžã®å
±éãã¯ãã«ã«åèšãããããã§ãã ããã¯ã1ã€ã®èº«äœã«äœçšãã2ã€ã®åãæœåšçã«çžäºã«ãã©ã³ã¹ãåãããšãã§ããããšãæå³ããŸãã
åºãäœçž
ã·ãªãŒãºã®ååã®èšäºã§ã¯ãè¡çªèªèæé ã玹ä»ããŸããã ãããã®æé ã¯ãå®éã«ã¯ãççžããšåŒã°ãããã®ãšã¯ç¡é¢ä¿ã§ãã åºããã§ãŒãºãšçããã§ãŒãºã®éãã¯ãGoogleã§ç°¡åã«èŠã€ããããšãã§ããŸãã
ïŒèŠããã«ãè¡çªã®
å¯èœæ§ããããªããžã§ã¯ãã®ãã¢ã決å®ããããã«ãå¹
åºãè¡çªèªèãã§ãŒãºã䜿çšãã次ã«ãè¡çªãããã©ããã確èªããããã«çãè¡çªèªèãã§ãŒãºã䜿çšããŸããïŒ
æéã®è€éããæã€ã¢ã«ãŽãªãºã ã®ãã¢ãèšç®ããå¹
åºããã§ãŒãºãå®è£
ããæ¹æ³ã説æããã³ãŒãäŸã瀺ããã
O ïŒn 2 ïŒ ã
O ïŒn 2 ïŒ æœåšçãªè¡çªã®åãã¢ã®ãã§ãã¯ã«è²»ããããæéã¯ããªããžã§ã¯ãã®æ°ã®2ä¹ã«äŸåããããšãæå³ããŸãã
ãOãbigãšãã
è¡šèšã䜿çšããŸãã
ãªããžã§ã¯ãã®ãã¢ãæ±ããããåæ§ã®æ§é ãäœæãããšäŸ¿å©ã§ãã
struct Pair { body *A; body *B; };
åºããã§ãŒãºã§ã¯ãèµ·ããããè¡çªã®ã°ã«ãŒããçµã¿ç«ãŠããããããã¹ãŠ
Pair
æ§é ã«æ ŒçŽããŸãã ãã®åŸããããã®ãã¢ããšã³ãžã³ã®å¥ã®éšåïŒçäœçžïŒã«è»¢éããŠãåŸç¶ã®è§£æ±ºçãå®è¡ã§ããŸãã
å¹
åºããã§ãŒãºã®äŸïŒ
äžèšã®ã³ãŒãã¯éåžžã«åçŽã§ãããã¹ãŠã®ããã£ãä»ã®ãã¹ãŠã®ããã£ãšãã§ãã¯ããããèªäœãšã®è¡çªã®ãã§ãã¯ãã¹ãããããŸãã
éè€ã®ã¯ãªããã³ã°
æåŸã®ã»ã¯ã·ã§ã³ã«ã¯1ã€ã®åé¡ããããŸããå€ãã®éè€ãã¢ãè¿ãããŸãã ãããã®éè€ã¯çµæããåé€ããå¿
èŠããããŸãã 䞊ã¹æ¿ãã©ã€ãã©ãªãæå
ã«ãªãå Žåã¯ã䞊ã¹æ¿ãã¢ã«ãŽãªãºã ã«ç²ŸéããŠããå¿
èŠããããŸãã C ++ã§èšè¿°ããŠããå Žåã¯ã幞éã§ãã
ç¹å®ã®é åºã§ãã¹ãŠã®ãã¢ã䞊ã¹æ¿ããåŸã
pairs
ã³ã³ãããŒå
ã®ãã¹ãŠã®ãã¢ãè¿åã§éè€ããŠãããšæ³å®ã§ããŸãã ãã¹ãŠã®äžæã®ãã¢ãæ°ãã
uniquePairs
ã³ã³ãããŒã«é
眮ããŸããããã¯ãéè€ãåãåãäœæ¥ã§ãã
æåŸã«èšåãã䟡å€ãããã®ã¯ã
SortPairs()
è¿°èªã§ãã ãã®é¢æ°
SortPairs()
ãœãŒãã«äœ¿çšãããŸãã 次ã®ããã«ãªããŸãã
bool SortPairs( Pair lhs, Pair rhs ) { if(lhs.A < rhs.A) return true; if(lhs.A == rhs.A) return lhs.B < rhs.B; return false; }
lhs
ããã³
rhs
ã¡ã³ããŒã¯ããå·ŠåŽãïŒå·ŠåŽïŒããã³ãå³åŽãïŒå³åŽïŒãšããŠåŸ©å·åã§ããŸãã ãããã®ã¡ã³ããŒã¯éåžžãèŠçŽ ãæ¹çšåŒãŸãã¯ã¢ã«ãŽãªãºã ã®å·Šå³ã®éšåãšè«ççã«èŠãªãããšãã§ããé¢æ°ã®ãã©ã¡ãŒã¿ãŒãæäœããããã«äœ¿çšãããŸãã
ã¬ã€ã€ãŒã·ã¹ãã
ç°ãªããªããžã§ã¯ããäºãã«è¡çªããªãããã«ã
ã¬ã€ã€ãŒã·ã¹ãã ãå¿
èŠã§ãã ç¹å®ã®ãªããžã§ã¯ãããé£ãã§ãã匟䞞ãä»ã®ç¹å®ã®ãªããžã§ã¯ãã«åœ±é¿ãäžããªãããã«ããå¿
èŠããããŸãã ããšãã°ãåãããŒã ã®ããµã€ã«ãæã€ãã¬ã€ã€ãŒã¯æµã«ãã¡ãŒãžãäžããã¹ãã§ããããäºãã«ãã¡ãŒãžãäžããã¹ãã§ã¯ãããŸããã
ã¬ã€ã€ãŒã·ã¹ãã ã®èª¬æïŒäžéšã®ãªããžã§ã¯ãã¯äºãã«è¡çªããŸãããä»ã®ãªããžã§ã¯ãã¯è¡çªããŸãããã¬ã€ã€ãŒã·ã¹ãã ã¯
ããããã¹ã¯ã䜿çšããŠæãããå®è£
ãã
ãŸã ã ãšã³ãžã³ã§ã®ããããã¹ã¯ã®äœ¿çšæ¹æ³ã«ã€ããŠã¯ã
ããã°ã©ãåãããããã¹ã¯ã®ç°¡åãªçŽ¹ä» ãWikipediaããŒãžãããã³åèã®ããã«
Box2Dããã¥ã¢ã«ã®ãã£ã«ã¿ãªã³ã°ã»ã¯ã·ã§ã³ãåç
§ããŠãã ããã
å±€ã·ã¹ãã ã¯ãå¹
åºããã§ãŒãºã§å®è£
ãããŸãã ããã§ã¯ãæ¢æã®åºããã§ãŒãºã®äŸãæ¿å
¥ããŸãã
ã¬ã€ã€ãŒã·ã¹ãã ã¯éåžžã«å¹ççã§éåžžã«ã·ã³ãã«ã§ãã
å空éã®äº€å·®ç¹
å空éã¯ã2Dã§ã¯çŽç·ã®çåŽãšèŠãªãããšãã§ããŸãããã€ã³ããçŽç·ã®çåŽã«ãããå察åŽã«ããããå€æããããšã¯ããªãäžè¬çãªã¿ã¹ã¯ã§ãããç¬èªã®ç©çãšã³ãžã³ãå®è£
ãããšãã¯ããããããç解ããå¿
èŠããããŸããç§ã«ã¯ããã®ãããã¯ãã€ã³ã¿ãŒãããäžã®ã©ãã«ã詳现ã«é瀺ãããŠããªãã®ã¯éåžžã«æªãããšã§ãããç§ãã¡ã¯ãããä¿®æ£ããŸãïŒ2Dã®ç·ã®äžè¬çãªæ¹çšåŒã¯æ¬¡ã®ãšããã§ããã§ãå°åºãšäžã®n E N ãšE4 ïŒB U ãšIP ã®påã®M ãšããŠïŒX + B Y + C = 0:[ab]
ãã®ååã«ãããããããæ³ç·ãã¯ãã«ã¯å¿
ãããæ£èŠåããããšã¯éããªãããšã«æ³šæããŠãã ããïŒã€ãŸããå¿
ãããé·ãã1ã§ãããšã¯éããŸããïŒããã€ã³ããã©ã€ã³ã®ç¹å®ã®åŽã«ãããã©ãããå€æããã«ã¯ãå€æ°x
ãšy
æ¹çšåŒã®ãã€ã³ãã眮ãæããŠãçµæã®ç¬Šå·ã確èªããã ãã§ããçµæã0ã®å Žåããã€ã³ãã¯ç·äžã«ãããæ£/è² ã®å€ã¯ç·ã®ç°ãªãåŽãæå³ããŸãããããŠããã ãã§ãïŒãããç¥ã£ãŠããã®ã¯ããã€ã³ãããã©ã€ã³ãŸã§ã以åã®ãã§ãã¯ã®çµæã§ããæ³ç·ãã¯ãã«ãæ£èŠåãããŠããªãå Žåãçµæã¯æ³ç·ãã¯ãã«ã®å€§ããã§ã¹ã±ãŒãªã³ã°ãããŸãã
ãããã«
ãã®æç¹ã§ãéåžžã«åçŽã§ã¯ãããŸãããå®å
šãªç©çãšã³ãžã³ããŒãããäœæã§ããŸãã次ã®ããŒãã§ã¯ãããè€éãªãããã¯ãæ±ããŸãïŒæ©æŠïŒæ¹åãããã³AABBåçããªãŒãããŒã3ïŒæ©æŠãã·ãŒã³ãããã³é·ç§»è¡š
èšäºã®ãã®éšåã§ã¯ã次ã®ãããã¯ãæ€èšããŸãã- æ©æŠ
- ã·ãŒã³
- è¡çªé·ç§»è¡š
ãããªãã¢
ãã®ããŒãã§åãçµãå
容ã®ç°¡åãªãã¢ã次ã«ç€ºããŸãã
æ©æŠ
æ©æŠã¯è¡çªè§£æ±ºã·ã¹ãã ã®äžéšã§ããæ©æŠã¯ããªããžã§ã¯ãã®åããšã¯å察ã®æ¹åã«ãªããžã§ã¯ãã«é©çšãããåã«åžžã«é©çšãããŸããå®éã«ã¯ãæ©æŠã¯ç°ãªãç©è³ªéã®éåžžã«è€éãªçžäºäœçšã§ããããããã¢ãã«åããããã«æ·±å»ãªä»®å®ãšè¿äŒŒãè¡ãããŸãããããã®ä»®å®ã¯æ°åŠã«é¢é£ããŠãããéåžžãã»ãŒæ¬¡ã®ããã«å®åŒåãããŸãïŒãæ©æŠã¯ã»ãŒ1ã€ã®ãã¯ãã«ãšããŠè¡šãããšãã§ããŸããèšäºã®æåã®éšåã®ãããªãã¢ãã芧ãã ããã身äœéã®çžäºäœçšã¯éåžžã«èå³æ·±ããã®ã§ãããè¡çªæã®åçºã¯çŸå®çã«èŠããŸãããã ãããªããžã§ã¯ããåºå®ãã©ãããã©ãŒã ã«çå°ãããšããããã¯ãã¹ãŠåçºããç»é¢ã®ç«¯ããæ»ãèœã¡ãããã«èŠããŸããããã¯ãæ©æŠã®ã·ãã¥ã¬ãŒã·ã§ã³ããªãããã§ããåã³åã®è¡åïŒ
ãããããã¥ãŒããªã¢ã«ã®æåã®éšåã§èŠããŠããããã«ãè¡çªã«ããã2ã€ã®ãªããžã§ã¯ãã®è²«éãåé¢ããã«j
ã¯ãåã®éåéã®å€§ãããè¡šãå€ãå¿
èŠã§ãããã®å€ã¯ãè¡çªã®æ³ç·ã«æ²¿ã£ãŠé床ãå€æŽããããã«äœ¿çšããããããjnormal
ãŸãã¯ãšããŠæå®ã§ããŸãjN
ãæ©æŠåå¿ãè¿œå ããã«ã¯ãjtangent
ãŸãã¯ãšããŠç€ºãããå¥ã®éãèšç®ããå¿
èŠããããŸãjT
ãæ©æŠã¯åã®è¡æãšããŠã¢ãã«åã§ããŸãããã®å€ã¯ãè² ã®æ¥ç·è¡çªãã¯ãã«ã«æ²¿ã£ãŠãã€ãŸãæ©æŠãã¯ãã«ã«æ²¿ã£ãŠãªããžã§ã¯ãã®é床ãå€æŽããŸãã 2次å
ã§ã¯ãæ©æŠãã¯ãã«ã®èšç®ã¯è§£æ±ºå¯èœãªã¿ã¹ã¯ã§ããã3Dã§ã¯ã¯ããã«è€éã«ãªããŸããæ©æŠã¯éåžžã«åçŽã§ãããåã®æ¹çšåŒãåã³äœ¿çšã§ããŸããj
ãã¹ãŠã®æ³ç·n
ãæ¥ç·ãã¯ãã«ã«çœ®ãæããŸãt
ãã§ãå°åºãšäžã®n E N ãšE1 ïŒJ = - ïŒ1ã€ã®+ E ïŒïŒV B - V AïŒâ
N ïŒ1m a s s A +1M A S S B
眮ãæãn
ã«t
ïŒã§ãå°åºãšäžã®n E N ãšE2 ïŒj=â(1+e)((VBâVA)â
t)1massA+1massB
ãã®æ¹çšåŒã§t
ã¯1ã€ã®åºçŸã®ã¿ã眮æãããŸããn
ãå転ãè¿œå ããåŸãæ¹çšåŒ2ã®ååå
ã®åºçŸãé€ããŠãããã«ããã€ãã®åºçŸã眮æããå¿
èŠããããŸãt
ãæ¥ç·ãã¯ãã«ã¯ãè¡çªã®æ³ç·ã«åçŽãªãã¯ãã«ã§ãããæ³ç·ã«ããè¿ãæ¹åã«åããããŸããããã¯æ··ä¹±ãæãå¯èœæ§ããããŸã-å¿é
ããªãã§ãã ãããå³é¢ããããŸãïŒæ¬¡ã®å³ã¯ãæ¥ç·ãã¯ãã«ãæ³ç·ã«åçŽã§ããããšã瀺ããŠããŸããæ¥ç·ãã¯ãã«ã¯ãå·ŠãŸãã¯å³ã«åããããšãã§ããŸããå·Šã«ããå Žåãçžå¯Ÿé床ãããããã«ãé¢ããŠããŸãããã ããããã¯æ³ç·ã«åçŽã§ãçžå¯Ÿé床ã«ãè¿ããæ¹åãšããŠå®çŸ©ãããŸããåºäœã®è¡çªã®æéæ å
ã®ããŸããŸãªã¿ã€ãã®ãã¯ãã«ãäžã§ç°¡åã«èª¬æããããã«ãæ©æŠã¯æ¥ç·ãã¯ãã«ãšå察æ¹åã«åãããããã¯ãã«ã«ãªããŸããããã¯ãæ³ç·ãã¯ãã«ãè¡çªãèªèãããããæ©æŠãé©çšããæ¹åãçŽæ¥èšç®ã§ããããšãæå³ããŸãããããããã£ãŠããå Žåãæ¥ç·ãã¯ãã«ã¯æ¬¡ã®ããã«ãªããŸãïŒn
è¡çªã®æ³ç·ã¯ã©ãã§ããïŒãV R = V B - V AT = V R - ïŒV R â
N ïŒ* nå
æ©æŠã®éã決å®ããã«ã¯jt
ãäžèšã®åŒããå€ãçŽæ¥èšç®ããã ãã§ããããã«ãã®å€ãèšç®ããåŸã«ä»ã®ããªãã¯ãæ€èšãããããè¡çªã®è§£æ±ºã«å¿
èŠãªã®ã¯ããã ãã§ã¯ãããŸããã
äžèšã®ã³ãŒãã¯åŒ2ã«çŽæ¥å¯Ÿå¿ããŸããããã§ããæ©æŠãã¯ãã«ãæ¥ç·ãã¯ãã«ãšå察æ¹åãæããŠããããšãç解ããããšãéèŠã§ãããããã£ãŠãæ¥ç·ãã¯ãã«ã«æ²¿ã£ãçžå¯Ÿé床ãèšç®ããããã«ãçžå¯Ÿé床ã®ã¹ã«ã©ãŒç©ãæ¥ç·æ¹åã§ããå Žåããã€ãã¹èšå·ãè¿œå ããå¿
èŠããããŸãããã€ãã¹èšå·ã¯æ¥ç·é床ãå転ãããæ©æŠãè¿äŒŒãããã¹ãæ¹åãçªç¶ç€ºããŸããã¢ã¢ã³ãã³-ã¯ãŒãã³ã®æ³å
ã¢ã¢ã³ãã³-ã¯ãŒãã³ã®æ³åã¯ãã»ãšãã©ã®ããã°ã©ããŒãå°é£ãæããæ©æŠã·ãã¥ã¬ãŒã·ã§ã³ã®äžéšã§ããç§èªèº«ã¯ãé©åãªã¢ããªã³ã°ææ³ãèŠã€ããã®ã«ååãªæéããããŠç 究ããªããã°ãªããŸããã§ãããç§Theã¯ãã¢ã¢ã³ãã³ã»ã¯ãŒãã³ã®æ³åãäžå¹³çã§ããããšã§ããããã¯èªã¿ãŸãïŒã§ãå°åºãšäžã®n E N ãšE3 ïŒF F < = M F N
èšãæããã°ãæ©æŠåã¯åžžã«æ³ç·åã«äžå®ã®å®æ°ãæãÎŒ
ãå€ä»¥äžã§ãïŒãã®å€ã¯ãªããžã§ã¯ãã®ææã«ãã£ãŠç°ãªããŸãïŒãéåžžã®åŒ·ãã¯ãåã«å€ãå€j
ã«è¡çªã®æ³ç·ãæãããã®ã§ãããã®ãããèšç®ãããjt
ïŒæ©æŠåãè¡šãïŒãÎŒ
äžåºŠã«æ³ç·åãããå°ããå Žåã¯ãå€jt
ãæ©æŠãšããŠäœ¿çšã§ããŸããããã§ãªãå Žåã¯ã代ããã«æ³ç·åã«ãæããå€ã䜿çšããå¿
èŠããããŸãÎŒ
ããã®ãifãæ¡ä»¶ã¯ãæ©æŠãããæ倧å€ã«å¶éããŸããæ倧å€ã¯æ³ç·åã®æéÎŒ
ã§ããã¢ã¢ã³ãã³ã»ã¯ãŒãã³ã®æ³åã®èŠç¹ã¯ããã®å¶éæé ãå®è¡ããããšã§ãããã®ãããªå¶éã¯ãåã®ã€ã³ãã«ã¹ã«åºã¥ãã解å床ã®æ©æŠã·ãã¥ã¬ãŒã·ã§ã³ã®æãé£ããéšåã§ããããšãå€æããŸãã-ããã«é¢ããããã¥ã¡ã³ãã¯ã©ãã«ããããŸããããä»ããä¿®æ£ããŸãïŒç§ããã®ãããã¯ã§èŠã€ããèšäºã®å€§éšåã§ã¯ãæ©æŠã¯å®å
šã«ç Žæ£ããããç°¡åã«èšåãããå¶éæé ã¯æ£ããå®è£
ãããŠããŸããïŒãŸãã¯ãŸã£ããååšããŸããïŒããã®éšåãé©åã«ç解ããããšãéåžžã«éèŠã§ããããšãç解ããŠãã ãããäœãã説æããåã«ãå¶éãå®å
šã«å®è£
ããŸãããã以äžã®ã³ãŒããããã¯ã¯ãæ¢è£œã®å¶éæé ãšæ©æŠåã®ã€ã³ãã«ã¹ã®é©çšãå«ãåã®äŸã§ãã
ãã®åŒã䜿çšããŠãåããã£ã«æå®ãããä¿æ°ã§2ã€ã®ããã£éã®æ©æŠä¿æ°ã決å®ããããšã«ããŸãããã§ãå°åºãšäžã®n E N ãšE4 ïŒF r i c t i o n = âF r i c t i o n 2 A + F r i c t i o n 2 B
å®éãç§ã¯ãã§ã«èª°ããèªåã®ç©çãšã³ãžã³ã§ãããã©ã®ããã«äœ¿çšããŠããããèŠãŠããŸããããçµæãæ°ã«å
¥ããŸãããå¹³æ¹æ ¹ãåãé€ãå¿
èŠãããå Žåã2ã€ã®å€ã®å¹³åã¯å®ç§ã§ããå®éãæ©æŠä¿æ°ã®ä»»æã®åœ¢åŒã®éžæãæ©èœããŸãããç§ã¯ããã奜ãã ãã§ããå¥ã®ãªãã·ã§ã³ïŒæ€çŽ¢ããŒãã«ã䜿çšã§ããŸãããã®å Žåãåããã£ã®ã¿ã€ãã¯2次å
ããŒãã«ã®ã€ã³ããã¯ã¹ã§ããæ¯èŒjt
ã§ã¯çµ¶å¯Ÿå€ã䜿çšããããšãéèŠã§ããçè«çã«ã¯ãæ¯èŒã«ãããçã®ãå€ãäœããã®ãããå€ã«å¶éãããããã§ããããã«j
åžžã«æ£ã§ãããåæ©æŠã®å Žåã®æ©æŠã®çã®ãã¯ãã«ãè¡šãããã«ãéã«ãããªããã°ãªããŸãããéçããã³åçæ©æŠ
åã®ã³ãŒãã¹ããããã§ã¯ãéçæ©æŠãšåçæ©æŠã説æãªãã§å°å
¥ãããŸããããããã®2ã€ã®ã¿ã€ãã®å€ã®éããšå¿
èŠæ§ã®éãã説æããããã«ãã»ã¯ã·ã§ã³å
šäœãæ§ããŸããæ©æŠã®éãèå³æ·±ãããšãèµ·ãããŸãããªããžã§ã¯ããéæ¢ç¶æ
ããåãã«ç§»åããã«ã¯ãã掻æ§åãšãã«ã®ãŒããå¿
èŠã§ããå®éã®ç掻ã§2ã€ã®ãªããžã§ã¯ããéãªãåã£ãŠããå Žåã1ã€ãæŒããŠåããã«ã¯ããªãã®ãšãã«ã®ãŒãå¿
èŠã§ãããã ãããªããžã§ã¯ããç°ãªãæ¹æ³ã§ã¹ã©ã€ããããå Žåãå€ãã®å Žåããã®åŸã®ã°ã©ã€ããç¶æããããã«å¿
èŠãªãšãã«ã®ãŒã¯å°ãªããªããŸãããããã¯ãé¡åŸ®é¡ã¬ãã«ã§ã®æ©æŠã®åçã«ãããã®ã§ããå¥ã®å³ãããã§åœ¹ç«ã¡ãŸããæ©æŠäžã®æŽ»æ§åãšãã«ã®ãŒã®å¿
èŠæ§ã®åŸ®èŠççç±ãã芧ã®ãšãããå®éãæ©æŠãåŒãèµ·ããäž»ãªé害ã¯ããµãŒãã§ã¹éã®å°ããªãã³ãã§ãããããªããžã§ã¯ããå¥ã®ãªããžã§ã¯ãã®äžã«ããå Žåããªããžã§ã¯ãéã§åŸ®èŠçãªäžèŠåæ§ãéæ¢ãããããããªã³ã¯ããŸãããã®æ¥ç¶ã¯ããªããžã§ã¯ããçžäºã«ã¹ã©ã€ãã§ããããã«ãåå²ãŸãã¯åå²ããå¿
èŠããããŸãããšã³ãžã³å
ã§ãããã·ãã¥ã¬ãŒãããæ¹æ³ãèŠã€ããå¿
èŠããããŸããæãç°¡åãªè§£æ±ºçã¯ãåã¿ã€ãã®ææã«2ã€ã®æ©æŠå€ãäžããããšã§ãã1ã€ã¯éçããã1ã€ã¯åçã§ããéæ©æŠã¯ã倧ãããå¶éããããã«äœ¿çšãããŸãjt
ãå Žåãæ°éãèšç®ãããšãjt
å°ããããããšããããïŒãããå€ãäžåã£ãŠããïŒããªããžã§ã¯ããéæ¢ããŠããããŸãã¯ããã«è¿ããšä»®å®ããå€å
šäœjt
ãåã®ã€ã³ãã«ã¹ãšããŠäœ¿çšã§ããŸããäžæ¹ãèšç®ã®jt
å€ããããå€ãããé«ãå Žåããªããžã§ã¯ããæ¢ã«ã掻æ§åãšãã«ã®ãŒããè¶
ããŠãããšæ³å®ã§ããŸãããã®ç¶æ³ã§ã¯ãæ©æŠåã®ããäœãéåéã䜿çšãããŸããããã¯ãããäœãæ©æŠä¿æ°ãšåã®éåéã®ãããã«ç°ãªãèšç®ã§è¡šãããŸã
ã·ãŒã³
ãæ©æŠãã®ã»ã¯ã·ã§ã³ã泚ææ·±ãèªãã ããããã§ãšãããããŸãïŒãã¥ãŒããªã¢ã«å
šäœã®äžã§æãé£ããïŒç§ã®æèŠã§ã¯ïŒéšåãå®äºããŸããããã®ã¯ã©ã¹ã¯Scene
ãç©çã·ãã¥ã¬ãŒã·ã§ã³ã·ããªãªã«é¢é£ãããã¹ãŠã®ã³ã³ãããšããŠäœ¿çšãããŸãããã¹ãŠã®åºç¯ãªãã§ãŒãºã®çµæãåŒã³åºããŠäœ¿çšãããã¹ãŠã®ãœãªãããå«ã¿ãè¡çªãã§ãã¯ãå®è¡ãããã®è§£æ±ºãåŒã³åºããŸãããŸãããã¹ãŠã®ã¢ã¯ãã£ããªãªããžã§ã¯ããçµåããŸãããŸããã·ãŒã³ã¯ãŠãŒã¶ãŒïŒããšãã°ãç©çãšã³ãžã³ã䜿çšããããã°ã©ããŒïŒãšå¯Ÿè©±ããŸããã·ãŒã³ã®æ§é ãã©ã®ããã«èŠãããã®äŸã次ã«ç€ºããŸãã class Scene { public: Scene( Vec2 gravity, real dt ); ~Scene( ); void SetGravity( Vec2 gravity ) void SetDT( real dt ) Body *CreateBody( ShapeInterface *shape, BodyDef def )
æ宀ã«Scene
ç¹ã«è€éãªãã®ã¯ãããŸããããã®ã¢ã€ãã¢ã¯ããŠãŒã¶ãŒã䟿å©ã«ãœãªãããè¿œå ããã³åé€ã§ããããã«ããããšã§ããBodyDef
-ããã¯ããœãªããã«é¢ãããã¹ãŠã®æ
å ±ãå«ãæ§é ã§ããããŠãŒã¶ãŒãæ§ææ§é ã®ãããªãã®ã«å€ãæ¿å
¥ããããã«äœ¿çšã§ããŸãããã1ã€ã®éèŠãªæ©èœã¯Step()
ã§ãããã®é¢æ°ã¯ãè¡çªãã§ãã¯ã解決ãçµ±åã®1ã¹ããããå®è¡ããŸãããã¥ãŒããªã¢ã«ã®ç¬¬2éšã§äœæãããã¿ã€ã ã¹ã¿ã³ãã®ãµã€ã¯ã«ããåŒã³åºãå¿
èŠããããŸãããã€ã³ããŸãã¯AABBãèŠæ±ããããšãã·ãŒã³å
ã§å®éã«ãã€ã³ããŸãã¯AABBãšè¡çªãããªããžã§ã¯ãã確èªããŸãããã®ã²ãŒã ãã¬ã€é¢é£ã®ããžãã¯ã®ãããã§ããªããžã§ã¯ããäžçã§ã©ã®ããã«é
眮ãããŠããããç°¡åã«ç解ã§ããŸãã
å€æè¡š
2ã€ã®ç°ãªããªããžã§ã¯ãã®ã¿ã€ãã«å¿ããŠãåŒã³åºãããè¡çªé¢æ°ãéžæããç°¡åãªæ¹æ³ãå¿
èŠã§ããC ++ã§ã¯ã2ã€ã®äž»èŠãªæ¹æ³ãç¥ã£ãŠããŸããããã«ãã£ã¹ãããïŒããã«ãã£ã¹ãããïŒãš2次å
é·ç§»ããŒãã«ã§ããç§ã®ãã¹ãã§ã¯ã2次å
ããŒãã«ãæé©ã§ããããšãããã£ãããããã®å®è£
ã詳现ã«æ€èšããŸããéCããã³éC ++ã䜿çšããäºå®ã®å Žåãé¢æ°ãã€ã³ã¿ã®ããŒãã«ãšåæ§ã«ãé¢æ°ãŸãã¯æ©èœãªããžã§ã¯ãã®é
åãäœæã§ããããšã¯ç¢ºãã§ãïŒããã¯C ++ã«åºæã®ä»ã®ãªãã·ã§ã³ã§ã¯ãªããé·ç§»ããŒãã«ãéžæãããã1ã€ã®çç±ã§ãïŒCãŸãã¯C ++ã®ãžã£ã³ãããŒãã«ã¯ãé¢æ°ãã€ã³ã¿ã®ããŒãã«ã§ããä»»æã®ååãŸãã¯å®æ°ã§ããã€ã³ããã¯ã¹ã¯ãããŒãã«ã®ã€ã³ããã¯ã¹ãšããŠäœ¿çšãããç¹å®ã®é¢æ°ãåŒã³åºããŸãã1次å
ã®ãžã£ã³ãããŒãã«ã䜿çšãããšã次ã®ããã«ãªããŸãã enum Animal { Rabbit Duck Lion }; const void (*talk)( void )[] = { RabbitTalk, DuckTalk, LionTalk, };
äžèšã®ã³ãŒãã¯ãå®éã«C ++èšèªèªäœãå®è£
ãããã®ãæš¡å£ããŠã
ãŸãããã ããC ++ã§ã¯ãä»®æ³é¢æ°ã®1次å
åŒã³åºãã®ã¿ãå®è£
ãããŸãã2次å
ããŒãã«ã¯æåã§äœæã§ããŸããè¡çªæé ãåŒã³åºãããã®2次å
ãžã£ã³ãããŒãã«ã®æ¬äŒŒã³ãŒãã¯æ¬¡ã®ãšããã§ãã collisionCallbackArray = { AABBvsAABB AABBvsCircle CirclevsAABB CirclevsCircle }
ãããŠããã ãã§ãïŒåã³ã©ã€ããŒã®çã®ã¿ã€ãã¯ã2次å
é
åã®ã€ã³ããã¯ã¹ããã³è¡çªã解決ããé¢æ°ã®éžæãšããŠäœ¿çšã§ããŸãããã ããAABBvsCircle
ãããCirclevsAABB
ãéè€ããŠããããšã¯æ³šç®ã«å€ããŸããäž¡æ¹ã®æ©èœãå¿
èŠã§ãïŒãããã®é¢æ°ã®1ã€ã§ã¯ãæ³ç·ãåæ ããå¿
èŠãããããããå¯äžã®éãã§ããããã«ããããªããžã§ã¯ãã®çµã¿åããã«é¢ä¿ãªããè¡çªãæ£ãã解決ã§ããŸãã
ãããã«
ãœãªããçšã®ç¬èªã®ç©çãšã³ãžã³ããŒãããäœæããããšã«å°å¿µããŠããå€ãã®ãããã¯ãæ¢ã«åãäžããŸããïŒãããŸã§ãè¡çªè§£æ±ºãæ©æŠãããã³ãšã³ãžã³ã¢ãŒããã¯ãã£ãç 究ããŠããŸããããã®ç¥èã«ãããå€ãã®é«å質ã®2次å
ã²ãŒã çšã®ç©çãšã³ãžã³ãäœæããããšã¯ãã§ã«å¯èœã§ãã次ã®ããŒãã§ã¯ããšã³ãžã³ã«ãšã£ãŠéèŠãªå¥ã®ãããã¯ãå転ãšæ¹åã«ã€ããŠæ€èšããŸããæåãªããžã§ã¯ãã®çžäºäœçšã芳å¯ããããšã¯éåžžã«èå³æ·±ããç©çãšã³ãžã³ãå¿
èŠãšããæåŸã®éšåã§ããå転ã®è§£æ±ºã¯éåžžã«ç°¡åã§ãããè¡çªã®èªèã¯ããå°é£ã«ãªããŸããããŒã4ïŒæåæ§ãœãªãã
ããã§ãåã®ã€ã³ãã«ã¹ãæ žã®æ§é ãæ©æŠã®è§£å床ã調ã¹ãŸããããã¥ãŒããªã¢ã«ã®ãã®æåŸã®éšåã§ã¯ãéåžžã«èå³æ·±ããããã¯ã§ãããªãªãšã³ããŒã·ã§ã³ãæããã«ããŸãããã®ããŒãã§ã¯ã次ã®ãããã¯ã«ã€ããŠèª¬æããŸãã- æ°åŠå転
- ãªãªãšã³ããããã©ãŒã
- è¡çªèªè
- è¡çªè§£æ±º
ã³ãŒãäŸ
å®è£
ã®è©³çŽ°ã®å€ãã¯èšäºèªäœã«é©åããªãã£ããããC ++ãšã³ãžã³ã®å°ããªäŸãäœæããèšäºãèªã¿ãªãããœãŒã¹ã³ãŒããåŠç¿ããããšããå§ãããŸãããã®GitHubãªããžããªã«ã¯ããµã³ãã«ãšã³ãžã³èªäœãšVisual Studio 2010ãããžã§ã¯ããå«ãŸããŠããŸãããGitHubã§ã¯ãããŠã³ããŒãããªããŠãã³ãŒãã衚瀺ã§ããŸãããã®ä»ã®é¢é£èšäº
ãªãªãšã³ããŒã·ã§ã³æ°åŠ
2Dã§ã®å転ã«é¢é£ããæ°åŠã¯éåžžã«åçŽã§ãããç©çãšã³ãžã³ã§äŸ¡å€ã®ãããã¹ãŠãäœæããã«ã¯ãäž»é¡ã®ç¥èãå¿
èŠã§ãããã¥ãŒãã³ã®ç¬¬äºæ³åã¯æ¬¡ã®ããã«è¿°ã¹ãŠããŸããã§ãå°åºãšäžã®n E N ãšE1 ïŒF = m a
ç¹ã«å転åãšè§å é床ã«é¢é£ããåæ§ã®æ¹çšåŒããããŸãããã ãããããã®æ¹çšåŒãç解ããåã«ã2次å
空éã§ã®ãã¯ãã«ç©ãç°¡åã«èª¬æãã䟡å€ããããŸãããã¯ã¿ãŒã¢ãŒãã¯ãŒã¯
3Dã®ãã¯ã¿ãŒã¢ãŒãã¯ãŒã¯ã¯ããç¥ãããæäœã§ãããã ãã2Dã®ãã¯ãã«ç©ã¯ãå®éã«ã¯äŸ¿å©ãªå¹ŸäœåŠç解éãæããªããããéåžžã«çŽããããå ŽåããããŸãã2Dã®ãã¯ãã«ç©ã¯ã3Dã®ããŒãžã§ã³ãšã¯ç°ãªãããã¯ãã«ã§ã¯ãªãã¹ã«ã©ãŒãè¿ããŸãããã®ã¹ã«ã©ãŒç©ã¯ãå®éã«ãã¯ãã«ç©ã3Dã§å®è¡ãããŠãããã®ããã«ãZ軞ã«æ²¿ã£ãçŽäº€ãã¯ãã«ã®å€§ãããå®éã«æ±ºå®ããŸããããæå³ã§ã¯ã2Dã®ãã¯ãã«ç©ã¯3Dãã¯ãã«æ°åŠã®æ¡åŒµã§ããããã3Dã®ãã¯ãã«ç©ã®åçŽåãããããŒãžã§ã³ã§ããããã§æ··ä¹±ããå Žåã§ããå¿é
ããªãã§ãã ããã2次å
空éã®ãã¯ã¿ãŒã¢ãŒãã«ã€ããŠæ·±ãç解ããå¿
èŠã¯ãããŸããããã®æäœã®å®è¡æ¹æ³ãæ£ç¢ºã«ç¥ããæäœã®é åºãéèŠã§ããããšãç¥ãã ãã§ååã§ããa à bã¯æ¬¡ãšåãã§ã¯ãããŸããb à a ã
ãã®ããŒãã§ã¯ããã¯ãã«ç©ãç©æ¥µçã«äœ¿çšããŠè§é床ãç·åœ¢ã«å€æããŸãããã ãã2Dã§ã®ãã¯ãã«ç©ã®å®è¡æ¹æ³ãç¥ãããšãéåžžã«éèŠã§ãã2ã€ã®ãã¯ãã«ãã¹ã«ã©ãŒãšãã¯ãã«ããŸãã¯ãã¯ãã«ãšã¹ã«ã©ãŒã®ãã¯ãã«ç©ãå®è¡ã§ããŸããæäœã¯æ¬¡ã®ãšããã§ãã
ãã«ã¯ãšè§é床
åã®éšåããç¥ã£ãŠããããã«ããã®æ¹çšåŒã¯ã身äœã«äœçšããåãšããã®èº«äœã®è³ªéããã³å é床ãšã®é¢ä¿ã瀺ããŠããŸããããŒããŒã·ã§ã³ã®ã¢ããã°ããããŸãïŒã§ãå°åºãšäžã®n E N ãšE2 ïŒT = rÃÏ
Tã¯ãã«ã¯ãè¡šããŸãããã«ã¯ã¯å転ã®åã§ããrã¯ãéå¿ïŒCMïŒãããªããžã§ã¯ãäžã®ç¹å®ã®ç¹ãŸã§ã®ãã¯ãã«ã§ããrã¯ãCMãããã€ã³ããŸã§ã®ãååŸããšèŠãªãããšãã§ããŸãããªããžã§ã¯ãã®åäžæã®ãã€ã³ãã«ã¯ãç¬èªã®å€ãå¿
èŠã§ããåŒ2ã§çœ®ãæãã rÏã¯ãªã¡ã¬ãšåŒã°ããå転é床ãæããŸãããã®æ¯çã¯ããœãªããã®è§é床ãç©åããããã«äœ¿çšãããŸããç·é床ã¯ãœãªããã¹ããŒãCMã®é床ã§ããããšãç解ããããšãéèŠã§ããåã®éšåã§ã¯ããã¹ãŠã®ãªããžã§ã¯ãã«å転ã³ã³ããŒãã³ãããªãã£ããããCMã®ç·é床ã¯äœã®ãã¹ãŠã®ãã€ã³ãã®é床ãšåãã§ãããæ¹åãè¿œå ããããšãCMããé¢ãããã€ã³ãã¯ãCMã«æãè¿ããã€ã³ããããéãå転ããŸããããã¯ãããã£ãå転ãšç§»åãåæã«è¡ããããã«ãªã£ããããããã£äžã®ãã€ã³ãã®é床ãèŠã€ããããã®æ°ããæ¹çšåŒãå¿
èŠã«ãªãããšãæå³ããŸãã圌ã¯ã次ã®åŒã䜿çšããŠãäœã®ãã€ã³ããšãã®ãã€ã³ãã®é床ãšã®é¢ä¿ãç解ãââãŸããã§ãå°åºãšäžã®n E N ãšE3 ïŒÏ = rà v
vã¯ç·é床ãè¡šããŸããç·é床ãè§é床ã«å€æããã«ã¯ãååŸã®ãã¯ãã«ç©ãèŠã€ããå¿
èŠããããŸãr ãããŠ
v ã
ã€ãŸããåŒ3ãå¥ã®åœ¢åŒã«å€æã§ããŸããã§ãå°åºãšäžã®n E N ãšE4 ïŒv = Ïà r
åã®ã»ã¯ã·ã§ã³ã®æ¹çšåŒã¯ãåºäœã®å¯åºŠãåäžã§ããå Žåã«ã®ã¿æå¹ã§ããäžåäžãªå¯åºŠã¯ããœãªããããã£ã®å転ãšåäœã«é¢é£ãããã¹ãŠã®æ°åŠãè€éã«ããŸããããã«ããœãªãããè¡šãããã£ãCMã«ãªãå Žåã次ãå«ãèšç®rã¯å®å
šã«æºããŸããæ
£æ§
2次å
ã§ã¯ããªããžã§ã¯ãã¯ä»®æ³è»žZãäžå¿ã«å転ããŸãããã®å転ã¯éåžžã«è€éã«ãªãå Žåãããããªããžã§ã¯ãã®éå¿ããã®è·é¢ã«äŸåããŸãã现é·ãæ£ã®è³ªéã«çãã質éãæã€åã¯ãæ£ãããå転ããããã§ãããã®ãå転ã®è€éããã®èŠå ã¯ãç©äœã®æ
£æ§ã¢ãŒã¡ã³ããšããŠèªèã§ããŸããããæå³ã§ã¯ãæ
£æ§ã¯ç©äœã®å転質éã§ããæ
£æ§ã倧ããã»ã©ãå転ãããã®ãé£ãããªããŸãããããç¥ã£ãŠãç©äœã®æ
£æ§ã質éãšåã圢åŒã§èº«äœã®æ§é ã«ä¿åã§ããŸãããŸããæ
£æ§ã®å€ã«éã®å€ãæ ŒçŽãããšåæã«ããŒãé€ç®ã§æ£ç¢ºã«ããããšãè«ççã§ãã質éããã³çžäºè³ªéã®è©³çŽ°ã«ã€ããŠã¯ãåã®ã»ã¯ã·ã§ã³ãåç
§ããŠãã ãããçµ±å
åãœãªããã«ã¯ãå転æ
å ±ãä¿åããããã®ãã£ãŒã«ããããã«å¿
èŠã§ããè¿œå ããŒã¿ãä¿åããæ§é ã®ç°¡åãªäŸã次ã«ç€ºããŸãã struct RigidBody { Shape *shape
è§é床ãšäœã®åãã®çµ±åã¯ãé床ãšå é床ã®çµ±åã«éåžžã«äŒŒãŠããŸãã以äžã«ãå®è¡ã瀺ãçãã³ãŒãäŸã瀺ããŸãïŒçµ±åã®è©³çŽ°ã«ã€ããŠã¯åã®ã»ã¯ã·ã§ã³ã§èª¬æããŸãïŒã const Vec2 gravity( 0, -10.0f ) velocity += force * (1.0f / mass + gravity) * dt angularVelocity += torque * (1.0f / momentOfInertia) * dt position += velocity * dt orient += angularVelocity * dt
åã«èª¿æ»ããå°éã®æ
å ±ãããã°ãç»é¢äžã®ããŸããŸãªãªããžã§ã¯ãã®å転ãç°¡åã«éå§ã§ããŸããã»ãã®æ°è¡ã®ã³ãŒãã§ãããå°è±¡çãªäœããæ§ç¯ã§ããŸããããšãã°ãDMãäžå¿ã«å転ããªãããã£ã®ã¥ã¢ã空äžã«æããéåããããåŒãäžããå匧ã«æ²¿ã£ãåããäœæããŸããMat22
äžèšã®ããã«ãæ¹åã¯ã©ãžã¢ã³åäœã®åäžã®å€ãšããŠä¿åããå¿
èŠããããŸãããå€ãã®å Žåãäžéšã®å³åœ¢ã§ã¯å°ããªå転è¡åãä¿åããæ¹ã䟿å©ã§ããããã®è¯ãäŸã¯ãOriented Bounding BoxïŒOBBïŒã§ãã OBBã¯ããã¯ãã«ãšããŠè¡šçŸã§ããå¹
ãšé«ãã§æ§æãããŸãããããã®2次å
ãã¯ãã«ã¯ãOBB軞ãè¡šã2è¡2åã®å転è¡åã䜿çšããŠå転ã§ããŸããæ°åŠã©ã€ãã©ãªã«ãããªãã¯ã¹ã¯ã©ã¹ãè¿œå ããããšããå§ãããŸãMat22
ãç§èªèº«ã¯ããªãŒãã³ãœãŒã¹ã®ãã¢ã«ããç¬èªã®å°ããªæ°åŠã©ã€ãã©ãªã䜿çšããŠããŸãããã®ãããªãªããžã§ã¯ããã©ã®ããã«èŠãããã®äŸã次ã«ç€ºããŸãã struct Mat22 { union { struct { float m00, m01 float m10, m11; }; struct { Vec2 xCol; Vec2 yCol; }; }; };
次ã®äŸ¿å©ãªæäœããããŸãïŒè§åºŠã«ããäœæãåãã¯ãã«ã«ããäœæã転眮ãä¹ç®Vec2
ãå¥ã®ä¹ç®Mat22
ã絶察å€ã®èšç®ãæåŸã®é¢æ°ã«ãããåx
ãŸãã¯ãã¯ã¿ãŒããååŸã§ããŸãy
ãåé¢æ°ã¯æ¬¡ã®ããã«æ©èœããŸãã Mat22 m( PI / 2.0f ); Vec2 r = m.ColX( );
ãã®ææ³ã¯ãå転軞ã«æ²¿ã£ãåäœãã¯ãã«ãååŸããã®ã«åœ¹ç«ã¡ãŸãïŒx
ãŸãã¯y
ããŸããåãã¯ãã«ãè¡ã«çŽæ¥æ¿å
¥ã§ããããã2ã€ã®çŽäº€åäœãã¯ãã«ãã2è¡2åã®è¡åãäœæã§ããŸãããã®äœææ¹æ³ã¯ã2次å
ã®ç©çãšã³ãžã³ã§ã¯ããŸãäžè¬çã§ã¯ãããŸããããã¿ãŒã³ãšè¡åã®äœæ¥ã®äžè¬çãªç解ã«ã¯åœ¹ç«ã¡ãŸãããã®ã³ã³ã¹ãã©ã¯ã¿ã¯æ¬¡ã®ããã«ãªããŸãã Mat22::Mat22( const Vec2& x, const Vec2& y ) { m00 = xx; m01 = xy; m01 = yx; m11 = yy; }
å転è¡åã®æãéèŠãªæäœã¯ãè§åºŠã«åºã¥ããŠå転ãå®è¡ããããšã§ãããããè§åºŠããè¡åãäœæãããã¯ãã«ã«ãã®è¡åãæããããšãéèŠã§ãïŒãã¯ãã«ãäœæããè§åºŠã§ââåæèšåãã«å転ãããããïŒïŒ Mat2( real radians ) { real c = std::cos( radians ); real s = std::sin( radians ); m00 = c; m01 = -s; m10 = s; m11 = c; }
ç°¡æœã«ããããã«ãåæèšåãã®å転è¡åã次ã®åœ¢åŒã§ããçç±ãæšæž¬ããŸããã a = angle cos( a ), -sin( a ) sin( a ), cos( a )
ãã ããå°ãªããšããããå転è¡åã®åœ¢åŒã§ããããšãç¥ã£ãŠããããšãéèŠã§ããå転è¡åã®è©³çŽ°ã«ã€ããŠã¯ãWikipediaããŒãžãåç
§ããŠãã ããããã®ä»ã®é¢é£èšäº
ããŒã·ã¹ãžã®å€æ
ã¢ãã«ç©ºéãšäžçã®éããç解ããããšãéèŠã§ããã¢ãã«ç©ºéã¯ãç©ççãªåœ¢åŒã«å¯ŸããŠããŒã«ã«ãªåº§æšç³»ã§ãããã®åº§æšåç¹ã¯CMå
ã«ããã座æšç³»ã®æ¹åã¯Figureèªäœã®è»žã«åãããããŸããå³ãäžçã®ç©ºéã«å€æããã«ã¯ãå転ããŠç§»åããå¿
èŠããããŸããå転ã¯ãäž»ã«åžžã«åç¹ã«å¯ŸããŠå®è¡ããããããäž»ã«å®è¡ãããŸãããªããžã§ã¯ãã¯ã¢ãã«ç©ºéïŒCMã®éå§ç¹ïŒã«ãããããå転ã¯Figureã®CMãåºæºã«ããŠå®è¡ãããŸããå転ã¯è¡åã§å®è¡ããMat22
ãŸãããµã³ãã«ã³ãŒãã§ã¯ãæ¹åè¡åã¯ãšåŒã°ãu
ãŸããå転ã®å®äºåŸããã¯ãã«ãè¿œå ããããšã«ããããªããžã§ã¯ããã¯ãŒã«ãå
ã®ãã®äœçœ®ã«ç§»åã§ããŸãããªããžã§ã¯ããäžçã®ç©ºéã«ããå Žåãéå€æã䜿çšããŠå®å
šã«ç°ãªããªããžã§ã¯ãã®ã¢ãã«ç©ºéã«ç§»åã§ããŸãããããè¡ãã«ã¯ãéå転ãšééåãå®è¡ãããŸããè¡çªã®èªèã§åçŽåãããã®ã¯ãããããã¹ãŠã®æ°åŠçãªèšç®ã§ãïŒã¯ãŒã«ãã®ç©ºéããèµ€ãããªãŽã³ã®ã¢ãã«ç©ºéãžã®éå€æïŒå·Šããå³ãžïŒãåã®ç»åãããããããã«ãèµ€ã®ãªããžã§ã¯ãã®éå€æã¯èµ€ãšéã®äž¡æ¹ã®ããªãŽã³ã«é©çšãããŸããã€ãŸããè¡çªèªèãã¹ãã¯ã2ã€ã®æå圢ç¶éã®è€éãªæ°åŠèšç®ã䌎ãã®ã§ã¯ãªããAABBããã³OBBãã§ãã¯ã®ã¿ã€ãã«å¶éã§ããŸããã»ãšãã©ã®å ŽåãããŸããŸãªçç±ã§ãµã³ãã«äŸã®ãœãŒã¹ã³ãŒãã¯åžžã«ã¢ãã«ç©ºéããã¯ãŒã«ã空éã«å€æãããã¢ãã«ã«æ»ããŸããè¡çªæ€åºã³ãŒãã®äŸãç解ããã«ã¯ããããäœãæå³ããã®ããæ確ã«ç解ããå¿
èŠããããŸãã
è¡çªèªèãšå€æ§äœçæ
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãããªãŽã³ãšåã®è¡çªã®æŠèŠãç°¡åã«èª¬æããŸããå®è£
ã®è©³çŽ°ã«ã€ããŠã¯ããœãŒã¹ã³ãŒãã®äŸãã芧ãã ãããããªãŽã³ãšããªãŽã³
ãã®ãã¥ãŒããªã¢ã«å
šäœã§æãè€éãªè¡çªèªèæé ããå§ããŸããããïŒç§ã®æèŠã§ã¯ïŒæãæåãã2ã€ã®ããªãŽã³éã®èãæ¹ã®è¡çªãã§ãã¯ã¯ã®å©ããåããŠå®æœãããåé¢è»žã®å®çïŒã®åé¢è»žå®çãSATïŒããã ããåããªãŽã³ã®å¯žæ³ãäºãã«æ圱ãã代ããã«ãDirk GregoriusãGDC 2013ã§ã®è¬çŸ©ã§èª¬æãããããå¹æçãªæ°ããæ¹æ³ããããŸãïŒç¡æã®ã¹ã©ã€ãã¯ãã¡ãã§ãïŒãæåã«ç解ããããšã¯ãåç
§ãã€ã³ãã®æŠå¿µã§ããåºæºç¹
ããªãŽã³ã®åç
§ç¹ã¯ãç¹å®ã®æ¹åã§æãé ãé ç¹ã§ãã2ã€ã®ãã€ã³ããç¹å®ã®æ¹åã«åãè·é¢ãæã£ãŠããå Žåããããããéžæã§ããŸããåºæºç¹ãèšç®ããã«ã¯ãã¹ã«ã©ãŒç©ã䜿çšããŠãç¹å®ã®æ¹åã«æ²¿ã£ã笊å·ä»ãã®è·é¢ãèŠã€ããå¿
èŠããããŸããããã¯éåžžã«åçŽãªã®ã§ãèšäºã§ç°¡åãªäŸã瀺ããŸãã
ã¹ã«ã©ãŒç©ã¯åé ç¹ã«äœ¿çšãããŸããã¹ã«ã©ãŒç©ã¯ãæå®ãããæ¹åã®ç¬Šå·ä»ãã®è·é¢ã§ããã€ãŸããæ圱è·é¢ãæ倧ã®é ç¹ãè¿ãããé ç¹ã«ãªããŸãããšã³ãžã³ã®äŸã§ã¯ããã®æäœã¯ç¹å®ã®ããªãŽã³ã®ã¢ãã«ç©ºéã§å®è¡ãããŸããåé¢è»žæ€çŽ¢
å¶åŸ¡ç¹ã®æŠå¿µã«ããã2ã€ã®ããªãŽã³ïŒããªãŽã³AãšããªãŽã³BïŒéã®åé¢è»žãæ€çŽ¢ã§ããŸãããã®æ€çŽ¢ã®èãæ¹ã¯ãããªãŽã³Aã®ãã¹ãŠã®ãšããžãã«ãŒããããšããžã®è² ã®æ³ç·ã§ã¢ã³ã«ãŒãã€ã³ããèŠã€ããããšã§ããäžã®ç»åã¯ããªããžã§ã¯ãããšã«1ã€ãã€ã2ã€ã®åºæºç¹ã瀺ããŠããŸããéã®æ³ç·ã¯ãéã®æ³ç·ã®å察æ¹åã«æ²¿ã£ãæãé ãé ç¹ãšããŠãä»ã®ããªãŽã³ã®ã¢ã³ã«ãŒãã€ã³ãã«å¯Ÿå¿ããŸããåæ§ã«ãèµ€ãæ³ç·ã䜿çšããŠãèµ€ãç¢å°ã®ç«¯ã«ããã¢ã³ã«ãŒãã€ã³ããèŠã€ããŸããåã¢ã³ã«ãŒãã€ã³ãããçŸåšã®ãšããžãŸã§ã®è·é¢ã¯ãèšå·ä»ãã®äŸµå
¥æ·±åºŠã«ãªããŸããæ倧è·é¢ãç¶æããåŸãæå°è²«é軞ãèšé²ã§ããŸãã以äžã¯ãé¢æ°ã䜿çšããŠæå°ã®äŸµå
¥ã®å¯èœãªè»žãæ¢ããœãŒã¹ã³ãŒãããã®é¢æ°ã®äŸã§ãGetSupport
ã real FindAxisLeastPenetration( uint32 *faceIndex, PolygonShape *A, PolygonShape *B ) { real bestDistance = -FLT_MAX; uint32 bestIndex; for(uint32 i = 0; i < A->m_vertexCount; ++i) {
ãã®é¢æ°ã¯æ倧ã®äŸµå
¥æ·±ããè¿ãããããã®æ·±ããæ£ã®å Žåãããã¯2ã€ã®æ°åã亀差ããªãããšãæå³ããŸãïŒè² ã®äŸµå
¥ã¯åå²è»žããªãããšãæå³ããŸãïŒããã®é¢æ°ã¯2ååŒã³åºãå¿
èŠããããååŒã³åºãã§ãªããžã§ã¯ãAãšBã亀æããŸããã€ã³ãã¯ããªããšããŒã¹ãªãã®ã¯ãªãã
ãã®æ®µéã§ã¯ãè¡çªãªããšããŒã¹ãªãã決å®ãã䟡å€ããããè¡çªãªãã¯ããŒã¹ãªãã®åŽé¢ã«å¯ŸããŠåæããå¿
èŠããããŸããErin CattoïŒBox2Dã®äœæè
ãšBlizzardã䜿çšãããã¹ãŠã®ç©çåŠïŒããã®ãããã¯ã詳ãã説æããåªããã¹ã©ã€ããäœæããŸããããããã¯ããªãç°¡åãªæäœã§ãããã®ã¯ãªããã³ã°ã«ããã2ã€ã®æ¥ç¹ãäœæãããŸããããŒã¹ãšããžãè¶
ãããã¹ãŠã®æ¥ç¹ã¯ãæ¥ç¹ãšèŠãªãããšãã§ããŸããErin Cattoã®ã¹ã©ã€ãã«èšèŒãããŠããå
容ã«å ããŠããµã³ãã«ãšã³ãžã³ã«ã¯ã¯ãªããã³ã°æé ã®äŸãå«ãŸããŠããŸããå€è§åœ¢ã®å
åãšå€è§åœ¢ãè¡çªãããæé ã¯ãå€è§åœ¢ãšå€è§åœ¢ã®éã®è¡çªãèªèãããããã¯ããã«ç°¡åã§ããæåã«ãåã®ã»ã¯ã·ã§ã³ã®å¶åŸ¡ç¹ã䜿çšããã®ãšåæ§ã®æ¹æ³ã䜿çšããŠãåã®äžå¿ã«æãè¿ãããªãŽã³ã®ãšããžãèšç®ãããŸãïŒã«ãŒãã§ã¯ãããªãŽã³ã®åãšããžã®æ³ç·ããã€ãã¹ãããåã®äžå¿ãããšããžãŸã§ã®è·é¢ãæ€åºãããŸããåã®äžå¿ããã®æãè¿ããšããžãè¶
ããŠããå Žåãé£çµ¡å
æ
å ±ãçæã§ããŸãããã®åŸãæé ã¯ããã«çµäºããŸããæãè¿ããšããžãèŠã€ããåŸããã¹ãã¯ç·åãšåã®ãã¹ãã«å€ãããŸããç·åã«ã¯ããããã€é åãšåŒã°ãã3ã€ã®èå³æ·±ãé åããããŸããå³ãèŠãŠãã ããïŒçŽç·ã»ã°ã¡ã³ãã®ãããã€é åãçŽæçã«ã¯ãåã®äžå¿ã«å¿ããŠãé£çµ¡å
ã«é¢ããããŸããŸãªæ
å ±ãååŸã§ããŸããåã®äžå¿ãé ç¹ã®ããããã®é åã«ãããšæ³åããŠãã ãããããã¯ãåã®äžå¿ã«æãè¿ãç¹ããšããžã®é ç¹ã«ãªããé ç¹ããåã®äžå¿ãžã®ãã¯ãã«ãè¡çªã®æ£ããæ³ç·ã«ãªãããšãæå³ããŸããåããšããžã®é åå
ã«ããå Žåãåã®äžå¿ã«æãè¿ãã»ã°ã¡ã³ãã®ãã€ã³ãã¯ãã»ã°ã¡ã³ããžã®åã®äžå¿ã®æ圱ã«ãªããŸããã³ãªãžã§ã³æ³ç·ã¯ããšããžã®æ³ç·ã«ãªããŸããåãã©ã®ãããã€é åã«ããããèšç®ããã«ã¯ãé ç¹ã®ãã¢éã®ã¹ã«ã©ãŒç©ã䜿çšããŸããã¢ã€ãã¢ã¯ãæ³åäžã®äžè§åœ¢ãäœæããŠãç·ã®äžéšã§äœæãããè§åºŠã90床ãã倧ãããå°ãããã確èªããããšã§ããç·åã»ã°ã¡ã³ãã®åé ç¹ã«å¯ŸããŠã1ã€ã®äžè§åœ¢ãäœæãããŸãããšããžã®é ç¹ããåã®äžå¿ãžã®ãã¯ãã«ããšããžã«æ圱ããŸãã90床ãã倧ããå€ã¯ããšããžé åãèŠã€ãã£ãããšãæå³ããŸãããšããžã®äžéšã®è§åºŠã90床ãè¶
ããäžè§åœ¢ããªãå Žåãå€æ§æ§ã®æ
å ±ãçæããã«ã¯ãåã®äžå¿ãã»ã°ã¡ã³ãèªäœã«æ圱ããå¿
èŠããããŸããäžã®å³ã«ç€ºãããã«ããšããžã®äžç«¯ããåã®äžå¿ãžã®ãã¯ãã«ãšãšããžãã¯ãã«èªäœã®ã¹ã«ã©ãŒåãè² ã®å€ã«ãªãå Žåãåãååšãããããã€é åãããããŸãã幞ããªããšã«ãã¹ã«ã©ãŒç©ã䜿çšããŠã笊å·ä»ãã®æ圱ãèšç®ã§ããŸãããã®ç¬Šå·ã¯ãè§åºŠã90床ãã倧ããå Žåã¯è² ã«ãªããè§åºŠãå°ããå Žåã¯æ£ã«ãªããŸãã
è¡çªè§£æ±º
ãããŠããã®ç¬éãåã³æ¥ãŸããã3åç®ãšæåŸã®æéã®ããã«ããã«ã¹å解èœã³ãŒãã«æ»ããŸãããã®æãŸã§ã«ãæ©æŠåãã«ã¹ãšãšãã«åãã«ã¹ãèšç®ãã解å床ã³ãŒãã®èšè¿°ããã§ã«å®å
šã«ç¿åŸããŠãããç·åœ¢æ圱ãå®è¡ããŠæ®ãã®è²«éåã解決ããããšãã§ããŸããæ©æŠãšæµžéã®è§£å床ã«å転æåãè¿œå ããå¿
èŠããããŸããè§é床ã«ãšãã«ã®ãŒãè¿œå ããå¿
èŠããããŸããæ©æŠã«é¢ããåã®ããŒãã§ãããæ®ãã圢åŒã§ã®åã®ã€ã³ãã«ã¹ã®è§£å床ã¯æ¬¡ã®ãšããã§ããã§ãå°åºãšäžã®n E N ãšE5 ïŒj = - ïŒ1 + e ïŒïŒïŒV A - V BïŒâ t ïŒ1m a s s A +1M A S S B
å転ã³ã³ããŒãã³ããè¿œå ãããšãæçµçãªæ¹çšåŒã¯æ¬¡ã®ããã«ãªããŸããã§ãå°åºãšäžã®n E N ãšE6 ïŒj = - ïŒ1 + e ïŒïŒïŒV A - V BïŒâ t ïŒ1m a s s A +1m a s s B +ïŒr A ÃtïŒ 2I A +ïŒrBÃtïŒ2I B
äžåŒã§ rã¯ããªããžã§ã¯ãã®CMããæ¥è§Šç¹ãŸã§ã®ãã¯ãã«ã®ããã«ãåã³ãååŸãã§ãããã®åŒã¯ãChris Heckerã®Webãµã€ãã«è©³çŽ°ã«è¡šç€ºãããŸãããªããžã§ã¯ãã®ç¹å®ã®ãã€ã³ãã®é床ã¯æ¬¡ã®ãšããã§ããããšãç解ããããšãéèŠã§ããã§ãå°åºãšäžã®n E N ãšE7 ïŒV â² = V + Ï Ã r
å転æ¡ä»¶ãèæ
®ããŠãåãã«ã¹ã®é©çšãå°ãå€æŽãããŸããã void Body::ApplyImpulse( const Vec2& impulse, const Vec2& contactVector ) { velocity += 1.0f / mass * impulse; angularVelocity += 1.0f / inertia * Cross( contactVector, impulse ); }
ãããã«
ããã§ãã¥ãŒããªã¢ã«ã®æåŸã®éšåã¯çµããã§ãããã©ãŒã¹ã€ã³ãã«ã¹ã®è§£æ±ºãå€æ§äœã®çæãæ©æŠã2次å
ã®åããªã©ãããªãå°æ°ã®ãããã¯ã調ã¹ãŸãããããªããæåŸã«å°éããå Žåãç§ã¯ããªããç¥çŠããŸãïŒã²ãŒã çšã®ç©çãšã³ãžã³ã®ããã°ã©ãã³ã°ã¯ãç 究ãéåžžã«é£ããåéã§ãããã¹ãŠã®èªè
ã®å¹žéãç¥ããŸãã