ODE質åã»èŠæåé4!
æ°ãã質åãèŠæã¯ãã¡ãã«ãé¡ãããŸãïŒ
ãªããç§ã®ã³ã¡ã³ãããèªåã®åªåã«ããåé¡ã解決 ãããå Žåã«ãåé¡ã®åå ããããã°æçš¿ããŠé ããšå€§å€å©ãããŸãããã®æ å ±ã¯ODEã®åå¿è ã«ãšã£ãŠéèŠãªãã®ã§ããããçšåºŠããŸããŸãããFAQã«æ²èŒããããšæããŸãã®ã§ãååã®ã»ã©ãããããé¡ãããŸãã
ã§ããã
ãœã£ããŒã§ã
ãªãã»ã©çè§£ã§ããŸããïŒ
ãå¿ãããšããïŒããããšãããããŸããïŒ
ããã¿ãŒããã
dParamFMaxã宿°ã§ããå¿ èŠã¯ãããŸãããODEã«ä»å±ããŠããdemoã®ã³ãŒãã§ã¯å€æ°ã«ãªã£ãŠãããšæããŸããODEæ¬ã§ã¯éãäœçœ®å¶åŸ¡ãããã®ã§å€§ããªå®æ°ã®å€ã«ããŠããŸãã
ããã¿ãŒããã®ãææã®ãšããdParamVelãšdParamFMaxã¯ææãšããŠäžããããŸããïŒè§ïŒé床ãå¶çŽãšããŠå ¥ã£ãŠããŠããã®ã§åçŽãªãã«ã¯å¶åŸ¡ã«ãªããªããšèããŸããããããdParamFMaxã¯æå€§çºæ®ã§ãããã«ã¯ïŒæå€§å€ïŒãªã®ã§ãã«ã¯å¶åŸ¡ã¯é£ããã§ãããã
ãžã§ã€ã³ãã«å èãããŠããã¢ãŒã¿ã¯ãdParamVelã®è§é床ãŸãã¯é床ã«ãªãããã«æå€§dParamFMaxã®ãã«ã¯ãŸãã¯åãå ããåããããŸãããªããdParamVelãšdParamFMaxã¯ãã³ãžãžã§ã€ã³ãã®å Žåãè§é床ãšãã«ã¯ã§ãã¹ã©ã€ããžã§ã€ã³ãã®å Žåãé床ãšåã«ãªããŸãã
ãªãã詳现ã«ã€ãã¯ä»¥äžã®ãµã€ããã芧ãã ããã
http://www.ode.org/joints.pdf
ã§ããã
ãœã£ããŒã§ãïŒ
ãããã«ODEæ¬ã®p.32-33ã«æžããŠãããŸããïŒ
ããèªãŸãã«è³ªåããŠããŸããïŒ
ãå¿ãããšããç³ãèš³ãããŸããïŒ
dJointSetHingeParam()ã§ããïŒdParamFMaxã宿°ã§ããå¿ èŠã¯ãããŸããïŒ
ãããæ¯åèšç®ããŠäžãããšãã«ã¯å¶åŸ¡ã«ïŒïŒïŒãªããŸããïŒ
ãããããœãŒã¹ãèªãã æãã§ã¯ïŒdParamVelãšdParamFMaxã¯
ã©ã¡ããå éšã®ã¢ãŒã¿ã®ãªããã¿ãšããŠäžããããŠãããããªæ°ãããŸãïŒ
ããã¿ãŒããã
ãã²ããã¶ãã
ODEæ¬ã®P32,33ããŒãžã«èšèŒããŠããŸããã
dJointSetHingeParam() ã¯é床å¶åŸ¡ã
dJointAddHingeTorque()ã¯ãã«ã¯å¶åŸ¡
ã«äœ¿ããŸãã
ãªããdJointAddHingeTorque()ã¯ä»¥äžã®ãœãŒã¹ã³ãŒãã®ããã«ãããã£ã«ãã«ã¯ãå ããŠããã ãã§ããODEã¯ãªãŒãã³ãœãŒã¹ãªã®ã§ãœãŒã¹ã³ãŒããèªãããšããå§ãããŸãã
void dJointAddHingeTorque (dJointID j, dReal torque)
{
dxJointHinge* joint = (dxJointHinge*)j;
dVector3 axis;
if (joint->flags & dJOINT_REVERSE)
torque = -torque;
getAxis (joint,axis,joint->axis1);
axis[0] *= torque;
axis[1] *= torque;
axis[2] *= torque;
if (joint->node[0].body != 0)
dBodyAddTorque (joint->node[0].body, axis[0], axis[1], axis[2]);
if (joint->node[1].body != 0)
dBodyAddTorque(joint->node[1].body, -axis[0], -axis[1], -axis[2]);
}
ã§ã
ã§ãããïŒ
ãœã£ããŒã§ãïŒ
ãžã§ã€ã³ãã®å¶åŸ¡ã«é¢ãã質åã§ãïŒ
ã§ãããã®ãµã³ãã«ããã°ã©ã ã§ïŒè»èŒªã®ãã³ãžãžã§ã€ã³ããå¶åŸ¡ããéã«
dJointSetHingeParam()
ã䜿çšããŠãããšæããŸãïŒ
ãããš
dJointAddHingeTorque()
ã䜿çšããã®ãšã§ã¯ïŒäœãç°ãªãã®ã§ããïŒ
ãå¿ããææã ãšæããŸããïŒãããããé¡ãããŸãïŒ
ãæ¥ããããªããå ã»ã©ã®è³ªåã¯ãªãã£ãäºã«ããŠãã ããã
åéãããŠããŸããã
èªä¿¡ã®ããããã°ã©ã ã ã£ãã ãã«åå ãå šããããã質åããŠããŸããŸããã
ãã¿ãŸããã§ãããïŒïŒŸïŒŸïŒïŒ
ããã²ãšã€ãç°¡åïŒå®è·µïŒããããã·ãã¥ã¬ãŒã·ã§ã³ãã®å 容ã§è³ªåããŠãããããã§ããããïŒ
P160ã®å³6.15ãšå³6.16ãªã®ã§ãããïŒèªç±åºŠã®ã¢ãŒã ããããã¯éæ¥ãèŠãã€ã¡ãŒãžãã€ãã¿ãããã®ã§ãããïŒèªç±åºŠãšãªããšã©ããïŒèªç±åºŠç®ã®éæ¥ã§ãã©ããïŒèªç±åºŠç®ã®éæ¥ãªã®ãã€ã¡ãŒãžãã€ãããŸããã
ã€ã¡ãŒãžçã«ã¯å³6.13ã®å 端ïŒïŒèªç±åºŠã®ã¢ãŒã ããããã®å 端ïŒã«ããŒã«ãžã§ã€ã³ãïŒããŒã«ãžã§ã€ã³ãã¯ç¢ºãïŒèªç±åºŠã§ãããïŒïŒããã³ãã®éã«ã¯ããã ãã®ãããã§èšãïŒèªç±åºŠã®ã¢ãŒã ããããã ãšçè§£ããŠãããããã§ããããïŒ
åå¿è ããã
æãå ¥ããŸããããããããžã§ã¯ãã®å ·äœçãªåçã¯ãçãããªãæ¹éã§ããODEã®æè¡çãªè³ªåã«éå®ãããŠãã ããã
çããæãããšãããããžã§ã¯ãã®æå³ããããŸããããããç§ã®çµéšã§ã¯èãã«èãèãæããšäžæè°ã«ããããã®ã§ããé 匵ã£ãŠãã ãããã
ã§ã
ãããããã
ã©ããããããšãããããŸãã
ODEæ¬ã®èª¬æããããã¥ããã£ãã®ãåå ã§ããã
èšãèš³ãããšããŒãžæ°ãéãããŠããã®ã§äžå¯§ã«èª¬æã§ããªãã£ãã®ã§ãã
ãããã¥ããç®æãããã°ãã©ãã©ãèããŠãã ããã
ã§ã
埡è¿çããããšãããããŸãïŒ
æ¬å®¶æ§ãåèã«é 匵ã£ãŠã¿ãããšããããŸãã
ãããã§ãã
ïŒäœãåé¡ã§é¢ç¯äžå¿ç¹ãååŸã§ããªãã£ãã
GetHingeAnchorã§åã£ãŠããå€ãå ã«ç·ãæåãããšãã©ãããžããªå Žæã«æåãããŠããŠã
ïŒåŸããæ°ãã€ãããã§ãããæåãããã³ãžã®é¢ç¯äžå¿ç¹ã®äœçœ®èšå®ãããããã£ãã¿ããã§ããïŒ
ããã§ãæ¬åœã«GetHingeAnchorã¯é¢ç¯äžå¿ç¹ãåã£ãŠãã颿°ãªã®ããšæã£ãŠ
æ¬ã®èª¬æãèªãã§ã¿ããšããããã£1äžã§ã®ã»ã»ããšæžãããŠããŠãæ®éã«èªããšã§ããããèšã£ããããªæå³ã«
ãšããã®ã§ãããæççã«èªãã§ããŸã£ãããã§ïŒãããŸããïŒäžãã座æšçãªæå³ã§ã®äžããæãã®ãã
ãããã£1ã«ãããŠãã®æå³ã§äœ¿ã£ãŠããã®ãããããªããªã£ãŠããŸã£ã次第ã§ãããè¿·æãããããŸããã
ä»P181ã®ãããã6.1ã«åãçµãã§ããŸãã
åã®åªä»å€æ°ãçšããŠã以äžã®ããã°ã©ã ã远å ããã®ã§ãããïŒ-0.25,0.00,1.50ïŒã®äœçœ®ã«ãªã£ãŠããŸãã ãã§ãåè»éãæããŸãããã¢ããã€ã¹ããã³ãããé¡ãããŸãã
/*** åãæã颿° ***/
void ring()
{
float r, th, dth,; //倿°å®çŸ©
dth = 0.01*M_PI; //è§åºŠã®å»ã¿ã«å€ä»£å ¥
r = 0.25; //ååŸã«å€ä»£å ¥
P[1] = 0.0;
for(th = 0.0; th <= 2M_PI; th=th+dth ){ //theta ã0 ãã2Ï ãŸã§
ããP[0] = r * cos(th);
ããP[2] = r * sin(th) + 1.5;
}
}
/*** ããŒå ¥å颿° ***/
void command2(int cmd)
{
switch (cmd) {
case ’1′: ANSWER = 1; break; // 1ããŒãæŒããšå§¿å¢ïŒ
case ‘r’: ring(); break; // åãæã颿°ring()ã®å®è¡
}
}
ãããããã
äœãåé¡ã§é¢ç¯äžå¿ç¹ãååŸã§ããªãã£ããæããŠé ããŸããïŒ
ããããããã¥ãããã€ã³ãã ãšæããŸãã®ã§ã
ã§ã
ã§ããããããããšãããããŸãïŒ
ãããã§è¡šç€ºããããšãåºæ¥ãŸããã
ãµã³ãã«ããã°ã©ã ãŸã§äœã£ãŠããã ããŠæ¬åœã«ãããããã£ãã§ãã
ãžã£ãœãããã
ã¯ãããŸããŠãã質åããããšãããããŸãã
ïŒ¯ïŒ€ïŒ¥ãæ¬å®¶æ§ã®Howtosã«ããHOWTO integrate simulation and visualizationãåèã«ãªããšæããŸãã
http://opende.sourceforge.net/wiki/index.php/HOWTO_integrate_simulation_and_visualization
解決ããŠãããªããŠãçµæãæããŠé ããã°ãããããã§ãã
ã§ã
ã¯ãããŸããŠã
çŸåšãå çã®æ¬ãšãµã€ããåèã«äºè¶³æ©è¡ã«ãã£ã¬ã³ãžããŠãããŸãã
ãµã³ãã«ããã°ã©ã ãkensei,legged,warusapãæ¹è¯ããŠçŸæ®µéã§ã¯
å±ãªã£ããããªãããçŽé²æ©è¡ãããšãããŸã§å®æããŸããã
ããã§è³ªåãªãã§ãããå®è¡ãããšã¹ããŒãã«ãããåºãŠããŸãã®ã§ã…
ïŒå·Šèãæ©ãã¹ã ãŒãºã«åãããšæãã°ãæ¥ã«å³èã¯ãã£ããåããšãã£ããããªïŒ
ãã·ã³ã®èšç®èœåã®åé¡ã§ããããïŒãããšãããã°ã©ã äžã«åé¡ãããã®ã§ããããïŒ
ã¡ãªã¿ã«ããµã³ãã«ããã°ã©ã ã¯ãã¯ã¹ãã£OFFã«ããã°åé¡ãªãå®è¡ã§ããŸãã
åå¿è ã®ããäœããããã³ããããã ããã幞ãã§ãããããããé¡ãããŸãã
ãããããã
ã質åããããšãããããŸãã
dJointGetHingeAnchorã§é¢ç¯ã®äžå¿ç¹ãååŸã§ããŸãã
ODEæ¬(p86)ã§ dJointGetHingeAnchorã®èª¬æãããã£1äžã§ã®ãã³ãžã®äžå¿ç¹ããšã¯ãããã£ïŒã«å¯Ÿå¿ãããã³ãžã®äžå¿ç¹ã§ããdJointGetHingeAnchor2ã¯ããã£ïŒã«å¯Ÿå¿ãããã³ãžã®äžå¿ç¹ã§ãã
ãã³ãžãçæãããšãã¯äž¡è ã®äžå¿ç¹ã¯äžèŽããŠããŸãããã·ãã¥ã¬ãŒã·ã§ã³ãéãã床ã«ãããçããŸãããããããçŽãã®ãEFPãã©ã¡ãŒã¿ã§ãã
ãªãããã³ãžäžå¿ç¹ãååŸãããµã³ãã«ã³ãŒãã以äžã«ç€ºãã®ã§åèã«ããŠãã ããã
const dReal *pos[BODY_NUM],*R[BODY_NUM];
dMatrix3 R1;
dVector3 ap[BODY_NUM-1]; // anchor point
float ar = 0.06; ãããããã // anchor radius
ããã// draw anchors
dsSetColorAlpha(0.0, 0.0, 1.3, 1.0);
for (int i = 0; i < BODY_NUM-1; i++) {
dJointGetHingeAnchor(joint[i], ap[i]);
dsDrawSphere(ap[i], R1, ar);
}
ãã// draw lines
dsSetColorAlpha(1.3, 1.3, 1.3, 1.0);
for (int i = 0; i < BODY_NUM-1; i++) {
dsSetColorAlpha(1.3, 1.3, 1.3, 1.0);
dsDrawLine(pos[i], ap[i]);
dsSetColorAlpha(0.0, 0.0, 0.0, 1.0);
dsDrawLine(ap[i], pos[i+1]);
}
ãã®åãã¯ã¹ãã£ã®åãæ¿ãã«ã€ããŠè³ªåãããŠããã ãããããã§ãã
ç©äœ1ãšç©äœ2ããã³ãžã§çµåãããç©äœ1ããé¢ç¯äžå¿ç¹ãèµ€ã§ãç©äœ2ããé¢ç¯äžå¿ç¹ãéã§
dsDrawLineãçšããŠæåãããã®ã§ãããé¢ç¯äžå¿ç¹ã®çµ¶å¯Ÿåº§æšãååŸã§ããŸããã
ã©ãããã°ããã®ã§ããããã
dJointGetHingeAnchorã§åºæ¥ãã®ããšæã£ãã®ã§ãããéã£ãããã§ãã
ã¡ãªã¿ã«ãODEæ¬(p86)ã§ dJointGetHingeAnchorã®èª¬æãæžãããŠããŸããããã®èª¬æäžã®
ãããã£1äžã§ã®ãã³ãžã®äžå¿ç¹ããšã¯äžäœäœãªã®ã§ããããã
ãã¿ãŸãããããããããããããŸãã
åå¿è
ã§ããããããããšãããããŸãã
ããã§ãããïŒãã®æã远å ããŠããã®ã§ãããè·³ããŠããŸãã
æ©æŠä¿æ°ã0.0ã«èšå®ããŠãã ãã§ããã
åå ã¯äœããšããã£ããã·ãã¥ã¬ãŒã·ã§ã³ãèŠããšããããããªãé£ã³è·³ããŠããããšãããããboxã®åæäœçœ®ã«åæ©çãªãã¹ãããŠããããšãããããŸããã
box=1.0ã§dBodySetPosition(ball.body, x0, y0, z0);ããã®ãããªç¶æ ã§ããã
ã€ãŸããå°é¢ã®ãªãã«boxãããç¶æ ïŒ
dBodySetPosition(ball.body, x0, y0, z0+0.5);ã«ããã解決ããŸããã
ãéšãããã¿ãŸããã§ããã
ããããšãããããŸããïŒ
åå¿è ããã
ã³ã¡ã³ãããããšãããããŸãã
æ©æŠä¿æ°ãå€ããã«ã¯ãODEæ¬ã®89ããŒãžã«ããããã«muãå€ããŸãã
å ·äœäŸãšããŠã¯P44ãããã°ã©ã 2.9ã®20è¡ç®ã«ãã
contact[i].surface.mu = dInfinity;
ã倿ŽããŸããdInifinityãèšå®ãããæ©æŠä¿æ°ã«å€æŽããŠãã ããã
ããã§ã¯ããŸããããªãã®ã§ããããïŒ
ã§ã
ã§ããã
ä¿®æ£ããŸããã
ããšãdLoadMeshFromX颿°ã«ãæãå ããŠãã¡ã¢ãªåç確ä¿ã®éšåãš
ããªãŽã³ããŒã¿ã®é ç¹æ°ïŒäžè§ã¡ãã·ã¥æ°ã®ååŸããŸãšããŠåŠçã§ãã
ããã«ããŸããã
æ°ããdLoadMeshFromX颿°ã®äœ¿ãæ¹ã¯ãªã³ã¯å ã«æžããŠãããŸãã
MyTrimeshæ§é äœã䜿ãã®ãããœã§ãã
ããã«ã¡ãã
ãããããã·ãã¥ã¬ãŒã·ã§ã³ãP35ãEX2.2ã§ãããå³2.1ã®ãããªããã°ã©ã ãå®è¡ãããšããããžã§ã€ã³ãã䌞ã³ããšãšãã«çäžã«é£ã³è·³ããŠããŸããŸããã
ãã®æã¯ãïŒã€ã®boxã®åæäœçœ®ãå°é¢ãã0.5[m]ã»ã©äžãããšè§£æ±ºããã¹ã©ã€ããŒãžã§ã€ã³ãã®åŠç¿ã§ããã®ã§ããã§ãããšããŠããŸããã
ãããããã¯ãæ°ã«ãªããboxãšå°é¢ã®æ©æŠæµæãåå ã ãšæããŸããã
ããã§ãP88ïœP90ãODEã®ãµã³ãã«ããã°ã©ã ãtest.cylïŒæé¢ãç«æ¹äœãæ»ãèœã¡ãããã°ã©ã ïŒïŒã®ããã°ã©ã ã®ãœãŒã¹ã³ãŒããåèã«ããã®ã§ããããªããªãããŸãã¯ãããŸããã
å°é¢ãšã®æ©æŠæµæãå€ããã«ã¯ã©ãããã°ããã§ããããã
ã²ã³ãã®ããã
ããããããŸã
ãœãŒã¹ã³ãŒããèªã¿ãŸãããã質éèšå®ããã©ã€ã¡ãã·ã¥ã«å¯ŸããsimLoopã®åŠçãäžå®å šã§ããdemo_moving_trimesh.cppãODEè¬åº§22ã®ãœãŒã¹ãåèã«ããŠãã ããã
ODEæ¬ã®ãã©ã€ã¡ãã·ã¥ã«é¢ãããµã³ãã«ããã°ã©ã ã¯ODE-0.6ã®é äœæããã®ã§å€ããªã£ãŠããŸãããã®ãããšæ¯èŒããŠãã©ã€ã¡ãã·ã¥ã®åŠçã¯åçã«è¯ããªã£ãŠããŸãã
ã§ããã
åºæ¥ãŸãããã
VertexCountãšIndexCountãååŸãã颿°ãäœã£ãŠã
VerticesãšIndicesãããããmallocã§åçã¡ã¢ãªç¢ºä¿ããããã«ããŸããã
ãªã³ã¯å ã«ãœãŒã¹ïŒãšèª¬æïŒã眮ããŠããŸãã
ã¬ã¹ããããšãããããŸãã
ãžãªã¡ããªã ãã®å Žåã§ç§»åã¯æ¯ãã¬ãŒã SetPosition()ã§æå®ãããš
å£ãªã©ã§ããæããŠããŸãã®ã§äœãããæ¹æ³ã¯ãªãããªããšæã質åãããŠããããŸããã
ã¡ãªã¿ã«å°åœ¢ããŒã¿ã¯TriMeshã§çæããŠããŸãã
ã¡ãã£ãšäœçœéšåã倧ãããªããŸããäžå¿çã§ããã£ãœãèŠãããããã§ãã
Rainlilyããã
ã¯ãããŸããŠã
ODEã¯ã²ãŒã ã®çšéã«ã¯ãŽã£ããã§ããã
ç§ã¯ã²ãŒã ãããŸãäœã£ãããšããªãã®ã§ããããã£ã©ã¯ã¿ãããããç§»åãããšãã«åååŠèšç®ããå¿ èŠã¯ããŸããªãã®ã§ãç©äœã«ããã£ãèšå®ããªãã§ããžãªã¡ããªã ããèšå®ããã®ã§ã¯ã ãã§ããïŒ
ã§ã
ã²ã³ãã®ããã
X Fileã®ããŒããŒã§ããã VerticesãšIndicesã®æ°ããã¡ãã¡äººéãå ¥åããã®ã¯æéããããã®ã§ãèªåã«ã§ããŸããããã²ã³ãã®ããã®å®åãªããããªã«é£ãããªãã§ãããã
ã§ã
ã¯ãããŸããŠãã²ãŒã ã«å©çšããããšODEãè§Šã£ãŠããŸãã
ãããäžããã£ã©ãæ©ããããªåŠçãããæã«ãçŽç«ããŠãããã£ã©ãã«ãã»ã«ãšããŠæ±ãããšæã£ãŠããã®ã§ããã
éåžžã®äœ¿ãæ¹ã§ã¯åœç¶ã§ããã«ãã»ã«ã¯å°é¢ã«ãã£ãŠåããŠããŸããŸãã
éåã3軞ãšã0ã«èšå®ããŠãåã®ãããªå Žæã§ã¯åœç¶åããŠããŸããŸãã
ãžã§ã€ã³ãã§åºå®ããç¶æ ã§dBodySetLinearVel()ã䜿ã£ãŠç§»åãããŠã
ãžã§ã€ã³ãããäœçœ®ãšç§»ååŸã®äœçœ®ããã£ãããããããŠããŸããããŸããã§ããã
å転軞ãåºå®ãããç§»åã®ã¿ã®åäœãšããŠäœ¿ãäºã¯ã§ããªãã®ã§ããããïŒ
ã§ããã
åºæ¥ãŸããïŒ
ã¢ããã€ã¹ããããšãããããŸããã
ã²ã³ãã®ããã
è¿äºãé ããªããã¿ãŸãããXãã¡ã€ã«ã®ããŒããŒããã§ããã
ããŠãAIBOã·ãã¥ã¬ãŒã¿ã§ã¯ããªãŽã³ã¯æç»ã«ã ã䜿ããè¡çªèšç®ã¯ãããããã¯ã¹ãã·ãªã³ããçãªã©ã§è¿äŒŒãããã®ã䜿ããŸããã
LCP Internal Errorãåé¿ããã«ã¯step sizeãå°ããããããCFMãERPã®å€ã倿Žããããç©äœåå£«ãæ·±ããã蟌ãŸãªãããã«dWorldSetContactSurfaceLayer(world, depth)ãåŒã³åºããŸãããã®ãšãdepthã¯ãã蟌ãæå€§ã®æ·±ããªã®ã§å°ããããŸãã
ãŸããã²ã³ãã®ããã®ãµã³ãã«ããã°ã©ã ã詊ãããšãããæ©æŠä¿æ°muã以äžã®ããã«ç¡é倧ã«ãããšãšã©ãŒãåé¿ã§ããŸããã詊ããŠãã ããã
contact[i].surface.mu = dInfinity;
ã§ã
ã§ãããã®èšããšããææ°ã®ããŒãžã§ã³ã«ãããå®è¡ã§ããŸããã
ããããšãããããŸããã
ãããããïŒ
ããããã¡ã€ã«ã倿ŽããåŸã«ïŒ
ODEèªäœãmake, make installãçŽãããå¿ èŠããããŸãïŒ
ãŸãïŒODE0.9ã§ããããïŒ
ã§ã
ã§ããããåçããããšãããããŸãïŒ
ãªãã»ã©ãæåã®é¢æ°ãåŒã³åºããªããšåæåãããªããã§ããã
ãã£ããããããã¡ã€ã«ã«
DS_API void dsStartGraphics (int window_width, int window_height, struct dsFunctions *fn);
ã远å ããŠãã£ãŠã¿ãã®ã§ããããªããmakeæã«ãšã©ãŒãåºãŸãã
undefined reference to `dsStartGraphics’
ãšãããããŸãæ©ãã§ããç¶æ³ã§ããäœãæªãã®ã§ããããã
MINGã§ãã£ãŠãããŸãã
ã§ã ãã
ãä¹ ãã¶ãã§ãã
DirectXçšããªãŽã³ããŒã¿ïŒæ¡åŒµå.xïŒãDrawstuffã§è¡šç€ºããããã°ã©ã ãäœã£ãã®ã§ããã
LCP internal error ãæ¢ãŸããŸãããå°é¢ãšè¡çªãããšãã®æåãããããã§ãã
ODEã®ãã¢ãdemo_moving_trimeshãããã§ãããã®AIBOã·ãã¥ã¬ãŒã¿ã¯ããããã£ããšã©ãŒ
ç¡ãã§åããŠããããã«èŠããŸãããäœãã³ããããã®ã§ããïŒ
ãœãŒã¹ãšãã€ããªããŒã¿ã¯ãªã³ã¯å ã«çœ®ããŠãããŸãã
ããããã
ã¯ãããŸããŠã
ããŠãsimloopã®äžã§path_to_texturesã®ãã¹ãå€ããŠããã¯ã¹ãã£ã¯å€ãããŸããã
dsStartGraphics()ã䜿ã£ãŠãã ããããã ããdrawstuff.hã®95è¡ç®ã®dsSimulationLoop()ã®äžã«ä»¥äžã®äžè¡ã远å ããŠãode-0.9ã§makeãçŽããŠãã ããã
DS_API void dsStartGraphics(int window_width, int window_height, struct dsFunctions *fn);
ããŒæäœã«ãããã¯ã¹ãã£åãæ¿ãã®ãµã³ãã«ã以äžã«ç޹ä»ããŸãã
void command(int cmd)
{
switch (cmd) {
case ‘t’:
fn.path_to_textures = “./textures”;
dsStartGraphics(640,480,&fn);
break;
case ‘u’:
fn.path_to_textures = “../../drawstuff/textures”;
dsStartGraphics(640,480,&fn);
break;
}
}
以äžã§ãã
ã§ã
ã¯ãããŸããŠãæ¬ãšãµã€ããèŠãŠå匷ãããŠããã£ãŠããŸãã
ããã°ã©ã ã«é¢ãã質åãªã®ã§ããããã¯ã¹ãã£ããããã䜿ãã«ã¯ã©ãããã°ããã®ã§ããããïŒ
LOOPã®äžã§fn.path_to_texturesã®ãã¹ãå€ããŠããã¯ã¹ãã£ãå€ãããªããŠæ©ãã§ããŸãã
ããããããããããŸãã
ã§ãããã
åçããŠããã ããããããšãããããŸãã
åèã«ããŠããã°ã£ãŠã¿ãŸãã
ä»åŸããäœããããŸããããããããé¡ãããŸãã
äœåºŠããããŸãããã§ããã
ãããã詊è¡é¯èª€ãç¹°ãè¿ããçµæ
dRFromEulerAnglesãçšããŠã¿ãã
ã§ããŸããã
äœçœ®åº§æšããã¡ããšããã®ãããªå€ããšã£ãŠããã®ã§
ãã¶ãããã§ãããšæããŸãã
èªåããçžè«ããšããŠãã®ãããªçµæ«ã«ãªããŸããŠæ¬åœã«ãããŸããã
ãµã³ãã«ã³ãŒããŸã§æžããŠããããªããŠã倧å€ããããéãã§ãã
äžå¿èªåãæžããã³ãŒãïŒè§åºŠèšç®ïŒãèŒããã®ã§
ééããªã©ãææããŠããããã幞ãã§ãã
//è§åºŠèšç®
static void radian(dReal fx, dReal fy, dReal fz)
{
radianyz=atan(fz/fy);
radianxy=atan(fx/sqrt(fz*fz+fy*fy));
}
//ãªã€ã©ãŒè§ã®èšå®
dMatrix3 R1;
dRFromEulerAngles(R1, M_PI/2-radianyz, -radianxy, 0);
dBodySetRotation(pole.body, R1);
ãããªæãã«ãªããŸããã
èªåãããããšããŠããã®ã¯
ãã¯ãã«ïŒïœïœãïœïœãïœïœïŒã®æ¹åã«ã«ãã»ã«åã®ããã£ïŒpole.bodyïŒã
åãããããšãããã®ã§ãã
ãããçšããŠODEã«åŒç¢ã®ç¢ã®è»éãã·ãã¥ã¬ãŒã·ã§ã³ãããããšããããã°ã©ã ã
èªåã¯äœã£ãŠããŸãããªããšã宿ã¯éã«åãããã§ãã
é·æã§ãããŸããããã®ããŒãžã¯ããã°ã©ã ãäœãããã§å€§å€åœ¹ç«ã¡ãŸããã
芪身ã«çžè«ã«ã®ã£ãŠããã ãæ¬åœã«ããããšãããããŸããã
ryupioneer
ryupioneerããã
ã質åããããšããããšã¯ãODEæ¬ã®èª¬æã§ã¯ãããã¥ãããšããããšã§ããã
ä»»æã®å§¿å¢ã«åããããšãã§ããŸããå ·äœçã«ãã©ã®å§¿å¢ã«ãããããæããŠãã ããããã®å§¿å¢ãåãããµã³ãã«ã³ãŒããæžããŠã¿ãŸãã
ã§ã
è¿ éãªãè¿çããããšãããããŸããã
ãã dRFromAxisAndAngleãdRFromEulerAnglesã§äœåºŠã詊ããŠããã®ã§ãã
ããŸããããŸããã
äžåã®å転ã¯ã§ããã®ã§ãã
è€æ°åã®å転ãã§ããŸããã
dRFromAxisAndAngleã§èšå®ã§ããã®ã¯
äžã€ã®å転åœä»€ã ããªã®ã§ãããã
ãã¯ãç©äœãäžéå端ãªäœçœ®ãžåããã®ã¯
ODEã§ã¯ç¡çãªã®ã§ãããã
äœåºŠããããŸããããããããé¡ãããŸã
Shioããã
ODEã®äžçãžããããïŒ
ããŠã詊ããŠããŸããããç©äœãã空æŽéšåãããã¬ãã®ã§ã¯ãªããè€æ°ã®ç©äœã§ç©ºæŽãå²ãããã«å®è£ ããã°ã§ãããšæããŸãã
ãããå®çŸã§ãããå·®ãæ¯ããªãç¯å²ã§ãé£çµ¡ããé¡ãããŸãã
ã§ã
ryupioneerããã
ãæ¥ãã®ãšããè¿äºãé ããŠãã¿ãŸãããéåœã§éå¬ãããRobot World 2007ã§ãã¥ãŒããã€ãããããã®ãã¢å±ç€ºã®ããåºåŒµã§æ¬æ¥åž°åœããŸããã
ããŠãdRFromAxisAndAngle()ã§åãããå§¿å¢ã®å転è¡åãååŸããdBodySetPosition()ã§ãã®å§¿å¢ã«bodyãèšå®ããŠãã ãããODEæ¬ã®P75 ããã°ã©ã 3.3ãåèã«ãªããšæããŸãã
ã§ã
ã¯ãããŸããŠ
çç³»åŠæ ¡ã§å±ç€ºç©ã®äœæã«
ãã€ãã£ããœãããéçºããŠããã®ã§ãã
ã®åæå§¿å¢ã§è¡ãè©°ã£ãã®ã§è³ªåãããŠããã ããŸãã
ãããã¯ãã«ïŒïœãïœãïœïŒãããããããŠããŠ
ãããšåãæ¹åã«ç©äœã®å§¿å¢ãåãããã®ã§ãã
ããŸããããŸããã
å匷äžè¶³ã ãšæããŸãããæ¥æ°ãæ®ãå°ãªãã®ã§
ãããããé¡ãããŸãã
ã¯ãããŸããŠãShioãšç³ããŸãã
æè¿ODEãå§ããŸããŠãåèæžããã¡ãã®ãµã€ããåèã«ããŠåŠç¿ããŠãããŸãã
ãšããã§è³ªåãªã®ã§ããã
ç©äœã®å éšã«ç©ºæŽãäœã£ãŠããã®ç©ºæŽã®äžã«ç©äœãå ¥ãããšããããšã¯ã§ããã®ã§ããããïŒ
ãããããé¡ãããŸãã
ã§ããã
ãœã£ããŒã§ã
ode-0.9ããªãªãŒã¹ãããŸãããïŒ
ãã£ããã€ã³ã¹ããŒã«ããŠã¿ãã®ã§ããïŒdemura.netã§ç޹ä»ãããŠãã
æ°ãããã¢ã®demo_basket.exeãèµ·åããŠãïŒErrorãã§ãŠããŸããŸãïŒ
ç°å¢ã¯ïŒwindows xpã§mingwãšmsysã§ãïŒ
Errorã¯
could not load accelerators
ã§ãïŒ
ãªã«ãã€ã³ã¹ããŒã«ã§äžåããã£ãã®ã§ããããïŒ
ãããããé¡ãããŸãïŒ
mif805ããã
nearCallbackããã£ãšèŠããšããç¹ã«åé¡ã¯ãªãããã§ãããæåã確èªãããã®ã§å·®ãæ¯ããªããã°http://demura.net/archives/4profile/mail.htmlã®ã¡ãŒã«ã¢ãã¬ã¹ãžãœãŒã¹ã³ãŒããéã£ãŠããã ããŸãããïŒ
ã§ã
demuraããã
ãããããã説æããããšãããããŸããã倧å€å©ãããŸããã
ã§ãããã
ã§ããŸããïŒïŒ
æ¯åºŠãæ¬åœã«ããããšãããããŸãïŒïŒ
ãããããªåœ¢ã詊ããŠã¿ãããšæããŸãã
takããã
ã質åããããšãããããŸãããä¹ ãã¶ãã§ããã
ããŠãODEã®ç¹åŸŽãšããŠãç©äœã«ã¯ãžãªã¡ããªãšããã£ã®å±æ§ãããããžãªã¡ããªã¯è¡çªæ€åºèšç®ãããã£ã¯åååŠèšç®ã®å¯Ÿè±¡ãšãªããŸãããã®ç¹åŸŽãããŸãã€ãããšå¹ççãªã·ãã¥ã¬ãŒã·ã§ã³ãããããšãã§ããŸããã
äŸãã°ãèªåŸç§»åãããããåžè¡å°ãèµ°è¡ããã·ãã¥ã¬ãŒã·ã§ã³ãããå Žåããã«ãªã©ã¯å šãåããªããã®ãšããŠæ±ãããããããšã®è¡çªã ããèæ ®ããã ãã§è¯ããšæããŸãããã®ãããªå Žåã§ã¯ããã®ãã«ããžãªã¡ããªã ãã§å®çŸ©ããããšã«ãããç¹ã«å¿ èŠã®ãªããã«ã«å¯ŸããåååŠèšç®ãçç¥ããããšãã§ããŸããåååŠèšç®ãåããŠããªãã®ã§ãã«ã¯åœç¶åããŸããã
ãªãããžã£ã³ãå°ã«ããã£ãå®çŸ©ããŠããboxãå°é¢ã«æ²ãŸãªãæ¹æ³ããããŸããããã¯ãfixedãžã§ã€ã³ãããã®boxãšéç(static)ãªããžã§ã¯ããšçµåããã°ïŒ¯ïŒ«ã§ããéçãªããžã§ã¯ãã®ããã£IDã«ã¯0ãèšå®ããŠãã ããã
以äžã§ãã
ã§ã
demuraãã
ãä¹ ãã¶ãã§ãã以åMacOSXãžã®ã€ã³ã¹ããŒã«ãç©äœãå°é¢ã®äžãæ»ã£ãŠããŸãçŸè±¡ã«ã€ããŠè³ªåãããŠããã ããtakã§ãã
ä»åã¯odeã«ä»å±ã®ãµã³ãã«test_buggyã«ã€ããŠã§ãã
æé¢ãäœãããšããã®ã§ãããodeã«ã¯äžè§åœ¢ã®ãªããžã§ã¯ãããªãã®ã§å°ã£ãŠããæã
test_buggyã«äžè§åœ¢ã®ãžã£ã³ãå°ã®çšãªãã®ããã£ãã®ãæãåºããœãŒã¹ãçºããŠããã®ã§ããã
boxãæãã«ããŠå°é¢ã«ãã蟌ãŸãããšããæ¹æ³ããšã£ãŠããŸããã
ããããã®ãžã£ã³ãå°ã¯ãªãããžãªã¡ããª(geom)ã®ã¿ã§å®çŸ©ãããŠãããããã£(body)ã¯å®çŸ©ãããŠãŸããã§ããã
éã®ãã¿ãŒã³ã¯ODEè¬åº§ïŒã§èŠãã®ã§æ§è³ªãåãã£ãŠããã®ã§ããããžãªã¡ããªã®ã¿å®çŸ©ããã
ãªããžã§ã¯ãã®æ§è³ªãããŸãã¡ã€ãã¿ãããŸããã
å®éã«ãžã£ã³ãå°ã«ããã£ãå®çŸ©ããŠã¿ããšïŒèªåã®ãœãŒã¹ã«ç§»æ€ïŒããžã£ã³ãå°ãšãªãã¯ãã®boxã¯å°é¢ã«æ²ãã§ãã£ãŠããŸããŸãïŒåœç¶ã§ããïŒã
ããã§è³ªåãªã®ã§ããããžãªã¡ããªã®ã¿ã§å®çŸ©ããããªããžã§ã¯ãã¯ã©ã®ãããªå©ç¹ãããã®ã§ããããïŒ
ãŸããªããã®ãªããžã§ã¯ãã¯æåŸãŸã§æ²ãŸãéäžã§æ¢ãŸãã®ã§ããããïŒ
ã²ãã£ãšããŠè¬åº§ã®ã©ããã§è¿°ã¹ãããŠããŸãããç³ãèš³ãããŸããã