ODEというライブラリで、dBodyCreateなどの関数でエラーが出る。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kimityan555

ODEというライブラリで、dBodyCreateなどの関数でエラーが出る。

#1

投稿記事 by kimityan555 » 6年前

失礼します。
ODEという物理演算ライブラリで、ゲームを作ろうとしているのですが、ボディーの生成のためにdBodyCreateという関数を呼び出すと

ハンドルされない例外が 0x00FE3C21 (Car.exe) で発生しました: 0xC0000005: 場所 0x00000010 への書き込み中にアクセス違反が発生しました。

とエラーが出ます。

やりたいのは、横倒しにしたカプセルにシリンダ(円筒)を4つジョイントでつけて車にするという実験なのですが、このホイールを生成するところでエラーが出ます。
最初は書き方が悪かったのかと思ったのですが、よくよく考えると、その直前でカプセルを生成するのには成功しているんです。

いままで何回もボディー生成は成功したのですが、今までこんなエラーは出たことがありません。

原因わかる方いますか?


※以下関係ありそうなソースコード

コード:


class TestCar
{
public:
	dBodyID body_Flame, body_Wheel[4];
	dMass mass_Frame, mass_Wheel[4];
	dGeomID geom_Flame, geom_Wheel[4];

	TestCar(dReal px, dReal py, dReal pz);
	void tcarDraw(unsigned int bodyColor, unsigned int wheelColor);
};

TestCar::TestCar(dReal px, dReal py, dReal pz)
{
//	int i = 0;
	dVector3 Rotation;

	//メインとなるボディーを生成
	body_Flame = dBodyCreate(world);						//ボディーを生成
	dBodySetPosition(body_Flame, px, py, pz);				//位置を調整
	dMassSetZero(&mass_Frame);								//質量パラメータの初期化
	dMassSetCapsuleTotal(&mass_Frame, 800, 1, 0.5, 4.215);	//質量パラメータの設定
	dBodySetMass(body_Flame, &mass_Frame);					//質量パラメータの適用
	geom_Flame = dCreateCapsule(space, 0.5, 4.215);			//ジオメトリを生成
	dGeomSetBody(geom_Flame, body_Flame);					//ジオメトリの適用
	Rotation[1] = M_PI / 2;
	dBodySetRotation(body_Flame, Rotation);					//ボディーを正しい向きにする

	//ホイールの生成
	dRFromAxisAndAngle(Rotation, 0.25, 0.0, 0.0, 2 * M_PI); //x軸周りに90度回す(y軸方向に向く)
	
	for (int i = 0; i < 4; i++)								//ホイールの数だけ繰り返す。
	{
		body_Wheel[i] = dBodyCreate(world);					//ボディーを生成
		dMassSetZero(&mass_Wheel[i]);						//質量を設定
		dMassSetCylinderTotal(&mass_Wheel[i], 25, 2, 0.3, 0.2);
		dBodySetMass(body_Wheel[i], &mass_Wheel[i]);
		geom_Wheel[i] = dCreateCylinder(space, 0.3, 0.2);	//ジオメトリを設定
		dGeomSetBody(geom_Wheel[i], body_Wheel[i]);
		dBodySetRotation(body_Wheel[i], Rotation);			//正しい向きにする
	}
	

	//ホイールの位置を調整
	dBodySetPosition(body_Wheel[0], px + 1.215, py + 0.710, 0.3);
	dBodySetPosition(body_Wheel[1], px + 1.215, py - 0.710, 0.3);
	dBodySetPosition(body_Wheel[2], px - 1.215, py + 0.710, 0.3);
	dBodySetPosition(body_Wheel[3], px - 1.215, py - 0.710, 0.3);
}
また、dBodyCreateをコメントアウトしてもそのあとの関数でことごとく同じエラーが出ます。
dBodyCreateの問題というよりは、ODE全体的に問題がある感じです。
ネットで調べてもののようなエラーが出ているという情報は見つけられませんでした。
サンプルプログラムは、どれを実行しても同じようなエラーは出ませんでした。
使っているODEのバージョンは、0.13です。

アバター
沖 滉均
記事: 237
登録日時: 13年前
住所: K県F市

Re: ODEというライブラリで、dBodyCreateなどの関数でエラーが出る。

#2

投稿記事 by 沖 滉均 » 6年前

ドキュメントとコードを確認してみましたが、おそらく原因は16行目の定義と30行目ですね。

コード:

    dVector3 Rotation;

コード:

    //ホイールの生成
    dRFromAxisAndAngle(Rotation, 0.25, 0.0, 0.0, 2 * M_PI); //x軸周りに90度回す(y軸方向に向く)
dRFromAxisAndAngleの定義は
void dRFromAxisAndAngle (dMatrix3 R, dReal ax, dReal ay, dReal az, dReal angle);
ですので第1引数はdVector3ではなくdMatrix3です。

コード:

typedef dReal dVector3[dV3E__MAX];   // dV3E__MAX = 4
typedef dReal dMatrix3[dM3E__MAX];   // dM3E__MAX = 12
ですが、RotationはdVector3となっているので、範囲外の領域を書き換えてしまいその後の処理(今回はdCreateBody)で使用している領域を破壊しており例外を出しているのではないでしょうか
There is no royal road to learning.
codeタグで指定できる言語
画像

kimityan555

Re: ODEというライブラリで、dBodyCreateなどの関数でエラーが出る。

#3

投稿記事 by kimityan555 » 6年前

ありがとうございました。
確かに、dMatrix3に変えたらアクセスエラーは出なくなりました。

調べが足りなかったです。
以後気を付けます。

返信

“C言語何でも質問掲示板” へ戻る