Проект OpenGL, использующий тесселяцию на многоугольной машине - PullRequest
2 голосов
/ 08 января 2012

Хорошо, так что я разделяю свою проблему, потому что мне нужен глубокий ответ, потому что я не согласен с ним, и потерплю неудачу, если у меня будет только общий ответ.

У меня есть кузов автомобиля, который я изначально нарисовал, используя line_loop иизменил его на полигон, так что я могу текстурировать его.однако он игнорирует колесные арки следующим образом.

car wrong

(пока игнорируйте текстурирование, мне нужно выяснить это в другой раз;))

Этотак выглядит моя машина с line_loop

car shape

Если способ создания колесных арок с многоугольником делает его более плавным кругом, то еще лучше:)

Этоэто мой текущий код, (игнорируйте текстуру) Я начал тесселяцию с prod в этом направлении из предыдущего вопроса, но не уверен, как именно его использовать и какие координаты передать и т. д. и т. д. Спасибо за вашу помощь !!

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);

Спасибо за вашу помощь, итоговое изображение выглядит так:

car finished

Еще раз спасибо за вашу помощь!Особенно ПитерТ :)

Ответы [ 2 ]

1 голос
/ 08 января 2012

GL_POLYGON используется для рисования выпуклых полигонов. Ваша машина не выпуклая, поэтому вы не можете нарисовать все за один раз (glBegin .. glEnd). Разбейте машину на несколько частей, которые имеют разные примитивные типы. GL_POLYGON не может быть использован для всего.

Вы даже не используете свой тесселятор .

Суть в том, что ваш вопрос очень простой. Прежде чем идти дальше с OpenGL, закончите "Красную книгу OpenGL", которая охватывает почти всю основную информацию. Версия 1.1 доступна онлайн бесплатно в нескольких разных местах .

1 голос
/ 08 января 2012

Вы вообще не используете тесселлятор.Подача координат в тесселлятор будет выглядеть примерно так

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

Прочитайте здесь и возьмите примеры http://www.songho.ca/opengl/gl_tessellation.html

...