ODE質åã»èŠæåéïŒïŒïŒ
ãŸãïŒããã«ããODEã®FAQãèªãã§ããã³ã¡ã³ããé¡ãããŸãïŒ
ODE質åã»èŠæåéïŒïŒïŒã®ã³ã¡ã³ããïŒïŒïŒä»¶ãè¶ ããŸããã®ã§ïŒæ°èŠã®ã質åããèŠæã¯ãã¡ãã«ãé¡ãããŸãïŒãã質åã®å 容ã詳ãã説æããŠé ãããšç確ã«åçã§ããŸãã®ã§ïŒæéãç¯çŽã§ãããšæããŸãïŒ
ãŸããç§ã®ã³ã¡ã³ãããèªåã®åªåã«ããåé¡ã解決ãããå Žåã«ãåé¡ã®åå ããããã°æçš¿ããŠé ããšå€§å€å©ãããŸãããã®æ å ±ã¯ODEã®åå¿è ã«ãšã£ãŠéèŠãªãã®ã§ããããçšåºŠããŸããŸãããFAQã«æ² èŒããããšæããŸãã®ã§ãååã®ã»ã©ãããããé¡ãããŸãã
ã§ã
ã¯ãããŸããŠãå çã®ODEæ¬ãåèã«ODEã®å匷ããããŠããã£ãŠããŸãã
ããã°ã©ã ã«ã€ããŠã®è³ªåãªã®ã§ãããSTEP8ã®4èããããã®ãœãŒã¹ã® work() 颿°ã®äžã«ãã
THETA[leg_no][joint_no] = gait[t%12][leg_no][joint_no];
ãšããèšè¿°ã§ãäœæ t%12 ã§æ°å€ãåããŠããã®ããã©ãããŠãçè§£ã§ããŸããã
ãå¿ããããšã¯æããŸãããããè¯ããã°ãææãé¡ãããŸãã
ndekaããã
è¿ä¿¡ãé ããªã£ãŠãã¿ãŸãããä¿®å£«å ¬èŽäŒãåç çºè¡šããã¡ã€ã³å¥ç޿޿°ãªã©ã§ãã£ããåçãé ããªã£ãŠããŸããŸããã
ïŒïŒã§åããŠããã®ã¯æ©è¡ãïŒïŒã¹ãããã«åè§£ããŠããããã§ãã
詳ããã¯æèODEæ¬ã®P209ãã芧ãã ããã
ã§ã
åããŸããŠãç§ã¯èé¢ããŒã¿ããåäœãçæãã衚瀺ããã·ã¹ãã ã®ç ç©¶ããŠããŸãã
ODEã§åäœã®è¡šç€ºéšåãäœæããŠããŸãã
ããã§è³ªåããããŸãã
çŸåšããããããäœæããŸããŠãããã«è¡çªæ€åºãçµã¿èŸŒãã§ãããšããã§ãã
ããããã®è¶³ã®éšåãçŽæ¹äœãšåæ±ãhingejointãçšããŠçæããŠããŸãã
ãããããã®è¶³ã®éšåãä»ãå ããŠè¡çªæ€åºãè¡ããšãargument not a spaceãšãããšã©ãŒãåºãŠããŸããŸãã
è¶³ã®éšåãæ¶ããŠãã£ãããããã§è¡çªæ€åºãè¡ããšãã®ãšã©ãŒã¯ã§ãŸããã
ãç°¡å!å®è·µ!ããããã·ãã¥ã¬ãŒã·ã§ã³ãã§ããããããäœæããŠãããšæãã®ã§ããããã®ãããª
ãšã©ãŒã¯åºãªãã£ãã®ã§ããããïŒ
åºãªãã£ãã®ã§ããã°ãäœãåé¡ãªã®ã§ããããïŒ
ãªã«ã埡åãã§ããã°æããŠé ãããšæé£ãã§ã.
ãããããé¡ãããŸã.
ãããŸãããèªå·±è§£æ±ºããŸããã
宣èšã®jointã®æ°ãšå®é䜿çšããŠããjointã®æ°ãéãã®ãåé¡ã§ããã
ã¢ã¹ãã¡ã«ãã®äžãè»ãããç§»åãããšããå Žåãå®äžçãšæ©æŠãªã©ãè¿ã¥ããã«ã¯ã©ã®ãããªå€ãå ¥ããã°è¯ãã®ã§ãããããæããŠãã ããã
ãcontact[i].surface.mu =
contact[i].surface.mu2 =
contact[i].surface.soft_cfm =
ãããã contact[i].surface.soft_erp =
ã³ã¡ã³ãããããšãããããŸãã
ã¯åæ©æŠä¿æ°ãéæ¢æ©æŠä¿æ°ã®éãããªãã®ã§ç²ŸåºŠã®é«ãã·ãã¥ã¬ãŒã·ã§ã³ã«ã¯åããŸãããã¢ã¹ãã¡ã«ãã®ã¢ããªã³ã°ãããããšããªãã®ã§è©³ããæ°å€ã¯ããããŸããã
ã§ã
åããŸããŠãODEã䜿ãç§»åååç«æ¯åãäœæãã忥ç ç©¶ãããŠããŸãã
åã®äººã®åŒç¶ãã§ç ç©¶ãããŠããã®ã§ããããœãŒã¹ãã¡ã€ã«ãç¡ãVisual C++ã䜿ã£ãŠè£œäœããŠããã¿ãããªã®ã§ãããåããæåãããããŠã³ããŒãããŠãã£ãŠã¿ãã®ã§ããããŸãäœåããŠãããŸããã
ãã°ããCode::Blocksã䜿ã£ãŠè£œäœããŠããã®ã§ãããåã®äººã®ããã°ã©ã ãæžã蟌ãã§ã¿ããšãšã©ãŒã«ãªããŸãã
ææã«èãã°åã®æ¹ã¯ããããã·ã¥ãã¬ãŒã·ã§ã³ã®ææä»¥å€ã«ãåºæææã«äœ¿ãæ¹ã®è³æãããã£ãŠåèã«ããŠããã¿ããã§ãã
å·®æ¯ããç¡ããã°ç§ã«ãåèè³æçãããããŸããããè²ã£ãŠããã ãããã®ã§ãã
ãããšçŸåšããããªããšãããªãã§ãããCode::Blocksã§ã¯ãœãŒã¹ãã¡ã€ã«ãå ¥ãããšããã¯ãããŸããïŒ
ãããŸãŸãèšã£ãŠç³ãèš³ãããŸããã
ã©ãããããããé¡ãããŸãã
uenoããïŒ
äœ¿ãæ¹ã®è³æã¯ïŒïŒ¯ïŒ€ïŒ¥æ¬ãšãã®ããã°ã«ããè³æä»¥å€ã«ãããŸããïŒ
Code::Blocksã®äœ¿ãããã¯ãã®ããã°ã«ãå°ã解説ããŠããŸãïŒ
æ€çŽ¢çªããæ¢ããŠãã ããïŒ
ã§ã
ãè¿äºããããšãããããŸãã
ç§ã®å匷äžè¶³ã§ã倱瀌ãªè³ªåãããŠãã¿ãŸããã
æ¬ãšåã®æ¹ã®è«æããç§ãªãã«åç«æ¯åãäœãããšã¯ã§ããã®ã§ããã
ç§»ååã«ããããã®è»èŒªã®ã€ãæ¹ãã©ãããŠãããããªãã®ã§æããŠããã ããããããããã§ãã
ã¡ãªã¿ã«ãVisual C++ 2008 ãã€ãã£ãŠè£œäœããŠããŠãåç«æ¯åã¯ïŒæ¬¡å ã§è¡šç€ºã
ç§»åãïŒæ¬¡å ã®å·Šå³ç§»åã«ãããã§ãã
ããªãè¡æ°ãå€ãã®ã§ãããå¯èœã§ããã°è£œäœããããã°ã©ã ãèŠãŠããã ãããã®ã§ããã
ãããããé¡ãããŸãã
uenoããã
æè¿å¿ãããªã£ãŠãããã°ã®ãµãŒãã¹ãŸã§ã§ããŸããã
ããããªããã
ã§ã
ã¯ãããŸããŠã
ãã®ãµã€ããå ã«ODE,VisualC++2008ãããŠã³ããŒããããŸããã
ãµã³ãã«ã¯åãã®ã§ãããæ°ãããããžã§ã¯ãããæ¬ã«æžããŠãã£ãããã°ã©ã ãå®è¡ããããšãããš
‘ode/ode.h’: No such file or directory
ãšã§ãŠå®è¡ã§ããŸãããããããã¡ã€ã«ãéããŠããªãã®ã§ããããïŒ
åæ©çãªããšã§ç³ãèš³ãããŸããããããããé¡ãããŸãã
åããŸããŠãå çã®HPãšæžç±ããã€ãå©çšãããŠããã ããŠããŸãã
ä»åODEã®è¡çªæ€åºã«é¢ããŠäžæãªç¹ããããã質åããããŠããã ããŸãã
å çã®ãµã³ãã«ããã°ã©ã ã®äžã§ããŒã«ãåºã«è¡çªããéã«è²ãå€ããããã°ã©ã ããããšæãã®ã§ããã
ç§ã¯ãããå©çšããŠäºè¶³æ©è¡ãããããã©ã¡ãã®è¶³ã§çå°ãããŠããããå€å¥ãããèããŠããŸãã
çŸåšãå·Šå³ã©ã¡ããäžæ¹ã®è¶³ã®çå°ã¯å€æã§ããã®ã§ãããäž¡èãçå°ããŠããç¶æ ãå€å¥ããããšãã§ããŸããã
ODEã§ã¯è€æ°åæãåæã«è¡çªæ€åºããããšã¯äžå¯èœãªãã§ããããïŒ
çå€ããªè³ªåãããŠããããããŸãããå çã®æèŠãèãããŠããã ããªãã§ããããã
ãå¿ããæç³ãèš³ãããŸããããããããé¡ãããŸãã
ããã«ã¡ã¯ã
ODEæ¬STEP7ãé¢ç¯è§é床ãšå 端é床ã®é¢ä¿ããåèã«ããŠã
ã€ã³ãè¡åããïŒè»žããããã®åããã€ãã£ãŠããŸãã
äœçœ®é床ã¯åé¡ãªãã®ã§ãããè§é床ã«åé¡ãã§ãŠå°ã£ãŠããŸãã
R1*R2*R3*R4*R5*R6ã®å転è¡åããããŒã«ããããšãŒãšããŠå§¿å¢ãåãåºãã
ããã埮åããåŒãã€ã³ãè¡åã«åœãŠãŠããŸãã
ïŒæ°å€ã¯ãODEã®dBodyGetRotationããåã£ãŠããããšã確èªããŠããŸãïŒ
ãããã·ãã¥ã¬ãŒã·ã§ã³ããŠã¿ããšã
ãšãŒè§ã¯ã絶察座æšã§å転ãã
ããŒã«è§ã¯çžå¯Ÿåº§æšã§å転ãã
ãããè§ã¯ããã®ããããªãåãã«ãªã£ãŠããŸããŸãã
ã©ãããã°ãçžå¯Ÿåº§æšã§çµ±äžããããã¯çµ¶å¯Ÿåº§æšã§çµ±äžãããŠåãããã®ã§ããããã
ãããããé¡ãããŸãã
ãã¿ãŸããããããèŠãŠèªå·±è§£æ±ºããŸããã
http://www5c.biglobe.ne.jp/~uso-ats/robbt/robo-no2/r-no2-2.html
ããããã®å§¿å¢ã®èãæ¹ãåéãããŠããã®ãåå ã§ããã
åããŠè³ªåããŸãïŒ
çšèªïŒæé¢çããããèªã¿ã«ããã£ãããã¿ãŸããïŒ
倧åŠé¢ã®ç ç©¶ã§ãã³æ¿å ¥ïŒãã°ã€ã³ããŒã«ïŒãããŠãããŸãïŒ
ãã®éã®ãã³ïŒãã°ïŒã«äœçšããåã»ã¢ãŒã¡ã³ããODEãçšããŠç®åºããããšèããŠããã®ã§ããïŒ
äœãè¯ããµã³ãã«çãããŸãããïŒ
ãããããé¡ãããŸãïŒ
JOJOããïŒ
è¯ããµã³ãã«ã¯ãããŸããïŒ
ãã¿ãŸããïŒ
ã§ã
ãã¿ãŸããïŒè³ªåãå€ããŸãïŒ
ç©äœãå°é¢ã«æŒãç¶ããé(Fx)ïŒ
ãã®ååãšããŠç©äœã«äœçšããå(Nx)ã¯ODEã®é¢æ°ã§è¡šç€ºã§ããŸããïŒ
ãããšãèšç®åŒã§èªåã§ç®åºãããããããŸãããïŒ
Fxââââââ
ïŒ\
ãã \Nx\
ããã\âïŒãã
ïŒïŒïŒïŒïŒïŒïŒïŒïŒïŒïŒïŒïŒïŒïŒïŒïŒ
demuããã¯ãããŸããŠïŒRozKenã§ãïŒ
倧åŠé¢ã®ç ç©¶ã§ããããã®èšèšã®ããïŒç©çã·ãã¥ã¬ãŒã¿ãŒã䜿ãããšèããŠãããŸãïŒ
demuããã®ãã®ãµã€ããèŠã€ããŠïŒOpen Dynamics Engineã«èå³ãæã¡ãŸããïŒ
ãBig News for ODEïŒå¯äžã®åŒ±ç¹ã解決ãããïŒïŒã ( http://demura.net/9ode/486.html )ã®èšäºãèªãã ã®ã§ããïŒçŸåšã®ããŒãžã§ã³ã§ã¯4次ã«ã³ã²ã¯ãã¿ã«ããå€åãœã«ãã¯å®è£ ãããŠããã®ã§ããããïŒ
ãŸãïŒLCPã§çšããŠããã¬ãŠã¹ã¶ã€ãã«æ³ã¯OpenCLãªã©ã§äžŠååã§ãããšèããã®ã§ããïŒä»åŸãã®ãããªäºå®ã¯ããã®ã§ããããïŒããããããã°ïŒç²ŸåºŠã®ç¹ã§ãã·ãã¥ã¬ãŒã·ã§ã³æéã®ç¹ã§ãæ¯éå©çšããããšã³ãžã³ã ãšèããã®ã§ãïŒ
ããããã£ããïŒæããŠãã ãããŸãïŒ
ã«ã³ã²ã¯ãã¿ã¯å®è£ ãããŠããŸãããæ°å¹Žåã«èª°ããã«ã³ã²ã¯ãã¿ã®ããããæçš¿ããŸããããå®è£ ãæªãã£ãããã§çµã¿èŸŒãŸããŸããã§ãããã«ã³ã²ã¯ãã¿ãå®è£ ãããšæ°åããïŒåé ããªããšããå ±åãšããããå€ãã®éçºè ã¯ïŒ¯ïŒ€ïŒ¥ã粟床ã®é«ãçšéã§ã¯äœ¿ã£ãŠããªãã®ã§ããŸãç±å¿ã§ã¯ãããŸãããå¿ èŠãªäººãå®è£ ããã°è¯ããšæããŸããã©ãã§ããïŒãRozkenããã
OpenCLã®è©±ãå¹ããŸããããã ãODEã¯ä»ãŸã§è¡çªæ€åºãBulletãªã©ãšå·®ãã€ããããŠããŸããããæè¿ãContinuous collision detectionãå®è£ ãããã®ã§ãè¡çªæ€åºã¯ããªãæ¹åããããšæããŸãã
粟床ãšã¹ããŒãã¯ãã¬ãŒããªããªã®ã§ãé«ã粟床ãå¿ èŠãªå Žåã¯ïŒ¯ïŒ€ïŒ¥ã¯åããŠãªããšæããŸãã粟床ã¯å€å°ç ç²ã«ããŠããªã¢ã«ã¿ã€ã 以äžã®é床ãå¿ èŠãªå Žåã¯ïŒ¯ïŒ€ïŒ¥ã¯åè£ã«ãªããšæããŸãã
ã§ã
demuãããäžå¯§ãªã³ã¡ã³ããããããšãããããŸããããå°ãä»ã®ç©çãšã³ãžã³ãšæ¯èŒããŠã¿ãããšæããŸãã
ä»ã®ç©çãšã³ãžã³ã¯äœããèãã§ããïŒãOpenHRP, PhysX, Bullet ãããã§ããïŒãOpenHRPãšã®å®éçæ¯èŒã¯èŠãããšããªãã®ã§ãããæ¯èŒãçµæãåºããæããŠãã ããã
ã§ã
ã§ãããïŒ
HPïŒODEæ¬åèã«ãããŠé ããŠãŸãïŒ
æç»ã«é¢ããŠä»¥äžã®è³ªåããããŸãïŒ
â æç»ã¯é è¿æ³(åã倧ããã®ç©äœã§ãïŒè¿ãã«ããç©ã¯å€§ããïŒé ãã«ããç©ã¯å°ãã)ã§ããïŒ
é è¿æ³ã§ãªãæç»æ¹æ³(å³é¢ãèŠãã¿ããã«ïŒè·é¢ã«é¢ä¿ãªãåã倧ããã«èŠãã)ã¯ãããŸãã§ããããïŒ
â¡ç©äœãåéæã«ããããïŒä»¥äžAPIã䜿çšããŠããã®ã§ããïŒ
alphaã®å€ãå€ããŠãéæã«ãªããŸããïŒäœãåé¡ãªã®ã§ããããïŒ
dsSetColorAlpha(float red, float green, float blue, float alpha);
ãããããé¡ãããŸãïŒ
ããããŸããã
è¿äºãé ããŠãã¿ãŸããã
ãŸããã«ä»å±ã®drawstuffã¯ãã¢ã®ãã¹ãçšãªã®ã§æ©èœçã«ã¯è²§åŒ±ã§ãã
â ããããŸããããèªåã§ãœãŒã¹ã³ãŒããæ¹å€ããå¿ èŠããããŸãã
â¡ãç§ã¯ãã®ãããªçŸè±¡ã«ãã£ãããšããªãã®ã§ããããŸãããdrawstuffã§ã¯ç©äœæ¯ã«è²ãèšå®ããããšã¯ã§ãããæç»çŽåã«åŒã°ããAPIãåæ ãããã®ã§ããã®ããã§ããããïŒ
ã§ã
ã¯ãããŸããŠ.
ãã€ãåèã«ãããŠé ããŠãããŸã.
æ©é質åãªã®ã§ãã, ODEãçšããŠ, ããŒã«(çäœ)ããŸã£ããçŽç·çã«è»¢ãã,
転ãããå ã«ããåæ±ãåã”ããŒãªã³ã°”ã®ãããªç°å¢ãæ§ç¯ãéãã§ããã®ã§ãã,
ãŸã£ããåãæ¡ä»¶ã§ããŒã«ããã³ã«è¡çªãããŠããã«ãé¢ããã
ãã³ã®åããæ¬æ°ã«ã°ãã€ããããŸããŠããŸã.
åã®é ã®ãªãã§ã¯, ããŒã«ã®åæäœçœ®, é床ãªã©ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒãåãã§ããã°
åãèšç®çµæã«ãªããªããšãããããšæãã®ã§ãã, ãªããã®ãããªéããããŸããã®ã§ãããã.
ããã¯ã·ãã¥ã¬ãŒã·ã§ã³ã«ãããå®å®æ§ã«èµ·å ãããã®ãªã§ããããïŒ
åºæ¬çãªè³ªåã§ç³ãèš³ãããŸãããæããŠé ããŸããã§ãããã.
å®ãããé¡ãèŽããŸã.
takachanããã
è¿äºãé ããŠãã¿ãŸããããã£ãšå°ãæã«ãªããŸããã
ããŠããšãŠãè¯ã質åã§ããïŒæ± äžãã颚ïŒã
ã§ããæ¬ããã°ã®ãã®ãããã質åãã®ïŒ¢ïŒïŒã«åçæžã¿ã§ãããã¡ããã芧ãã ããã
http://demura.net/ode_faq
ã§ã
çŸåšïŒæ§ã ãªã·ãã¥ã¬ãŒã¿ã®æ§èœãç¹åŸŽã調ã¹ãŠããã®ã§ããïŒ
ODEã§ã¯éãªã³ã¯æ©æ§ã®åååŠèšç®ã¯è¡ããã®ã§ããããïŒ
ã¯ãããŸããŠã
çŸåšã2è¶³æ©è¡ããããã·ãã¥ã¬ãŒã¿ã®å¶äœãããŠããŸãã
åºææ°ã®ããã¹ããç°¡å!å®è·µ!ããããã·ãã¥ã¬ãŒã·ã§ã³ããåèã«ããªããé²ããŠããã®ã§ãããã¡ãã£ãšå£ã«åœãã£ãŠããŸã£ãã®ã§è³ªåãããŠé ãããšæã£ã次第ã§ãã
äžèšããã¹ãã®step9:ãã¥ãŒããã€ãããããå ã®è¶³ã®ééååŠïŒ6èªç±åºŠããããã¢ãŒã ïŒã«ãŠãæé¡ãã¯ãã«aã䜿ãããŠããŸãããããã¯ã©ã®ããã«ç®åºããã°ããã®ã§ããããïŒ
éååŠã§æé¡ãã¯ãã«aãå°åºããŠããŸããããããééååŠçšã«äœ¿çšããããšã¯ã§ããŸããããïŒ
ãå¿ããããšã¯æããŸããããææããã ããã幞ãã§ãã
ãã¿ãŸãããéååŠã®çµæãå©çšããŠãšãããŸãã®ã§æé¡ãã¯ãã«ã¯æ±ããããŸããã確èªäžè¶³ã§ããâŠã
ã§ãããå¥ã®åé¡ããã£ãã®ã§è¿œèšãããŠé ããŸãã
éååŠã®æé¡ãã¯ãã«aã®ç®åºã«äœ¿ãããå転è¡åã®è§åºŠÎžïŒïœïŒã¯dJointGetHingeAngleã䜿çšããŠèãªã©ã®è§åºŠãååŸããã°ãããã§ããããïŒ
åããã«ãã質åã§ãããããããªããã
ãã¿ãŸãããèªå·±è§£æ±ºããŸããã
远èšãé ããªã£ãŠæžã¿ãŸããã§ãã
åããŸããŠããŸãããåãããšãããããšããŠãåããšããã§æ©ãã§ããŸããã
ééååŠã¯ããããã¥ã¬ãŒã¿å 端ã®äœçœ®ãå§¿å¢ããé¢ç¯è§åºŠãç®åºããããšãªã®ã§ã
aã«ã€ããŠéååŠã§åºããŠãé§ç®ãªããããªãã§ããããïŒé¢ç¯è§åºŠã䜿ãããŠããŸãïŒ
å 端äœçœ®ã¯ïŒèªç±åºŠãããªããŠãééååŠã§ã¯ïŒã€ã®é¢ç¯è§åºŠãæ±ããã®ã§ãæé¡ãã¯ãã«ã¯
è¶³ã®ç²ãæ°Žå¹³ã«ãããšããããã«æææ¡ä»¶ãå¿ èŠãªæ°ãããŸãã
ããªãã¡ãæé¡ãã¯ãã«ã¯æ±ãããã®ã§ã¯ãªãäžãããã®ãšããããšã§ã¯ãªãã§ããããïŒ
éã£ãŠãããæžã¿ãŸããããããmyuããããéååŠã§æ±ããŠãŠæ®éã«æ©è¡ãåºæ¥ãŠããã°
ãã®æšæããŠé ããã°å©ãããŸãã
ãããã¯ãåæå€ãå°é¢ã«å¹³è¡ãªã®ã§ããã®ãŸãŸã§ãäœãšãªãåºæ¥ãŠããŸãã®ããã
demuããããä¹ ãã¶ãã§ãã以å質åãããŠé ããããªãã§ãã
ODEã®ã·ãã¥ã¬ãŒã·ã§ã³ãç»åãšããŠä¿åãããã®ã§ããã
èŠã€ããæ¹æ³ã§ã¯Visual C++ã䜿ã£ãŠãããããåããã¥ããã
èªåã¯codeblocksã䜿ã£ãŠããã®ã§å¿çšã§ããªãããšæã詊ããŠã¿ãŸãããããŸããããŸããã
ãããããã°ãcodeblocksã§ã®ã·ãã¥ã¬ãŒã·ã§ã³ç»åã®ä¿åæ¹æ³ãæããŠããã ããŸãããïŒ
ããªãããã
è¿äºã倧å€é ããªããã¿ãŸããã
åç»ãã£ããã£ãœããã䜿ãã®ãäžçªç°¡åã ãšæããŸãã
ã§ãããã®ãããªæ©èœãããã°ããããã§ãããã
irrDrawStuffã«è¿œå ã§ããããé 匵ããŸãã
ã§ã
ã¯ãããŸããŠãç§ç°çç«å€§åŠã®4幎çã§ããåèŠã®ç ç©¶ãããŠããŸããPHANTOM-omniã§ãODEã®ã¢ãŒã ã®ãµã³ãã«ããã°ã©ã ã«åèŠãæç€ºãããŠã¿ãããšããŠãã®ã§ããããŸããããŸããããããããã°ã¢ããã€ã¹ãé¡ãããŸãã
MaedaããïŒ
ã¯ãããŸããŠïŒ
PHANTOM-omniã䜿ã£ãããšããªãã®ã§è¯ãããããŸããïŒ
ODEã®æ©æŠã¢ãã«ã¯ã·ã³ãã«ãªã®ã§ïŒç©ãæŽããªã©ã®æ©æŠã¢ãã«ãéèŠã«ãªãã·ãã¥ã¬ãŒã·ã§ã³ã«ã¯åããŠããªããšæããŸãïŒ
ã§ã
ããã«ã¡ã¯ãïŒè»žããããã®ã·ãã¥ã¬ãŒã¿ã®å¶äœãããŠããstarã§ãã
èªåã¯ä»ãïŒè»žããããã«ããŒã«ã®è¿œè·¡ããããããã°ã©ã ãå¶äœããŠããŸãããããŒã«ãšãããããšã®åº§æšã®è¡šç€ºã®ä»æ¹ã座æšã®ç®åºæ¹æ³ãªã©ãåãããŸããã
ãããããã°æããŠãã ããã
å ã»ã©ã®è³ªåã®è£è¶³ã§ãã
ç©äœã®åº§æšã®äœçœ®ãååŸã®æ¹æ³ã«ã€ããŠã§ããããdBodyGetPosition(dBodyID);ãã䜿ãã°ãããšèªåã§ã¯èããŠãŸããããããããš
‘dBodyGetPosition’ : 1 çªç®ã®åŒæ°ã ‘MyObject’ ãã ‘dBodyID’ ã«å€æã§ããŸããã
ãšãããšã©ãŒãçºçããŠããŸããŸãã
ããæ¹ãééã£ãŠããã®ã§ããããïŒ
å ã¿ã«ãïŒè»žããããã®ã·ãã¥ã¬ãŒã¿ã¯ãã¡ãã®ããŒãžã«ãã£ããµã³ãã«ãåèã«å¶äœããŠããŸãã
starããã
ããã«ã¡ã¯ã
ãšã©ãŒã®åºãdBodyGetPositionã®è¡ã ãå šãŠæããŠãã ããããšã©ãŒãèŠãéããåŒæ°ã®æž¡ãæ¹ãééã£ãŠããããã«æããŸããäŸãã°ãMyObject link; ã§å®£èšããã第ïŒåŒæ°ã¯link.bodyã«ãªããŸãã
ã§ã
è¿ä¿¡ããããšãããããŸãã
ïŒè»žããããã®æ¬äœïŒbaseïŒã®åº§æšãç²åŸããããšmakebase颿°ã®åŸã«ã
void printbasePosition()
{
double *po = (double *) dBodyGetPosition(base);
printf(“Current Position: x=%6.2f y=%6.2f z=%6.2f \n”,po[0],po[1],po[2]);
}
ãšå ¥åãããã
error C2664: ‘dBodyGetPosition’ : 1 çªç®ã®åŒæ°ã ‘MyObject’ ãã ‘dBodyID’ ã«å€æã§ããŸããã(æ°ããæ©èœ ; ãã«ããåç §)
ãã®å€æãå®è¡å¯èœãªãŠãŒã¶ãŒå®çŸ©å€ææŒç®åããªããããŸãã¯æŒç®åãåŒã³åºããŸããã
ãšãããšã©ãŒãçºçããŸããã
åŒæ°ãå€ãããã«ãããã°ã©ã ãäœèšè€éã«ãªã£ãŠããŸããŸãã
baseãMyObjectæ§é äœãªããäžçªç®ã®åŒæ°ã¯base.bodyãããbaseããã€ã³ã¿ãªãbase->bodyã«ãªããšæããŸãã
詊ããŠããããŸããïŒ
ã§ã
è¿ä¿¡ããããšãããããŸãããããããŸã§åº§æšã衚瀺ãããããã«ãªããŸããã
ããäžã€è³ªåã§ããããã®ããã°ã©ã ã®å Žåpo[0]ã«x軞ãpo[1]ã«y軞ãå ¥ã£ãŠããããšã«ãªããã§ãããïŒ
starããïŒ
ããã£ãã§ããïŒ
ã¯ã, x,y,zã®å€ãé çªã«å ¥ã£ãŠããŸãïŒ
ã§ã
ã¯ãããŸããŠ,ããå©çšãããŠããã ããŠããŸã.
æ©é,質åãªã®ã§ãã
ïœïœåäœã®ç©äœã,å®å¯žã§åçŸãããïŒããã°ã©ã ã«æžãããã æ°å€ã¯åœéåäœç³»åºæºã§æžããŠããïŒã®ã§ãã,å°é¢ã¹ã¬ã¹ã¬ã«ã«ã¡ã©ãïŒäœè£œããç©äœã®è¿ãã«viewpointãïŒãã£ãŠãããšæç»ããããããªã,å°é¢ã®ãã¯ã¹ãã£ããããããªã£ãŠããŸããŸã.
ãããåæ©çãªããšãèããŠããã®ãããããŸããã,ãªã«ã埡åãã§ããã°æããŠé ãããšæé£ãã§ã.
ãããããé¡ãããŸã.
Kiuiããã
ODEã¯åååŠãšã³ãžã³ã§ãæç»ã®éšåã¯drawstuffãšãOpenGLã§æžãããç°¡æã©ã€ãã©ãªãæ åœããŠããŸãããããããªããšããæå³ãè¯ãããããŸãããããã¯ã¹ãã£ã®è§£å床ã®ãããããããŸããã
ç»é¢äžæ¯ã«ãã¯ã¹ãã£ãæ¡å€§ãããšãèãèŠããŠããŸããŸãã
ã§ã
é ããªã£ãŠç³ãèš³ãããŸãã.
è¿ä¿¡ããããšãããããŸã.
ããçšåºŠãŸãšãŸã£ãŠããã»ã»ãšæã£ãŠããã®ã§ãã,çµå±ãŸãšãŸãã.
>ãããããªããšããæå³ãè¯ãããããŸããã
å ·äœçã«èšããŸããš,ååŸÃé·ã= 0.0005[m]Ã0.001[m]ã®åçãODEã§çæã,ããŒå ¥åïŒã³ãã³ãå ¥åïŒã§ã«ã¡ã©ãè¿ã¥ãããããªããã°ã©ã ãæžããŸãã.
ãšããã,0.001[m]ã¥ã€ã«ã¡ã©ãè¿ã¥ããŠãããš,çæããç©äœããã©ã€ããã,æ¶ããŠããŸã£ãã,ïŒå°é¢ã®ãã¯ã¹ãã£ã¯ããã©ã«ãã®ã³ã³ã¯ãªãŒãã®ãããªãã®ã䜿çšããŠããã®ã§ããïŒç»é¢ãå šãŠç°è²ã«ãªã£ããããŸã.
ãã以äžè¿ã¥ããŠã¯ãããªã,ã¿ãããªå¶çŽãããã®ã§ããããïŒ
çŸåšã¯drawsutffå ,OPenGLã®å ã®glFrustum()ãšãã颿°ãæªããã®ã§ã¯ãªããïŒãšèã,æžãå€ããŠã¿ãŸããã,ãã¡ãã¯ããã§vs2008å ã®demoããã°ã©ã ã«ã¯åæ ãããã®ã§ãã,èªèº«ã®ããã°ã©ã ã«ã¯åæ ãããŠãªãã»ã»ã»ãšãããããªç¶æ³ã§ã.
ãŸãšãŸããªãæç« ã«ãªã£ãŠããŸããŸããã,ããããããããããŸã.
kiuiããïŒ
確ãã«ïŒglFrustumã¯drawstuffã§ä»¥äžã®ããã«ãªã£ãŠããŠïŒvnearã0.1fãªã®ã§ïŒããããè¿ããšããã¯èŠããªããªããŸããïŒ
const float vnear = 0.1f;
const float vfar = 100.0f;
const float k = 0.8f; // view scale, 1 = +/- 45 degrees
if (width >= height) {
float k2 = float(height)/float(width);
glFrustum (-vnear*k,vnear*k,-vnear*k*k2,vnear*k*k2,vnear,vfar);
}
else {
float k2 = float(width)/float(height);
glFrustum (-vnear*k*k2,vnear*k*k2,-vnear*k,vnear*k,vnear,vfar);
}
ãªãïŒdrawstuffã®ãã¯ã¹ãã£ã¯256×256ãã¯ã»ã«ã§2×2åäœè·é¢ã§ãïŒODEæ¬ã§ã¯SIåäœç³»ã䜿ã£ãŠããŠ2x2mã®é åã256×256ãã¯ã»ã«ã§è¡šçŸããŠããŸãïŒ
vnearãå°ããªå€ã«ããŠãïŒãã¯ã¹ãã£ã®ç²åºŠãšæ¯èŒããŠåæ±ãå°ããããã®ã§ïŒãã¯ã¹ãã£ã®èŠãæ¹ã¯ãããããªããšæããŸãïŒ
ODEèªäœã¯SIåäœç³»ã§ãªããŠãããã®ã§ïŒïŒåäœè·é¢ãäŸãã°0.001mmãªã©ãšèããŠãµã€ãºã倿ŽããŠã¿ãŠã¯ãããã§ããããïŒ
ãŸãïŒvs2008å ã®demoããã°ã©ã ã«åæ ããããïŒèªèº«ã®ããã°ã©ã ã«åæ ãããªããšããããšã¯èãã¥ããã§ãïŒèªèº«ã®ããã°ã©ã ãdemoããã°ã©ã ãšåããšããã«çœ®ãïŒode-0.11.1\build\premake4.luaã«èªèº«ã®ããã°ã©ã åã远å ãïŒpremake, buildããŠã¿ãŠã¯ãããã§ããããïŒ
ã§ã
床ã è¿ä¿¡ãé ããªã£ãŠç³ãèš³ãããŸãã.
èšãèš³ããããŠããã ãããªã,å®ã¯åæ¥ç ç©¶ã§ODEã䜿ã£ãŠç ç©¶ãããŠãããŸã.
ãã®æåºã®æéãè¿«ã£ãŠããŠããŸã,çµå±ãã¿ãã¿ãé ããŠããŸããããªå§æ«ã§ãããŸã.
æ¬æ¥ã¯,èªèº«ã§è§£æ±ºãããªããã°ãªããªããšãããªã®ã§ãã…
ç§ã®ç ç©¶ã¯,çç©ã®ã·ãã¥ã¬ãŒã¿ãäœè£œãéåã®ã¡ã«ããºã ãªã©ãè§£æããããšããã®ãç®çã§,倧ãããå€ãã£ãŠããŸãã°ç©äœã®å¯åºŠãæ £æ§ãåäœãå€ãã£ãŠããŸãã,ãªãºã ãåãèªäœãå€åã,çç©ã®åãã®è§£æã«ãªãããã®ãïŒãšããæžå¿µããã,å®å¯žãµã€ãºã§ã€ãããšãããããªãšããã«ãã ãã£ãŠããŸãã.
2x2mã®é åã256Ã256ãã¯ã»ã«ãšããããšã§ãã®ã§,ãã¯ã»ã«ã®è¡šç€ºéçãŸã§è¿ã¥ããŠããŸã£ãã®ã§ã¯ãªããïŒãšããèãã«éããŸãã.
ããã,ïŒæéã®ãªã®ãªãªã®ã§ïŒãã£ãããããŠéãã¹ã±ãŒã«ã倿Žãäœè£œïŒçç©ã®ïŒéšåã®æåã確èªïŒãããšããæ¹åã§ïŒä»åã¯ïŒåé¿ããããšã«ããŸãã.
ãŸã,åæ ãããªããšããåé¡ã¯ããã°ã©ã ã眮ãå ŽæãééããŠãããããªã®ã§,ãããäºã€ã®åé¡ã¯æéããããšãã«è§£æ±ºãããŠããããšèããŠããŸã.
é·ããªã£ãŠããŸããŸããã,ãå¿ãããšããåçããããšãããããŸã.
KiuiããïŒ
ãäºãå¿ãããšæããŸãã®ã§è¿ä¿¡ã®é ããŠãåé¡ãªãã§ãïŒ
åç ã®ã圹ã«ç«ãŠãŠããããã§ãïŒçºè¡šäŒé 匵ã£ãŠãã ãããïŒ
ã§ã
å£ã«è¿ã¥ãããåŸéããããã°ã©ã ã«ã€ããŠæããŠãã ããã
Sakumaããã
ãã¿ãŸãããODEã®è³ªåã ãã«éãããŠãã ããã
ããããããã°ã©ã å šè¬ã®è³ªåã§ããšãç¯å²ãèšå€§ã§åéãã€ããªããªããŸãããã
ã§ã
å£ã«è¿ã¥ããŸã§çŽé²ãïŒå£ã«è¿ã¥ãããåŸéããèªåŸç§»åããããã³ã³ãããŒã©ãå·Šå£æ²¿ãè¡åãè¡ããããªã³ã³ãããŒã©ã«ããã°ã©ã ãä¿®æ£ããã
Sakumaãã
ãªã³ãŽã®èœäžã®ããã°ã©ã ã«dBodyGetForceãšèšã颿°ãå ¥ããšãprintfã§ãããããªãã§å šéšzeroã«ãªããŸãïŒ
ã©ããæããŠãã ããã
ãã¿ãŸãããåã¯ãã®ããšã«ã€ããŠå šç¶ããããŸããã
Sophieãã
éåãææåãdBodyGetForceã§ååŸã§ããŸããã以äžã®ããŒãžãã芧ãã ããã
http://groups.google.com/group/ode-users/browse_thread/thread/b61e5d8a1c59a52f/0d8459bf8a710c24?lnk=gst&q=dBodyGetForce#0d8459bf8a710c24
bodyã«åãåã¯ä»¥äžã®åŒã§èšç®ããããä»ã¯ãããŸããã
質é x å é床 / ã¹ããããµã€ãº
ãããèœäžã®ããã°ã©ã ã«è¿œå ãããšæ¬¡ã®ããã«ãªããŸãã
static void simLoop (int pause)
{
dReal step_size = 0.01;
const dReal *pos,*R,*force,*v;
static dReal a[3], f[3], v_prev[3];
dWorldStep(world, step_size);
v = dBodyGetLinearVel(ball);
for (int i =0; i < 3; i++ )
{
a[i] = (v[i] – v_prev[i])/step_size;
v_prev[i] = v[i];
f[i] = mass * a[i];
}
printf(“fx=%f fy=%f fz=%f\n”,f[0],f[1],f[2]);
dsSetColor(1.0,0.0,0.0);
pos = dBodyGetPosition(ball);
R = dBodyGetRotation(ball);
dsDrawSphere(pos,R,radius);
}
ã§ã
3åã®ç©äœã®åæäœçœ®ã¯ïŒç©äœå士ãéãªããã®æã®æžãæ¹ã¯ãif (n>0) ã§ããããã®ã§ããã
Sakumaããã
ãã¿ãŸãããæå³ãããããŸãããif (n>0)ã¯ã©ã®é¢æ°å ã§ãnã¯æ¥è§Šç¹æ°ã§ããïŒãåæäœçœ®ã¯dBodySetPositionã§èšå®ããã°è¯ãã ãã§ããã
ã§ã
â ODEã§çŽæ¹äœã2åçæããã
â¡2åã®åæäœçœ®ã¯ïŒçŽæ¹äœå士ãéãªããïŒå°é¢ã«æ¥ããŠããªãããšãšããã
â¢2åã®çŽæ¹äœã®è²ãèµ€ïŒçŽæ¹äœ1ïŒãšéïŒçŽæ¹äœ2ïŒãšããã
â£çŽæ¹äœ1ã¯ïœè»žæ¹åã«é·ãïŒçŽæ¹äœ2ã¯ïœè»žæ¹åã«é·ããªãããã«å€§ãããèšå®ãããâ»è³ªéã¯ïŒä»»æã«èšå®ããŠè¯ãã
â€çŽæ¹äœ1ã¯å°é¢ã§åŒŸãŸãªãããã«ïŒçŽæ¹äœ2ã¯å°é¢ã§åŒŸãããã«èšå®ããã
ãã®ãããªããã°ã©ã ãœãŒã¹ã³ãŒãã®äŸãæããŠãã ããã
ãããŸã§åºæ¥ãŠããã®ã§ããããã®å ããé²ã¿ãŸãã
#include
#include
#ifdef dDOUBLE
#define dsDrawSphere dsDrawSphereD
#define dsDrawBox dsDrawBoxD
#define dsDrawCylinder dsDrawCylinderD
#define dsDrawCapsule dsDrawCapsuleD
#define dsDrawLine dsDrawLineD
#define dsDrawTriangle dsDrawTriangleD
#endif
static void nearCallback(void *data, dGeomID o1, dGeomID o2);
static void simLoop(int pause);
void start();
void setDrawStuff();
static void makeSphere(dReal m, double r, double *position);
static void makeBox(dReal m, double *sides, double *position);
static void makeCapsule(dReal m, double r, double l, double *position);
typedef struct {
dBodyID body;
dGeomID geom;
double m;
double l,r;
double sides[3];
} MyObject;
dWorldID world;
dSpaceID space;
dGeomID ground;
dJointGroupID contactgroup;
MyObject sphere;
MyObject box;
MyObject capsule;
dsFunctions fn;
int main(int argc, char **argv)
{
dReal m1 = 1.0;
double r1 = 0.2;
double p1[3] = {0.0, 0.06, 1.0};
dReal m2 = 1.0;
double sides[3] = {0.1,0.3,0.5};
double p2[3] = {0.01, 0.06, 2.0};
dReal m4 = 0.1;
double r4 = 0.1;
double l4 = 0.1;
double p4[3] = {0.0, 0.06, 3.0};
setDrawStuff();
dInitODE();
world = dWorldCreate();
dWorldSetGravity(world,0,0,-9.8);
space = dHashSpaceCreate(0);
contactgroup = dJointGroupCreate(0);
ground = dCreatePlane(space,0,0,1,0);
makeSphere(m1, r1, p1);
makeBox(m2, sides, p2);
makeCapsule(m4, r4, l4, p4);
dsSimulationLoop(argc,argv,640, 480,&fn);
dSpaceDestroy(space);
dWorldDestroy(world);
dCloseODE();
return 0;
}
void start()
{
static float xyz[3] = {2.0,0.0,2.0};
static float hpr[3] = {-180, -45, 0};
dsSetViewpoint(xyz,hpr); }
void setDrawStuff()
{
fn.version = DS_VERSION;
fn.start = &start;
fn.step = &simLoop;
fn.path_to_textures = “../../drawstuff/textures”;
}
void simLoop(int pause)
{
dSpaceCollide(space,0,&nearCallback);
dWorldStep(world,0.01);
dJointGroupEmpty(contactgroup);
dsSetColor(1.0,0.0,0.0);
const dReal *pos1 = dBodyGetPosition(sphere.body);
const dReal *R1 = dBodyGetRotation(sphere.body);
dsDrawSphere(pos1,R1,(const float)sphere.r);
dsSetColor(0.0,1.0,0.0);
const dReal *pos2 = dBodyGetPosition(box.body);
const dReal *R2 = dBodyGetRotation(box.body);
dsDrawBox(pos2,R2,box.sides);
dsSetColor(0.0,0.0,1.0);
const dReal *pos4 = dBodyGetPosition(capsule.body);
const dReal *R4 = dBodyGetRotation(capsule.body);
dsDrawCapsule(pos4,R4,(const float)capsule.l,(const float)capsule.r); }
static void nearCallback(void *data, dGeomID o1, dGeomID o2) {
static const int N = 10;
dContact contact[N];
int n = dCollide(o1,o2,N,&contact[0].geom,sizeof(dContact));
//if (isGround) { ããããã
if (n>0) {
for (int i = 0; i < n; i++) {
contact[i].surface.mode = dContactBounce;
contact[i].surface.bounce = 0.5;
contact[i].surface.bounce_vel = 0.0;
contact[i].surface.mu=1.0;
dJointID c = dJointCreateContact(world,contactgroup,
&contact[i]);
dJointAttach(c,dGeomGetBody(contact[i].geom.g1),
dGeomGetBody(contact[i].geom.g2));
}
}
}
static void makeSphere(dReal m, double r, double *position){
dMass mass;
sphere.body = dBodyCreate(world);
dMassSetZero(&mass);
dMassSetSphereTotal(&mass,m,r);
dBodySetMass(sphere.body,&mass);
dBodySetPosition(sphere.body,position[0],position[1],position[2]);
sphere.r = r;
sphere.geom = dCreateSphere(space,sphere.r);
dGeomSetBody(sphere.geom,sphere.body); }
static void makeBox(dReal m, double *sides, double *position){
dMass mass;
box.body = dBodyCreate(world);
dMassSetZero(&mass);
dMassSetBoxTotal(&mass,m,sides[0],sides[1],sides[2]);
dBodySetMass(box.body,&mass);
dBodySetPosition(box.body,position[0],position[1],position[2]);
box.sides[0] = sides[0];
box.sides[1] = sides[1];
box.sides[2] = sides[2];
box.geom = dCreateBox(space,box.sides[0],box.sides[1],box.sides[2]);
dGeomSetBody(box.geom,box.body); }
static void makeCapsule(dReal m, double r, double l, double *position){
dMass mass;
capsule.body = dBodyCreate(world);
dMassSetZero(&mass);
dMassSetCapsuleTotal(&mass,m,3,r,l);
dBodySetMass(capsule.body,&mass);
dBodySetPosition(capsule.body,position[0],position[1],position[2]);
capsule.r=r;
capsule.l=l;
capsule.geom = dCreateCapsule(space,capsule.r,capsule.l);
dGeomSetBody(capsule.geom,capsule.body);
}
takayuki-fããïŒ
埡質åã¯ãªãã§ããããïŒ
åããªãã®ã§ãœãŒã¹ã³ãŒããèŠãŠçŽããŠæ¬²ãããšããåŸ¡èŠæã¯ïŒããããç«ãŠèŸŒãã§ããã®ã§å¯Ÿå¿ã§ãããã«ãããŸããïŒ
ãã¿ãŸããïŒ
å ·äœçã«ã¯â ããâ£ãŸã§ã®ãã¡ïŒã©ããã§ããªããŠïŒäœãããããªãã®ã§ããããïŒ
ã§ã
ãããªãã§ãã¿ãŸããã
â£ã®æãã§ããªããŠå°ã£ãŠããŸãã
çãäœã£ãŠãäžã®ããã°ã©ã ã§ã¯ã貫éããŠããŸããç©äœå士ãè¡çªããæã¯åŒŸã¿ïŒç©äœãšå°é¢ãè¡çªããæã¯åŒŸãŸãªãããã«èšå®ããããšãã§ããŸããã
ãããããé¡ãããŸãã
nearCallback颿°ã®åŒæ°o1ãšo2ã«è¡çªããå¯èœæ§ã®ãããžãªã¡ããªIDãå ¥ããŸãïŒããã«ããå ŽåããããŠãã ããïŒäŸãã°ïŒä»¥äžã®ããã«ãªããŸãïŒ
int isGround = ((ground == o1) || (ground == o2))
if (isGround)
{
匟ãŸãªãèšå®ã«é¢ããã³ãŒããæžã
}
else
{
匟ãèšå®ã«é¢ããã³ãŒããæžã
}
ããã§è§£æ±ºããã°è¯ãã®ã§ããïŒïŒïŒ
ã§ã
â ODEã§çã1åïŒçŽæ¹äœã1åïŒã«ãã»ã«ã1åçæãããâ»å€§ããïŒè³ªéã¯ïŒä»»æã«èšå®
â¡3åã®ç©äœã®åæäœçœ®ã¯ïŒç©äœå士ãéãªããïŒå°é¢ã«æ¥ããŠãªãïŒã·ãã¥ã¬ãŒã·ã§ã³éå§åŸã«è¡çªãããããªå Žæãšããã
â¢çã®è²ãèµ€ïŒçŽæ¹äœã®è²ãç·ïŒã«ãã»ã«ãéãšããã
â£ç©äœå士ãè¡çªããæã¯åŒŸã¿ïŒç©äœãšå°é¢ãè¡çªããæã¯åŒŸãŸãªãããã«èšå®ããã
ç©äœå士ãè¡çªããæã¯åŒŸã¿ïŒç©äœãšå°é¢ãè¡çªããæã¯åŒŸãŸãªãããã«èšå®ããããšãããããããŸãããã©ããæããŠãã ããã
nearCallback颿°ã®åŒæ°o1ãšo2ã«è¡çªããå¯èœæ§ã®ãããžãªã¡ããªIDãå ¥ããŸãïŒããã«ããå ŽåããããŠãã ããïŒäŸãã°ïŒä»¥äžã®ããã«ãªããŸãïŒ
int isGround = ((ground == o1) || (ground == o2))
if (isGround)
{
匟ãŸãªãèšå®ã«é¢ããã³ãŒããæžã
}
else
{
匟ãèšå®ã«é¢ããã³ãŒããæžã
}
ããã§è§£æ±ºããã°è¯ãã®ã§ãã匟ãŸãªãèšå®ã«é¢ããã³ãŒããšåŒŸãèšå®ã«é¢ããã³ãŒããæããŠãã ããã
çãã¯èŠã€ãããŸãããã
çããèŠã€ããã®ã¯ç§ã§ã¯ãªããšæããŸãã…
匟ãŸãªãèšå®ã¯ãåçºä¿æ°ãïŒã«ããã°è¯ããšæããŸãã
åçºä¿æ°ã®èšå®æ³ã¯ãã®ããã¥ã¢ã«ãšæèã«æžããŠãããŸããã
ã§ã