2

好的,所以我把我的问题分开了,因为我需要一个深入的答案,因为我对此感到很困惑,如果我只有一个概括的答案,就会失败。

我有一个车身,我最初使用 line_loop 绘制并将其更改为多边形,以便我可以对其进行纹理处理。但是它会像这样忽略轮拱。

车错

(暂时忽略纹理,我需要再弄清楚一个;))

这就是我的车在 line_loop 下的样子

汽车形状

如果用多边形制作轮拱的方法使它成为一个更平滑的圆,那就更好了:)

这是我当前的代码,(忽略纹理的东西)我确实从之前的问题开始用那个方向的刺激开始镶嵌,但不确定如何使用它以及传递哪些坐标等等。感谢您的所有帮助!

void drawBody(int textureindex)
{
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textureLib[textureindex]);

GLUtesselator *tess = gluNewTess(); // create a tessellator
      if(!tess) return 0;  // failed to create tessellation object, return 0

glBegin(GL_POLYGON);

glTexCoord2f(0.0F, 0.0F);
      glVertex2f(-1.0f, 0.0f);
glTexCoord2f(-0.97, 0.0);
      glVertex2f(-1.97f, 0.0f);
//wheel arch begin.
glTexCoord2f(-0.93, 0.3);
      glVertex2f(-1.93f, 0.3f);
glTexCoord2f(-0.95, 0.4);
glVertex2f(-1.95f, 0.4f);
glTexCoord2f(-1.2, 0.6);
glVertex2f(-2.2f, 0.6f);
glTexCoord2f(-1.6, 0.6);
glVertex2f(-2.6f, 0.6f);
glTexCoord2f(-1.82, 0.4);
glVertex2f(-2.82f, 0.4f);
glTexCoord2f(-1.8, 0.3);
glVertex2f(-2.8f, 0.3f);
glTexCoord2f(-1.78, 0.0);
glVertex2f(-2.78f, 0.0f);
//end wheel arch.
//Front of car.
glTexCoord2f(0.0, 0.0);
glVertex2f(-3.8f, 0.0f);
glTexCoord2f(0.0, 0.2);
glVertex2f(-3.7f, 0.2f);
glTexCoord2f(0.0, 0.4);
glVertex2f(-3.8f, 0.4f);
glTexCoord2f(0.0, 0.7);
glVertex2f(-2.8f, 0.7f);
glTexCoord2f(0.0, 0.7);
glVertex2f(-2.4f, 0.7f);
//Windscreen.
glTexCoord2f(0.0, 1.0);
glVertex2f(-1.0f, 1.0f);
glTexCoord2f(1.0, 1.0);
glVertex2f(0.5f, 1.05f);
glTexCoord2f(1.0, 0.8);
glVertex2f(2.3f, 0.8f);
//rear bumper.
glTexCoord2f(1.0, 0.5);
glVertex2f(2.15f, 0.5f);
glTexCoord2f(1.0, 0.3);
glVertex2f(2.15f, 0.3f);
glTexCoord2f(1.0, 0.3);
glVertex2f(2.35f, 0.3f);
glTexCoord2f(1.0, 0.0);
glVertex2f(2.0f, 0.0f);
glTexCoord2f(1.0, 0.0);
glVertex2f(1.83f, 0.0f);
//wheel arch begin.
glTexCoord2f(1.0, 0.3);
      glVertex2f(1.85f, 0.3f);
glTexCoord2f(1.0, 0.4);
      glVertex2f(1.86f, 0.4f);
glTexCoord2f(1.0, 0.6);
glVertex2f(1.6f, 0.6f);
glTexCoord2f(1.0, 0.6);
glVertex2f(1.2f, 0.6f);
glTexCoord2f(1.0, 0.4);
glVertex2f(1.0f, 0.4f);
glTexCoord2f(1.0, 0.3);
glVertex2f(1.0f, 0.3f);
glTexCoord2f(1.0, 0.0);
glVertex2f(1.05f, 0.0f);
//end wheel arch.
glEnd();
glDisable(GL_TEXTURE_2D);
}

修订后的镶嵌代码(目前只在一个轮拱上尝试过,没有任何影响)。

    GLdouble car[7][2] = { {-1.93,0.3}, {-1.95,0.4}, {-2.2,0.6}, {-2.6,0.6}, {-2.82,0.4}, {-2.8,0.3}, {-2.78,0.0} };
    GLUtesselator *tess = gluNewTess(); // create a tessellator
gluTessBeginPolygon(tess, 0);  
gluTessBeginContour(tess);
{
    gluTessVertex(tess, car[0], car[0]);
    gluTessVertex(tess, car[1], car[1]);
    gluTessVertex(tess, car[2], car[2]);
    gluTessVertex(tess, car[3], car[3]);
    gluTessVertex(tess, car[4], car[4]);
    gluTessVertex(tess, car[5], car[5]);
    gluTessVertex(tess, car[6], car[6]);
}
gluTessEndContour(tess);
gluTessEndPolygon(tess);

感谢您的所有帮助,最终图像如下所示:

车完成

再次感谢您的帮助!尤其是彼得 :)

4

2 回答 2

1

您根本没有使用镶嵌器。将坐标输入到 tessellator 看起来像这样

    gluTessBeginContour(tess);
        :
        gluTessVertex(tess, v[i], v[i]);
        :
    gluTessEndContour(tess);

阅读此处并获取示例http://www.songho.ca/opengl/gl_tessellation.html

于 2012-01-07T22:39:04.193 回答
1

GL_POLYGON 用于绘制多边形。你的车不是凸的,所以你不能一次画出所有的东西(glBegin..glEnd)。将汽车拆分为具有不同原始类型的多个部分。GL_POLYGON 不能用于一切。

你甚至没有使用你的tesselator

底线是您的问题非常基本。在进一步使用 OpenGL 之前,请完成“OpenGL 红皮书”,它涵盖了几乎所有的基本信息。1.1 版可在多个不同的地方免费在线获得

于 2012-01-07T22:40:21.840 回答