(BOX2D | OPENGL)问题匹配从世界到屏幕的坐标

时间:2016-11-20 19:56:49

标签: c++ opengl box2d

我试图获取Box2D对象的坐标以适应屏幕上对象的坐标(这些与纹理一起显示)。我已经知道box2D以米为单位工作,所以我必须找到适用于我的程序的转换因子(在这种情况下,我说50像素是2米)。

首先用这个来设置盒子的位置和大小:

b2BodyDef def
def.postition.Set(0.02 * x,  y* 0.02)
def.SetAsBox(0.02 * w/2, 0.02* h/2)

因为即时通讯使用openGL我只会制作一个纹理并像往常一样渲染它,但这次我想把纹理x和y与Box2D中它的碰撞盒的x和y相匹配。

当我尝试将我的播放器纹理从地板纹理移开时,我运行程序时,它会在到达结束之前下降。这让我知道我的box2D机身和我的OpenGL纹理没有共享相同的位置。但无论我做什么来尝试和修复,没有任何变化(例如:我尝试将转换因子更改为1m = 20p而不是50p,我尝试不转换坐标,然后我得到一些真正有线的结果,也没有工作,并且一堆其他东西)。最糟糕的是box2D当我使用SDL 2时做了同样的事情,我转而认为OpenGL认为这不会再发生了。

演示中的图片: https://drive.google.com/file/d/0B4anrJs1BRh1aVpOYXI3T3JlWWM/view?usp=drivesdk https://drive.google.com/file/d/0B4anrJs1BRh1dVlTb0czMTE3RWc/view?usp=drivesdk

tile类的代码(目前我的项目中使用box2D的唯一类)

void tile::load(bool square, std::string path)
{
    if(square)
    {
        glGenTextures(1, &texID);
        SDL_Surface *sur = IMG_Load(path.c_str());
        w = sur->w;
        h = sur->h;
        glBindTexture(GL_TEXTURE_2D, texID);
        glTexImage2D(GL_TEXTURE_2D, 0, 4, sur->w, sur->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, sur->pixels);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glBindTexture( GL_TEXTURE_2D, NULL );
    }
}

void tile::addRect(int x, int y, int wt, int ht, bool dyn)
{
    b2BodyDef def;
    //Convert the x and y into meters.
    def.position.Set(vars::P2M * x, vars::P2M * y);

    if(dyn)
    {
        def.type = b2_dynamicBody;
    }


    b = vars::world->CreateBody(&def);

    b2PolygonShape shape; 

    //Convert the width and height entered into meters
    shape.SetAsBox(vars::P2M * w/2,vars::P2M * h/2);

    float th = w * 0.02;
    float tw = h * 0.02;

    b2FixtureDef fix;
    fix.shape = &shape;
    fix.density = 1.0;

    b->CreateFixture(&fix);

    h = h;
    w = w;
}

void tile::Render()
{
    glLoadIdentity();

    b2Vec2 pos;
    pos = b->GetPosition();
    float x = pos.x;
    float y = pos.y;
    //Convert the x and y of the body to pixels.
    glTranslatef(x * vars::M2P, y * vars::M2P, 0);

    glBindTexture( GL_TEXTURE_2D, texID);


    glBegin( GL_QUADS );
        glTexCoord2f(0.f, 0.f); glVertex2f(0.f, 0.f);
        glTexCoord2f(1.f, 0.f); glVertex2f(w, 0);
        glTexCoord2f(1.f, 1.f); glVertex2f(w, h);
        glTexCoord2f(0.f, 1.f); glVertex2f(0, h);
    glEnd();

}

void tile::Update()
{
    b2Vec2 vel;
    vel = b->GetLinearVelocity();
    if(key[SDL_SCANCODE_D])
    {
        d_key = true;
    }
    else
    {
        d_key = false;
    }
    if(key[SDL_SCANCODE_A])
    {
        a_key = true;
    }
    else
    {
        a_key = false;
    }
    if(a_key)
    {
        //Move the box left 
        vel.x = -5;
    }
    if(d_key)
    {
        //Move the box right
        vel.x = 5;
    }
    b->SetLinearVelocity(vel);
}

如果有人有这方面的解决方案,请发布它,因为我没有选项,我不知道该怎么办。感谢。

哦,顺便说一下, vars :: M2P = 50和vars :: P2M = 1 / vars :: M2P(反过来为0.02)。

0 个答案:

没有答案