質問失礼します。
OS:WindowsXP Home
コンパイラ?:VisualStudio2005
言語、ライブラリ:
C++
DXライブラリ(3.02c)
Box2D(2.0.1)
現在のC知識:
C、C++歴はおよそ1年半で、オブジェクト指向等の
基本的な点は抑えていると考えております。
-----
現在、上記ライブラリ及び言語を使用し、ゲームを作成中なのですが、
1m → 1pixel を 1m → 100pixel に変換するような、
”DXライブラリ⇔BOX2Dでのスケール変換がどうにも考えつかず”困っております。
そのため、Box2Dの仕様上、物体のサイズ[0.1m~10.0m]でのシミュレーションが適切に動作するにも関わらず、10.0m以上の物体を使わざるを得ない状況です。
今のところ、物体の生成や移動はBox2D、
描画関係は全てDXライブラリを使用しております。
どのあたりのソースを提示するべきなのか、分かりませんので、
必要そうなソースがあるようでしたら、教えていただきますよう御願申し上げます。
BOX2Dのスケール変換
Re:BOX2Dのスケール変換
DXライブラリで表示するためにでBOX2Dから座標を受け取っているんですよね。
なら、表示するときに常に定数倍するようにすればいいのではないでしょうか。
DXライブラリからBOX2Dにデータを送るときは表示するはその定数の逆数倍すればいいのではないですか。
なら、表示するときに常に定数倍するようにすればいいのではないでしょうか。
DXライブラリからBOX2Dにデータを送るときは表示するはその定数の逆数倍すればいいのではないですか。
Re:BOX2Dのスケール変換
お返事ありがとうございました。
返事が遅くなってしまい申し訳ありません。
仰る通りやってみたところ、うまい具合に出来ましたので報告を…
ありがとうございました。
ついでにソースも残しておきます
―――――
定義-----------------------------------------
//1cmを1pixelにする
extern const float SCALE = 1/0.01;
作成時---------------------------------------
//フィルター設定
b2FilterData filt;
filt.categoryBits = 0x0001
filt.maskBits = 0x0001
filt.groupIndex = 0;
//bodyDefを作成
b2BodyDef bodydef;
bodydef.position.Set(x / SCALE,y / SCALE);
//bodyを作成
b2Body* newbox = world->CreateBody(&bodydef);
info->setMe(newbox);
//polygondefを作成
b2PolygonDef polygondef;
polygondef.SetAsBox(width / SCALE,height / SCALE);
polygondef.friction = friction;
polygondef.restitution = restitution;
polygondef.density = density;
polygondef.isSensor = isSensor;
polygondef.filter = filt;
//worldにshapeを生成
newbox->CreateShape(&polygondef);
//計算を行う
newbox->SetMassFromShapes();
描画時----------------------------------------
//b2DebugDrawクラスを継承した
//DebugDrawクラス
void DebugDraw::DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color)
{
int mode;//一時BLEND記録領域
int parm;//一時BLENDパラメータ記録領域
GetDrawBlendMode(&mode,&parm);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND,128);
int i = 1;
for(; i < vertexCount; i++)
{
DrawLine(vertices[i-1].x * SCALE,vertices[i-1].y * SCALE,
vertices.x * SCALE,vertices.y * SCALE,
GetColor(255*color.r,255*color.g,255*color.b));
}
DrawLine(vertices[0].x * SCALE, vertices[0].y * SCALE,
vertices[i-1].x * SCALE, vertices[i-1].y * SCALE,
GetColor(255*color.r,255*color.g,255*color.b));
SetDrawBlendMode(mode,parm);
}
返事が遅くなってしまい申し訳ありません。
仰る通りやってみたところ、うまい具合に出来ましたので報告を…
ありがとうございました。
ついでにソースも残しておきます
―――――
定義-----------------------------------------
//1cmを1pixelにする
extern const float SCALE = 1/0.01;
作成時---------------------------------------
//フィルター設定
b2FilterData filt;
filt.categoryBits = 0x0001
filt.maskBits = 0x0001
filt.groupIndex = 0;
//bodyDefを作成
b2BodyDef bodydef;
bodydef.position.Set(x / SCALE,y / SCALE);
//bodyを作成
b2Body* newbox = world->CreateBody(&bodydef);
info->setMe(newbox);
//polygondefを作成
b2PolygonDef polygondef;
polygondef.SetAsBox(width / SCALE,height / SCALE);
polygondef.friction = friction;
polygondef.restitution = restitution;
polygondef.density = density;
polygondef.isSensor = isSensor;
polygondef.filter = filt;
//worldにshapeを生成
newbox->CreateShape(&polygondef);
//計算を行う
newbox->SetMassFromShapes();
描画時----------------------------------------
//b2DebugDrawクラスを継承した
//DebugDrawクラス
void DebugDraw::DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color)
{
int mode;//一時BLEND記録領域
int parm;//一時BLENDパラメータ記録領域
GetDrawBlendMode(&mode,&parm);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND,128);
int i = 1;
for(; i < vertexCount; i++)
{
DrawLine(vertices[i-1].x * SCALE,vertices[i-1].y * SCALE,
vertices.x * SCALE,vertices.y * SCALE,
GetColor(255*color.r,255*color.g,255*color.b));
}
DrawLine(vertices[0].x * SCALE, vertices[0].y * SCALE,
vertices[i-1].x * SCALE, vertices[i-1].y * SCALE,
GetColor(255*color.r,255*color.g,255*color.b));
SetDrawBlendMode(mode,parm);
}