6. è¡çªæ¤œå‡º

ゲーム開 発やãƒãƒœãƒƒãƒˆã®ç ”究者ã«ã‚‚使ã‚れã¦ã„るオープンソースã®ç‰©ç†è¨ˆç®—エンジンODE (Open Dynamics Engineã€ã‚ªãƒ¼ãƒ—ン ダイナミクスエンジン)をå¦ã¶ODEåˆç´šè¬›åº§ã®ç¬¬ï¼–回目ã§ã™ã€‚
今回ã¯è¡çªæ¤œå‡ºæ©Ÿèƒ½ã«ã¤ã„ã¦å‹‰å¼·ã—ã¾ã™ã€‚å‰å›žå‹‰å¼·ã—ãŸã‚ˆã†ã«ODEã§ã¯å‹• 力å¦è¨ˆç®—ã¨è¡çªæ¤œå‡ºè¨ˆç®—ãŒåˆ¥ã€…ã«å®Ÿè£…ã•れã¦ã„ã¾ã™ã€‚動力å¦è¨ˆç®—ã‚’ã™ã‚‹ãŸã‚ã«ã¯ã€ãƒ¯ãƒ¼ãƒ«ãƒ‰worldã‚’dWorldCreate()ã§ç”Ÿæˆã—ã€ãã®ä¸ã«å‰›ä½“ bodyを生æˆã—ã€dWorldStep()ã§å‹•力å¦è¨ˆç®—ã‚’ã—ã¾ã—ãŸã。
ジオメトリ
ジオメトリã¨ã¯ç‰©ä½“ã®å½¢çжã¨ã„ã†æ„味ã§ã€ä¸‹å›³ã®å·¦ã‹ã‚‰sphere(çƒï¼‰ã€box(直方体)ã€cylinder(円柱)ã€capsule(カプセル)ãªã©ã®ç¨®é¡žãŒã‚りã¾ã™ã€‚

- è¡çªæ¤œå‡ºã«é–¢ã™ã‚‹API
- dSpaceID dHashSpaceCreate(0) è¡çªè¨ˆç®—用スペースを生æˆã—ã€ãã®ID(è˜åˆ¥å)を返ã™ã€‚
- dGeomID dCreatePlane(dSpaceID space ,dReal a, dReal b, dReal c, dReal d) spaceã«ax+by+cz=dã®å¹³é¢ã‚¸ã‚ªãƒ¡ãƒˆãƒªã‚’生æˆã™ã‚‹ã€‚
- dGeomID dCreateSphere(dSpaceID space, dReal r) spaceã«åŠå¾„rã®çƒã‚¸ã‚ªãƒ¡ãƒˆãƒªã‚’生æˆã™ã‚‹ã€‚
- void dGeomSetBody(dGeomID geom, dBodyID body) 物体ã®2ã¤ã®å±žæ€§ã§ã‚るジオメトリgeomã¨å‰›ä½“bodyを関連ã¥ã‘る。
- dJointGroupID dJointGroupCreate(0) 接触点ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’æ ¼ç´ã™ã‚‹ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã‚°ãƒ«ãƒ¼ãƒ—を生æˆã—ã€ãã®IDã‚’è¿”ã™ã€‚
- void dJointGroupEmpty(dJointGroupID) æŽ¥è§¦ç‚¹ãŒæ ¼ç´ã•れã¦ã„るジョイントグループを空ã«ã™ã‚‹ã€‚
以下ã«ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’示ã—ã¾ã™ã€‚ å‰å›žã®ãƒ—ãƒã‚°ãƒ©ãƒ ã¨é•ã†ã¨ã“ã‚ã ã‘コメントを入れã¦ã„ã¾ã™ã€‚
ã•ã¦ã€ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’ã•ã£ããèªã¿ã¾ã—ょã†ã€‚ãªãŠã€å‰å›žã®sample1 ã¨å…¨ãåŒã˜start関数やprepDrawStuff関数ã¯çœç•¥ã—ã¦ã„ã¾ã™ã€‚
#include <ode/ode.h>
#include <drawstuff/drawstuff.h>
static dWorldID world;
static dSpaceID space;
static dGeomID ground;
static dJointGroupID contactgroup;
static int flag = 0;
dsFunctions fn;
const dReal radius = 0.2;
const dReal mass = 1.0;
typedef struct {
dBodyID body;
dGeomID geom;
} MyObject;
MyObject ball;
static void nearCallback(void *data, dGeomID o1, dGeomID o2)
{
const int N = 10;
dContact contact[N];
int isGround = ((ground == o1) || (ground == o2));
int n = dCollide(o1,o2,N,&contact[0].geom,sizeof(dContact));
if (isGround) {
if (n >= 1) flag = 1;
else flag = 0;
for (int i = 0; i < n; i++) {
contact[i].surface.mode = dContactBounce;
contact[i].surface.mu = dInfinity;
contact[i].surface.bounce = 0.0; // (0.0~1.0) restitution parameter
contact[i].surface.bounce_vel = 0.0; // minimum incoming velocity for bounce
dJointID c = dJointCreateContact(world,contactgroup,&contact[i]);
dJointAttach (c,dGeomGetBody(contact[i].geom.g1),dGeomGetBody(contact[i].geom.g2));
}
}
}
static void simLoop (int pause)
{
const dReal *pos,*R;
flag = 0;
dSpaceCollide(space,0,&nearCallback);
dWorldStep(world,0.01);
dJointGroupEmpty(contactgroup);
if (flag == 0) dsSetColor(1.0, 0.0, 0.0);
else dsSetColor(0.0, 0.0, 1.0);
pos = dBodyGetPosition(ball.body);
R = dBodyGetRotation(ball.body);
dsDrawSphere(pos,R,radius);
}
int main (int argc, char *argv[])
{
dReal x0 = 0.0, y0 = 0.0, z0 = 2.0;
dMass m1;
prepDrawStuff();
dInitODE();
world = dWorldCreate();
space = dHashSpaceCreate(0);
contactgroup = dJointGroupCreate(0);
dWorldSetGravity(world,0,0,-0.5);
// Create a ground
ground = dCreatePlane(space,0,0,1,0);
// Create a ball
ball.body = dBodyCreate(world);
dMassSetZero(&m1);
dMassSetSphereTotal(&m1,mass,radius);
dBodySetMass(ball.body,&m1);
dBodySetPosition(ball.body, x0, y0, z0);
ball.geom = dCreateSphere(space,radius);
dGeomSetBody(ball.geom,ball.body);
dsSimulationLoop (argc,argv,352,288,&fn);
dWorldDestroy (world);
dCloseODE();
return 0;
}
オブジェクトも動力å¦è¨ˆç®—用ã®body(ボディ)ã®ä»–ã«è¡çªæ¤œå‡ºè¨ˆç®—用ã«geom(ジオメトリ)をè¨å®šã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã®ã§MyObject æ§‹é€ ä½“ã§ãれらをメンãƒã¨ã—ã¦å®šç¾©ã—ã¦ã„ã¾ã™ã。
main関数ã®ä¸ã§çŽ‰ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®geomã‚’dCreateSphere()ã§ä½œã‚Šã€dGeomSetBodyã§bodyã¨geomを関連付ã‘ã¦ã„ã¾ã™ã®ã§ã‚ªãƒ–ジェクトã®ä½ç½®ã¨å§¿å‹¢ã¯bodyã ã‘ã§è¨å®šã™ã‚Œã°OKã§ã™ã€‚ã“れをã—ãªã„ã¨å¹½ä½“離脱ç¾è±¡ã«é™¥ã£ã¦ã—ã¾ã„ã¾ã™ã€‚
è¡çªæ¤œå‡ºé–¢æ•°dSpaceCollideã¯ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®å„ステップã§å®Ÿè¡Œã•れるsimLoop関数ã®ä¸ã§å‘¼ã³å‡ºã•れã¦ã„ã¾ã™ã€‚注æ„ã™ã‚‹ç‚¹ã¨ã— ã¦ã¯ã€å¿…ãšsimLoopã®ä¸€ç•ªå§‹ã‚ã§å‘¼ã³å‡ºã—ã¦ãã ã•ã„。ã“れを後ã®ã»ã†ã«ã‚‚ã£ã¦ã„ãã¨çމãŒåœ°é¢ã‚’çªã抜ã‘ã¦ã—ã¾ã„ã¾ã™ã‚ˆã€‚dSpaceCollide ã§ã¯ã‚³ãƒ¼ ルãƒãƒƒã‚¯é–¢æ•°nearCallbackを呼ã³å‡ºã—ã¦ã„ã¾ã™ã€‚31è¡Œç›®ã§æŽ¥è§¦ã™ã‚‹å¯èƒ½æ€§ã®ã‚ã‚‹ï¼’ã¤ã®ç‰©ä½“ã®ã†ã¡ã€ã©ã¡ã‚‰ã‹ãŒåœ°é¢groundãªã‚‰ isGroundã‚’trueã«ã‚»ãƒƒãƒˆã—ã¾ã™ã€‚32行目ã®dCollide()ã®æˆ»ã‚Šå€¤ã¯æŽ¥è§¦ç‚¹æ•°ã§ã™ã€‚
29行目ã®if (isGround)æ–‡ã¯ï¼Œè¡çªã™ã‚‹å¯èƒ½æ€§ã®ã‚る物体ã®ã†ã¡ã©ã¡ã‚‰ã‹ãŒåœ°é¢ãªã‚‰30行目ã‹ã‚‰43行目ã¾ã§ã®å‡¦ç†ã‚’ã—ã¾ã™ï¼Žã¤ã¾ã‚Šï¼Œåœ°é¢ã¨ã®è¡çªä»¥å¤–ã¯è€ƒãˆã¦ã„ã¾ã›ã‚“.地é¢ä»¥å¤–ã¨ã®è¡çªã‚’考慮ã™ã‚‹å ´åˆã¯ï¼Œã“ã®if文を削除ã—ã¦ãã ã•ã„.
30行目ã§åœ°é¢ã§ã‹ã¤æŽ¥è§¦ç‚¹æ•°ãŒï¼‘以上ãªã‚‰ã€åœ°é¢ã¨æŽ¥è§¦ã—ãŸã“ã¨ã‚’示ã™flagを1ã«ã‚»ãƒƒãƒˆã—ã¦ã„ã¾ã™ã€‚
一方ã€è¡çªæ¤œå‡ºè¨ˆç®—ã‚’ã™ã‚‹ãŸã‚ã«ã¯ã€ã‚¹ãƒšãƒ¼ã‚¹spaceã‚’dHashSpaceCreate()ã§ç”Ÿæˆã—ã€ãã®ä¸ã«å‰›ä½“bodyã«å¯¾å¿œã™ã‚‹ã‚¸ã‚ªãƒ¡ãƒˆãƒª geometryを生æˆã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。以下ã®ã‚µãƒ³ãƒ—ルプãƒã‚°ãƒ©ãƒ ã§ã¯ã€85行目ã§çƒã«å¯¾å¿œã™ã‚‹ã‚¸ã‚ªãƒ¡ãƒˆãƒªã‚’dCreateSphere()ã§ç”Ÿæˆ ã—ã¦ã„ã¾ã™ã€‚86行目ã§ã€å‹•力å¦è¨ˆç®—ã®å¯¾è±¡ã¨ãªã‚‹ãƒœãƒ‡ã‚£ball.bodyã¨è¡çªæ¤œå‡ºè¨ˆç®—ã®å¯¾è±¡ã¨ãªã‚‹ball.geomã‚’çµã³ã¤ã‘ã¦ã„ã¾ã™ã€‚ã“れ㧠ODEã®ç‰©ä½“ãŒå®Œæˆã§ã™ã€‚
次ã«ã€simLoop関数ã®ä¸ã§ã€dSpaceCollide()を呼ã³å‡ºã—ã¾ã™ã€‚ã“ã®APIã¯è¡çªã—ãã†ãªï¼’ã¤ã®ã‚¸ã‚ªãƒ¡ãƒˆãƒªãŒç™ºç”Ÿã—ãŸã‚‰ã€ãれらを nearCallbacké–¢æ•°ã«æ¸¡ã—ã¾ã™ã€‚nearCallback関数ã®å¼•æ•°o1, o2ãŒè¡çªã™ã‚‹å¯èƒ½æ€§ã®ã‚ã‚‹ï¼’ã¤ã®ã‚¸ã‚ªãƒ¡ãƒˆãƒªã§ã™ã€‚nearCallback関数ã§ã¯ã€æŽ¥è§¦ç‚¹ã‚’算出ã—ãŸã‚Šã€æŽ¥è§¦ç‚¹ã®æ€§è³ªãªã©ã‚’è¨å®šã—ã¾ã™ã€‚ ãªãŠã€æ³¨æ„ã—ãªã‘れã°ã„ã‘ãªã„ã“ã¨ã¯ã€å¼•æ•°o1ã€o2ã¯æŽ¥è§¦ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ã ã‘ã§ã€å®Ÿéš›ã«æŽ¥è§¦ã—ã¦ã„ã‚‹ã‹ã©ã†ã‹ã‚ˆãã‚ã‹ã‚‰ãªã„ã“ã¨ã§ã™ã€‚ãれを知るãŸã‚ã«ã¯dCollide()ã®æˆ»ã‚Šå€¤ã€ã¤ã¾ã‚Šã€æŽ¥è§¦ç‚¹æ•°ãŒï¼‘以上ã‹ã©ã†ã‹ãƒã‚§ãƒƒã‚¯ã™ã‚Œã°è‰¯ã„ã®ã§ã™ã€‚
ã¾ãŸã€71行目ã«ã‚るよã†ã«æŽ¥è§¦ç‚¹ã®é›†ã¾ã‚ŠãŒæ ¼ç´ã•れる入れ物をdJointGroupCreate()ã§ç”Ÿæˆã—ã€ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ«ãƒ¼ãƒ—ã§æ¯Žå›žã れをdJointGroupEmpty()を使ã£ã¦ç©ºã«ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。サンプルプãƒã‚°ãƒ©ãƒ ã§ã¯52行目ã§ã‚„ã£ã¦ã„ã¾ã™ã€‚ã“れを忘れるã¨ï¼‘ステップ å‰ã®æŽ¥è§¦ç‚¹é”ãŒæ‚ªã•ã‚’ã—ã¾ã™ã®ã§ãŠå¿˜ã‚Œãªãï¼
ã§ã¯ã€ã“ã“ã‹ã‚‰ã‚µãƒ³ãƒ—ルプãƒã‚°ãƒ©ãƒ 6をダウンãƒãƒ¼ãƒ‰ã—ã¦å®Ÿè¡Œã—ã¦ãã ã•ã„。
練 習
上ã®ä¾‹ã§ã¯ãƒœãƒ¼ãƒ«ï¼‘個をè½ä¸‹ã•ã›ã¾ã—ãŸãŒï¼Œå¤šãã®ãƒœãƒ¼ãƒ«ã‚’è½ä¸‹ã•ã›ã‚‹ãƒ—ãƒã‚°ãƒ©ãƒ を書ã„ã¦ã¿ã¾ã—ょã†ï¼Žå›žç”例sample6multi-100817.zipã¯ã“ã“ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã§ãã¾ã™ï¼Ž
ã§ã¯ã€ã¾ãŸæ¬¡å›žï¼
ã¯ã˜ã‚ã¾ã—ã¦ã€‚
ç§ã¯ç¾åœ¨ODEを使ã£ã¦ãƒãƒœãƒƒãƒˆã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’行ã„ãŸã„ã¨è€ƒãˆã€å‹‰å¼·ã—ã¯ã˜ã‚ãŸåˆå¿ƒè€…ã§ã™ã€‚
一ã¤è³ªå•ãŒæœ‰ã‚Šã¾ã™ã€‚
本記事ã®ã‚µãƒ³ãƒ—ルをビルドã™ã‚‹ã¨ode/ode.hã«å¯¾ã—ã¦No such file or directoryã¨ãªã‚Šã€
以下50個ã®ã‚¨ãƒ©ãƒ¼ãŒåã出ã•れã¾ã™ã€‚
æã‚‰ãã€ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã‚¨ãƒ©ãƒ¼ã ã¨æ€ã†ã®ã§ã™ãŒã€å…·ä½“çš„ãªå¯¾å‡¦ãŒåˆ†ã‹ã‚Šã¾ã›ã‚“。
ç§ã®æ§˜ãªã‚¨ãƒ©ãƒ¼ã«ã¤ã„ã¦è³ªå•ãªã•ã£ã¦ã„ã‚‹æ–¹ãŒä»–ã«ã‚‚散見ã•れã¾ã—ãŸãŒã€
èªã‚“ã§ã‚‚解決ã™ã‚‹äº‹ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
解決法ã«ã¤ã„ã¦ã®ã”回ç”をよã‚ã—ããŠããŒã„ã—ã¾ã™ã€‚
ã¯ã˜ã‚ã¾ã—ã¦ã€ã“ã®ã‚µã‚¤ãƒˆã¨è²´è‘—ã§ODEを勉強ã—ã¦ã„ã‚‹ã‚‚ã®ã§ã™ã€‚
今ã€è½ä¸‹ç‰©ã¨åºŠã¨ã¯åˆ¥ã®å‰›ä½“ã¨ã®è¡çªã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’作æˆã—よã†ã¨ã—ã¦ã„ã‚‹ã®ã§ã™ãŒã€è½ä¸‹ç‰©ãŒå‰›ä½“ã‚’ã™ã‚ŠæŠœã‘ã¦ã—ã¾ã„ã¾ã™ã€‚
ã“ã®å ´åˆã¯nearCallbackã‚’ã‚‚ã†ä¸€ã¤ä½œã‚‰ãªã‘れã°ãªã‚‰ãªã„ã®ã§ã—ょã†ã‹ï¼Ÿãれã¨ã‚‚nearCallback関数内ã«è¡çªè¨ˆç®—を複数作らãªã‘れã°ãªã‚‰ãªã„ã‚“ã§ã—ょã†ã‹ï¼Ÿ
syanã•ã‚“ã€
ã¯ã˜ã‚ã¾ã—ã¦ã€‚
nearCallbackã®é–¢æ•°å†…ã§ã€ã™ã¹ã¦ã®ã‚¸ã‚ªãƒ¡ãƒˆãƒªã®ãƒšã‚¢æ¯Žã«è¡çªæ¤œå‡ºã«é–¢ã™ã‚‹å±žæ€§ã€ä¾‹ãˆã°ã€æ‘©æ“¦ä¿‚æ•°ã‚„å発係数ãªã©ã€ã‚’変ãˆã‚‹å ´åˆã¯ã€ifæ–‡ã§æ¡ä»¶åˆ†ã‘ã‚’ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚nearCallbackã¯ï¼‘個ã§ï¼¯ï¼«ã§ã™ã€‚
御回ç”ã«ãªã£ãŸã§ã—ょã†ã‹ã€‚
ã§ã‚€
返信ã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚
nearCallbackãŒï¼‘個ã§ã„ã„ã®ã¯åˆ†ã‹ã£ãŸã‚“ã§ã™ãŒå‰›ä½“åŒå£«ã®è¡çªã«ã¤ã„ã¦ã¯ã©ã†ã—ã¦ã‚‚分ã‹ã‚Šã¾ã›ã‚“。
ã“ã®å ´åˆã¯ã‚µãƒ³ãƒ—ルã§ã‚ã£ãŸ((ground == o1) || (ground == o2)); ã¨ã¯åˆ¥ã«((ground == o1) || (ground == o3));ã¨ã„ã£ãŸæ„Ÿã˜ã«if文を増やã›ã°ã‚ˆã‚ã—ã„ã®ã§ã—ょã†ã‹ï¼Ÿ
ã„ã„ãˆã€‚
nearCallbackã«ã¯æŽ¥è§¦ã™ã‚‹å¯èƒ½æ€§ã®ï¼’ã¤ã®ã‚¸ã‚ªãƒ¡ãƒˆãƒªï¼ˆã¤ã¾ã‚Šã€o1, o2)ãŒå…¥åŠ›ã•れã¾ã™ã€‚o3ã¨ã„ã£ãŸæ„Ÿã˜ã«å¢—ã‚„ã™ã®ã§ã¯ãªãã€ä¾‹ãˆã°ã€çƒã¨ãƒœãƒƒã‚¯ã‚¹ã‚¸ã‚ªãƒ¡ãƒˆãƒªã®è¡çªã«é–¢ã™ã‚‹å±žæ€§ã‚’変ãˆãŸã„å ´åˆã¯ã€if (((o1==sphere)&&(o2==box))||((o2==sphere)&&(o1==box))) ã¨ã—ã¦ãã ã•ã„。
ãªãŠã€ç‰©ä½“é–“ã®è¡çªã«é–¢ã™ã‚‹å±žæ€§ãŒå…¨ã¦åŒã˜å ´åˆã¯æ¡ä»¶ã‚’分ã‘ã‚‹å¿…è¦ãŒã‚りã¾ã›ã‚“。
ã§ã‚€
>if (!(g1 ^ g2)) return;
è¡çªç‚¹ã®ä¸¡æ–¹ãŒåœ°é¢ã‚ã‚‹ã„ã¯éšœå®³ç‰©ï¼Œã‚ã‚‹ã„ã¯ã©ã¡ã‚‰ã¨ã‚‚地é¢ã§ã‚‚障害物ã§ã‚‚ãªã„ã¨ãè¡çªå‡¦ç†ã‚’行ã‚ãªã„ã€ã¨ã„ã†ã“ã¨ã§ã™ã。
çŸã„コードãªã®ã«ç†è§£ã™ã‚‹ã®ã«æ™‚é–“ãŒã‹ã‹ã£ã¦ã—ã¾ã„ã¾ã—ãŸãŒã€ä¾‹å¤–処ç†ã‚‚ã†ã¾ãã„ãã€æœ›ã‚“ã§ã„ãŸæŒ™å‹•ã‚’ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã—ãŸã€‚
本当ã«ã‚りãŒã¨ã†ã”ã–ã„ã¾ã—ãŸã€‚
ã¯ã˜ã‚ã¾ã—ã¦ã€‚ã„ã¤ã‚‚ã“ã®ã‚µã‚¤ãƒˆã¨è²´è‘—ã«ãŠä¸–話ã«ãªã£ã¦ã„ã¾ã™ã€‚
ã„ããªã‚Šã§ã™ãŒç‰©ä½“é–“ã®è¡çªå‡¦ç†ã«ã¤ã„ã¦åˆ†ã‹ã‚‰ãªã„ã“ã¨ãŒã‚ã‚‹ã®ã§è³ªå•ã•ã›ã¦ã„ãŸã ãã¾ã™ã€‚
今ODEã®ã‚µãƒ³ãƒ—ルコードã®demo_buggyã‚’ã‚‚ã¨ã«ã—ã¦è‡ªä½œã®ãƒ—ãƒã‚°ãƒ©ãƒ を作æˆä¸ãªã®ã§ã™ãŒï¼Œ
è¨å®šãŒã†ã¾ãã„ã‹ãšï¼Œç‰©ä½“åŒå£«ãŒè¡çªã›ãšã«ã™ã‚Šã¬ã‘ã¦ã—ã¾ã„ã¾ã™ã€‚
ジオメトリã®è¨å®šã¯ã—ã¦ã‚り,地é¢ã¨ã¯æŽ¥è§¦ã™ã‚‹ã“ã¨ãŒç¢ºèªæ¸ˆã¿ãªã®ã§ã™ãŒã€
ãƒã‚®ãƒ¼ãŠã‚ˆã³æ–°ãŸã«è¿½åŠ ã—ãŸãƒ‘ーツåŒå£«ã¯ã™ã‚Šã¬ã‘ãŒç™ºç”Ÿã—ã¦ã—ã¾ã„ã¾ã™ã€‚
ã“ã®ã‚ˆã†ãªç—‡çжãŒãŠãã¦ã—ã¾ã†åŽŸå› ï¼ŒãŠãらãã¯è‡ªåˆ†ã®è¨å®šãŒè¶³ã‚Šã¦ã„ãªã„ã‹ã‚‰ã§ã™ãŒï¼Œ
解決方法ã«å¿ƒå½“ãŸã‚ŠãŒã‚りã¾ã—ãŸã‚‰ã”教授ã„ãŸã ã‘ãªã„ã§ã—ょã†ã‹ã€‚
よã‚ã—ããŠé¡˜ã„ã—ã¾ã™ã€‚
melã•ã‚“ã€
ã¯ã˜ã‚ã¾ã—ã¦ã€‚demura.netã¨æ‹™è‘—ã‚’ã”æ„›èªã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚
ã•ã¦ã€ã”質å•ã§ã™ãŒã€if (!(g1 ^ g2)) return;ã®è¡Œã‚’コメントアウトã™ã‚‹ã¨å•題ã¯è§£æ±ºã™ã‚‹ã¨æ€ã„ã¾ã™ã€‚
ã§ã‚€
static void nearCallback (void *data, dGeomID o1, dGeomID o2)
{
int i,n;
// only collide things with the ground
int g1 = (o1 == ground || o1 == ground_box);
int g2 = (o2 == ground || o2 == ground_box);
if (!(g1 ^ g2)) return;
æ£ç¢ºã«ã¯è¡çªã™ã‚‹å¯èƒ½æ€§ã®ã‚るジオメトリãŒï¼’ã¤ã¨ã‚‚地é¢ã‚ã‚‹ã„ã¯åœ°é¢ãƒœãƒƒã‚¯ã‚¹ï¼Œã‚ã‚‹ã„ã¯åœ°é¢ã§ã‚‚地é¢ãƒœãƒƒã‚¯ã‚¹ã§ãªã„ã¨ãè¡çªæ¤œå‡ºã‚’ã—ãªã„ã§ãƒªã‚¿ãƒ¼ãƒ³ã™ã‚‹ã¨ã„ã†ã“ã¨ã§ã™ï¼Ž
排他的論ç†å’Œ^を使ã£ã¦ã„ã‚‹ã®ã§å°‘ã—ã‚ã‹ã‚Šã¥ã‚‰ã„ã§ã™ã.
今後ã¨ã‚‚ã”æ„›èªã‚„コメントよã‚ã—ããŠé¡˜ã„ã—ã¾ã™ï¼Ž
ã§ã‚€