ODEè¬åº§ïŒïŒHello World ! ããã«ã¡ã¯ã·ãã¥ã¬ãŒã·ã§ã³ã®äžç
ããããå¿ãããŠååããïŒé±éãçµã£ãŠããŸããŸããããä»åã¯ODE(Open Dynamics Engine)ã䜿ã£ãè¶ ç°¡åãªãµã³ãã«ããã°ã©ã ã玹ä»ããŸããããã°ã©ãã³ã°ã®æç§æžã§ã¯åãã®äŸé¡ã¯Hello Worldãå®çªã§ããããã§ãããããŸãããã

äžã®ç»åã¯ãã®ã¹ã¯ãªãŒã³ã·ã§ããã§ããã³ã¡ã³ãä»ãœãŒã¹ã³ãŒãã以äžã«ç€ºããŸãã
// Hello Worldããby ã§ã
#include ãããããããã// ODEçšããããŒãã¡ã€ã«
#include ã// æç»çšããããŒãã¡ã€ã«static dWorldID world; ããã// åååŠèšç®çš
dBodyID ball; ããããã // ç
const dReal radius = 0.2, mass = 1.0;ã// çã®ååŸ(m)ãçã®éã(kg)// ã·ãã¥ã¬ãŒã·ã§ã³ã«ãŒã æ¯ååŒã³åºããå®è¡ãããŸãã
// åååŠèšç®ã¯ã¹ããããµã€ãºã ããããã§æå®ããã°èªåçã«èšç®ãããŸãã
// ãã ããæç»ã¯ããã§æžããªããšäœã衚瀺ãããŸããã
static void simLoop (int pause)ã{
ãconst dReal *pos,*R;ãdWorldStep(world,0.05);ãã// ã·ãã¥ã¬ãŒã·ã§ã³ã®ã¹ããããµã€ãºã決ãã
ã
ãdsSetColor(1.0,0.0,0.0);ããããããã// èµ€è²ã®ã»ãã
ãpos = dBodyGetPosition(ball);ãã// çã®äœçœ®ãååŸ
ãR = dBodyGetRotation(ball);ãã// çã®å§¿å¢ãååŸ
ãdsDrawSphereD(pos,R,radius);ããã//èµ€çãæç»
}void start()ã{ãã//ãã«ã¡ã©ã®èšå®
ãstatic float xyz[3] = {0.0,-3.0,1.0}; ã// èŠç¹ã®äœçœ® (m)
ãstatic float hpr[3] = {90.0,0.0,0.0};ããã// èŠç·ã®æ¹å
ãdsSetViewpoint (xyz,hpr);ãããããããã// èŠç¹ã®èšå®
}// ã¡ã€ã³é¢æ°ãããããèªãã§ãã ããã
int main (int argc, char **argv)ã{
ãdReal x0 = 0.0, y0 = 0.0, dReal z0 = 1.0; // ããŒã«ã®åæäœçœ®
ãdMass m1;ã// æç»APIïŒãããŒã¹ã¿ããïŒã®ããŸããªã
ãdsFunctions fn;ãããããããã//ããããŒã¹ã¿ããçšã®ã¯ã©ã¹
ãfn.version = DS_VERSION;ã // ãããŒã¹ã¿ããã®ããŒãžã§ã³
ãfn.start = &start;ãããããã// ãã·ãã¥ã¬ãŒã·ã§ã³ã®ååŠç颿°
ãfn.step = &simLoop;ãããã// ã·ãã¥ã¬ãŒã·ã§ã³ã®åã¹ãããã§åŒã°ãã颿°
ãfn.command = NULL;ãããã // 颿°ããªãã®ã§NULLãã€ã³ã¿ãæå®
ãfn.stop ãã = NULL;ãããã// 颿°ããªãã®ã§NULLãã€ã³ã¿ãæå®
ãfn.path_to_textures = “../../drawstuff/textures”;ã//ããã¯ã¹ãã£ãžã®ãã¹ã// åååŠèšç®çšäžçã®åµé
ãworld = dWorldCreate();ãããããã
ãdWorldSetGravity(world,0,0,-0.001);ã// éåå é床ã-0.001 m/s^2ã//ãçãäœã
ãbody = dBodyCreate(world); ãããããã // çã®è£œäœ
ãdMassSetZero(&m1);ããããããããããããã// æ§é äœm1ã®åæå
ãdMassSetSphereTotal(&m1,mass,radius);ã// æ§é äœm1ã«çã®éããèšå®
ãdBodySetMass(ball,&m1);ãããããããããã// çã«m1ãèšå®
ãdBodySetPosition(ball, x0, y0, z0);ããããã// çã®äœçœ®ãèšå®ã// ã·ãã¥ã¬ãŒã·ã§ã³æ¬äœ
ãdsSimulationLoop (argc,argv,352,288,&fn);ã// ãŠã€ã³ããŠã®ãµã€ãºã352 x 288ã// äžçã®ç Žå£
ãdWorldDestroy (world);ãreturn 0;
}
ããã¯èµ€çã®èªç±èœäžã®ããã°ã©ã ã§ããããããªãHello Worldããšãããšãäžã®ãœãŒã¹ã³ãŒãã§worldã¯åååŠèšç®ãããäžçã®ããšã§ããåååŠèšç®ã®Worldã«åããŠãç®ã«ããã£ãã®ã§ãã®ã³ãŒããHello WorldãšåŒã¶ããšã«ããŸãããã
ãŸããå°æåã®dã§å§ãŸã颿°ã¯ODEã®API(application interface)ã§ãdsã§å§ãŸã颿°ã¯drawstuff(ãããŒã¹ã¿ããïŒã®APIã§ããdrawstuffã¯ODEä»å±ãã¹ãããã°ã©ã 衚瀺çšã®ã©ã€ãã©ãªã®ããšã§ãã
説æã¯ãã®ãããã«ããŠãã®ãã¡ã€ã«ãããŠã³ããŒãããŠä»¥äžã®æé ã§å®è¡ããŠã¿ãŸãããïŒã
å®è¡æ¹æ³
1. sample1.tgzã/home/ãŠãŒã¶å/src/ode/odeã®äžã«ããŠã³ããŒã
2. ããããã¯ã¿ãŒããã«ã§ä»¥äžã®ã³ãã³ããå®è¡ããŠãã ããã$ã¯ããã³ããã§ãã
ãã$ cd /home/ãŠãŒã¶å/src/ode/ode
ãã$ tar xvzf sample1.tgz
ãã$ cd sample1
ãã$ make
3. å®è¡
ãã$ ./sample1
èµ€çããã£ããèœäžããŠãããŸããããªããšå°é¢ãéãæããŠæ¶ããŠããŸããŸãã
å®ã¯äžã®ããã°ã©ã ã«ã¯è¡çªæ€åºæ©èœãçµã¿èŸŒãŸããŠããªãã£ãã®ã§ãã
次åïŒïŒïŒæïŒïŒæ¥ç®æšïŒã¯ãã®ããã°ã©ã ã«è¡çªæ€åºæ©èœãçµã¿èŸŒã¿ãŸãã
mashuãã
ãã®ODEè¬åº§ïŒã¯mingwã«å¯Ÿå¿ããŠããªãã®ã§ïŒæ°ããODEè¬åº§ïŒãããããã ããïŒ
ãããŸãïŒLinuxã«è©³ãããªããã®ã§ã»ã»ã»
sample1ãmakeããã®ã§ããïŒããŸããããŸããïŒ
Mingwã䜿ã£ãŠããã®ã§ããïŒãããåå ã§ããããïŒïŒ
error㯠cannot find -lode
ãšãªã£ãŠããŸãïŒ
ããããã«ãªããŸãããïŒé£çµ¡ããé¡ãããŸãïŒ
ããã§ãããçéãã§ãããããããŸããïŒïŒŸïŒŸïŒ
ODEã«é¢ããŠã®è³ªåãããããããããããããŸãããã
ãã®éã¯ãããããé¡ãããŸããïœïŒïŒ¿ïŒ¿ïŒïœ
çç²ã®ã¹ããŒã€ãŒããããã³ãã³ã³ã¡ã³ãããããšãããããŸããç ç©¶ã®çžè«ã«ã¯ä¹ããªããšæããŸããæ åœã®å çãšãããçžè«ãããæ¹ãè¯ãã®ã§ã¯ïŒã§ããã«ã€ããŠããããªãããšãããã°ãŸãé æ ®ãªã質åããŠãã ããã
貎éãªã³ã¡ã³ãïŒã¢ããã€ã¹ïŒãæ¬åœã«ããããšãããããŸãïŒïœïŒïŒ¿ïŒ¿ïŒïœ åãå®ã¯èªåã®ç ç©¶ãODEã«ãããããããåŒã£ããã£ãŠã¯ããã®ã§ãããã
èªåã®ç ç©¶ãšããŠã¯ãå®éã®äžçã§äœæããã¹ããŒã®ã¢ãã«ã®ã¹ããŒæ¿ãåäœïŒããã¿ãªãïŒã§ãã£ãã®ã§ãåäœãåãæ±ããã£ãŠãããšããã¯ããããã倧äžå€«ããªãšã¯æã£ãŠããŸããïŒïŒŸïŒŸïŒ
ãããããèšç®ç²ŸåºŠãé«ããªããããåååŠèšç®ã©ã€ãã©ãªã ãã§ããããšãããšãããããããããåŒã£ãããããªããšã¯æã£ãŠããŸããã
çŸåšã¯ããã®ODEãé©çšã§ãããã©ãããèŠããããããã°ã©ã ã«æ £ãããããšèšãçç±ããODEãé 匵ã£ãŠãããšããã§ãã
ãã£ãšè©³ããå 容ãèšã£ãŠãODEã«è©³ããã§ãããã«çžè«ã«ä¹ã£ãŠæ¬²ãããšããã§ããããã以äžã¯åŸ¡æ³åºŠã§ããïŒïŒïŒïŒïŒïŒããã話ã ãã§ãèããŠãã ãããªããèªåã®ãããããšïŒåæ¥è«æçïŒããŸãšããŠéã£ãŠã¿ãããšæããŸãããã
èªåããã質åå 容ã§ããããè§£çããããšãããããŸãïŒ
ä»ããããã¥ã¢ã«ã®ã10ïŒ7ïŒ6ç¯ãTriangle Mesh Classããš
~/src/ode-0.5/ode/test/test_trimesh.cppããæŽã«æ·±ãèªãã§ã¿ãŸãïŒïŒ
ããã§ã¯å€±ç€ŒèŽããŸãïŒ
çç²ã®ã¹ããŒã€ãŒããã質åããããšãããããŸãã
ODEã¯åäœã®åååŠèšç®ã©ã€ãã©ãªãªã®ã§ãããªããããããã¹ããŒã®ã·ãã¥ã¬ãŒã·ã§ã³ã«åããŠãããã©ããããããããŸãããã¹ããŒã«ã¯æµäœååŠã®èšç®ã¯å¿ èŠãªãã®ã§ããããïŒãŸããã¹ããŒæ¿ã¯åäœã§ã¯ãããŸãããããèšç®ç²ŸåºŠãé«ããªããšããç¹ããå¿ããªãã
ããŠãèªåã§ãžãªã¡ããªã¯ã©ã¹ãäœã£ãŠãã§ãããšæããŸãããäžçªç°¡åãªæ¹æ³ã¯TriangleãMeshãClassã䜿ãããšã ãšæããŸãããã®ããã«ã¯ãODEãmakeããéã«user-settingsã®PRECISION=SINGLEã«ããäžçªäžã®è¡ã«ãã#OPCODE_DIRECTORY=OPCODEãã³ã¡ã³ãã¢ãŠãããŸãã
Triangle Mesh Classã®äœ¿ãæ¹ã¯~/src/ode-0.5/ode/test/test_trimesh.cppãèªãã°ããããšæããŸãããŸããã¹ããŒæ¿ã®ããªãŽã³ãïŒïŒ€ã®ãªãŒãµãªã³ã°ãœããã§äœæããå¿ èŠããããŸãã
ããã«ã¡ã¯ïŒ
ãŸããŸããçç²ã®ã¹ããŒã€ãŒã§ãã
ä»åã¯äžã€è³ªåããããŸããŠãæçš¿ãããŠããããŸããïŒïŒŸïŒŸïŒ
çŸåšåŠæ ¡ã§ã¹ããŒããããã®ã·ãã¥ã¬ãŒã·ã§ã³ãšããŠã
ãã®ODEã䜿çšããŠããŸãã
ã·ãã¥ã¬ãŒã·ã§ã³ãšããŠãèŽäœéšåçã¯
ã§ãããã®ODEè¬åº§ã®ãããã§æãããšãã§ããŸãããïŒïŒŸïŒŸïŒ
ããããçŸåšã©ãããŠãã¹ããŒæ¿ïŒæ²çååŸçïŒã
æãããšãã§ããªãç¶æ ã§ãã
ïŒBOXãçäœãã·ãªã³ãçã¯æãããšãã§ããŸããïŒ
ããããä»å±ã®ããã¥ã¢ã«ã®
10ïŒ8ã®ãUser defined classesããé§äœ¿ããã°
ã·ãã¥ã¬ãŒã·ã§ã³ã§ããããªã£ãŠæã£ãŠããšããã§ãã
æãããç©äœã¯ãçŸå®äžçã§çŸåšäž»æµã®
ãã«ãŒãã³ã°ã¹ããŒãã§ãã
ïŒã¹ããŒæ¿ã®ãµã€ãã«æ²çååŸãæã£ãã¹ããŒæ¿ã®ããšã§ãïŒ
ãããæ»ãããŠãããããããŒã¿ãåãããšæã£ãŠããŸãã
ããã§è³ªåãªã®ã§ããããã®ãããªè€éãªç©äœãæããšãã¯ã
10ïŒ8ç¯ã§èŠããšããã¯ãã£ãŠãŸãã§ããããïŒ
äžå¿ãä»å±ããã¥ã¢ã«ã®10ïŒ8ç¯ã®è±èªãå šãŠãèš³ããŠã¿ããã§ããã
ãŸãèªåèªèº«åã£ãŠãã確信ã§ããªããŠã»ã»ã»ïŒïŒŸïŒŸïŒ
ããããããã£ããããæéã®ããæã«ã§ããææãé¡ãããŸããïœïŒïŒ¿ïŒ¿ïŒïœ
çç²ã®ã¹ããŒã€ãŒãããã³ã¡ã³ãããããšããããŸããã³ã¡ã³ãããããšé£èŒãç¶ããæ°ã«ãªããŸãã
ééããããããªãããšãããã°ã³ã¡ã³ããã ãããæ¬¡åã¯è¡çªæ€åºã«ã€ããŠæžããŸããïŒïŒæïŒïŒæ¥ãŸã§ã«ã¯æ²èŒããäºå®ã§ãã
Open Dynamics Engineè¬åº§ããã€ã楜ããæèŠãããŠããã£ãŠããŸãã
åŠæ ¡ã§ãOpen Dynamics Engineãã䜿ãããšã«ãªã£ãã®ã§ããã
ãããããã°ã©ã ãèŠãŠå匷ããŠããå®éã«èªåã§æžããšãªããšã»ã»ã»ã
ã£ãŠæãã ã£ãã®ã§ãå人çã«éåžžã«å©ãã£ãŠãããŸããããïŒïŒŸïŒŸïŒ
ãŸããæèŠãããŠããããŸãïŒïŒé 匵ã£ãŠãã ããïŒ
ïŒãªããåæãªããšèšã£ãŠãããŸããïŒ