2012-01-07 3 views
0

задал вопрос о моем проекте раньше, но, похоже, я узнал больше о том, как мало я знаю о openGL, чем о том, как много я делаю на данный момент, но когда-либо отвечаю, что получаю, я кормлю свои знания, поэтому спасибо заранее!Режим рендеринга OpenGL Polygon и картирование текстур

Итак, теперь моя форма автомобиля нарисована с использованием GL_LINE_LOOP и выглядит следующим образом. car shape

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

Я знаю, что моя фигура не идеальна, но я пытаюсь поместить эту картинку в свои линии, чтобы она давала хоть какое-то впечатление о моделировании автомобиля. я попытался это, используя следующий код:

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

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(-2.8, 0.0); 
glVertex2f(-3.8f, 0.0f); 
glTexCoord2f(-2.7, 0.2); 
glVertex2f(-3.7f, 0.2f); 
glTexCoord2f(-2.8, 0.4); 
glVertex2f(-3.8f, 0.4f); 
glTexCoord2f(-1.8, 0.7); 
glVertex2f(-2.8f, 0.7f); 
glTexCoord2f(-1.4, 0.7); 
glVertex2f(-2.4f, 0.7f); 
//Windscreen. 
glTexCoord2f(0.0, 1.0); 
glVertex2f(-1.0f, 1.0f); 
glTexCoord2f(1.5, 1.05); 
glVertex2f(0.5f, 1.05f); 
glTexCoord2f(3.3, 0.8); 
glVertex2f(2.3f, 0.8f); 
//rear bumper. 
glTexCoord2f(3.15, 0.5); 
glVertex2f(2.15f, 0.5f); 
glTexCoord2f(3.15, 0.3); 
glVertex2f(2.15f, 0.3f); 
glTexCoord2f(3.35, 0.3); 
glVertex2f(2.35f, 0.3f); 
glTexCoord2f(3.0, 0.0); 
glVertex2f(2.0f, 0.0f); 
glTexCoord2f(2.83, 0.0); 
glVertex2f(1.83f, 0.0f); 
//wheel arch begin. 
glTexCoord2f(2.85, 0.3); 
glVertex2f(1.85f, 0.3f); 
glTexCoord2f(2.86, 0.4); 
glVertex2f(1.86f, 0.4f); 
glTexCoord2f(2.6, 0.6); 
glVertex2f(1.6f, 0.6f); 
glTexCoord2f(2.2, 0.6); 
glVertex2f(1.2f, 0.6f); 
glTexCoord2f(2.0, 0.4); 
glVertex2f(1.0f, 0.4f); 
glTexCoord2f(2.0, 0.3); 
glVertex2f(1.0f, 0.3f); 
glTexCoord2f(2.05, 0.0); 
glVertex2f(1.05f, 0.0f); 
//end wheel arch. 
glEnd(); 
glDisable(GL_TEXTURE_2D); 
} 

Какие результаты в этом awfullness

awful car

две проблемы. один из них чист, мои координаты для текстурирования действительно неправильны, а во-вторых, я не знаю, как остановить режим многоугольника от избавления от колесных арок:/помощь на этих двух фронтах была бы очень благодарна :)

ответ

4

Координаты текстуры должны быть в диапазон [0, 1].

Проблема с колесными арками заключается в том, что OpenGL только создает выпуклые многоугольники. Используйте tessellation facilities для преобразования вогнутых многоугольников в треугольные сетки.

PS: Для немедленного режима OpenGL, я предлагаю вам принять другой стиль кодирования, который значительно легче читать и поддерживать:

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

    glBegin(GL_POLYGON); 

    glTexCoord2f(0.0 , 0.0); glVertex2f(-1.0 , 0.0); 
    glTexCoord2f(-0.97, 0.0); glVertex2f(-1.97, 0.0); 

    // Wheel arch 
    glTexCoord2f(-0.93, 0.3); glVertex2f(-1.93, 0.3); 
    glTexCoord2f(-0.95, 0.4); glVertex2f(-1.95, 0.4); 
    glTexCoord2f(-1.2 , 0.6); glVertex2f(-2.2 , 0.6); 
    glTexCoord2f(-1.6 , 0.6); glVertex2f(-2.6 , 0.6); 
    glTexCoord2f(-1.82, 0.4); glVertex2f(-2.82, 0.4); 
    glTexCoord2f(-1.8 , 0.3); glVertex2f(-2.8 , 0.3); 
    glTexCoord2f(-1.78, 0.0); glVertex2f(-2.78, 0.0); 

    // Front of car 
    glTexCoord2f(-2.8 , 0.0); glVertex2f(-3.8 , 0.0); 
    glTexCoord2f(-2.7 , 0.2); glVertex2f(-3.7 , 0.2); 
    glTexCoord2f(-2.8 , 0.4); glVertex2f(-3.8 , 0.4); 
    glTexCoord2f(-1.8 , 0.7); glVertex2f(-2.8 , 0.7); 
    glTexCoord2f(-1.4 , 0.7); glVertex2f(-2.4 , 0.7); 

    // Windscreen 
    glTexCoord2f(0.0 , 1.0); glVertex2f(-1.0 , 1.0); 
    glTexCoord2f(1.5 , 1.05); glVertex2f(0.5 , 1.05); 
    glTexCoord2f(3.3 , 0.8); glVertex2f(2.3 , 0.8); 

    // Rear bumper 
    glTexCoord2f(3.15, 0.5); glVertex2f(2.15, 0.5); 
    glTexCoord2f(3.15, 0.3); glVertex2f(2.15, 0.3); 
    glTexCoord2f(3.35, 0.3); glVertex2f(2.35, 0.3); 
    glTexCoord2f(3.0 , 0.0); glVertex2f(2.0 , 0.0); 
    glTexCoord2f(2.83, 0.0); glVertex2f(1.83, 0.0); 

    // Wheel arch 
    glTexCoord2f(2.85, 0.3); glVertex2f(1.85, 0.3); 
    glTexCoord2f(2.86, 0.4); glVertex2f(1.86, 0.4); 
    glTexCoord2f(2.6 , 0.6); glVertex2f(1.6 , 0.6); 
    glTexCoord2f(2.2 , 0.6); glVertex2f(1.2 , 0.6); 
    glTexCoord2f(2.0 , 0.4); glVertex2f(1.0 , 0.4); 
    glTexCoord2f(2.0 , 0.3); glVertex2f(1.0 , 0.3); 
    glTexCoord2f(2.05, 0.0); glVertex2f(1.05, 0.0); 

    glEnd(); 
    glDisable(GL_TEXTURE_2D); 
} 
+0

хорошо я не понимаю, последний бит для теперь так плохо сделать немного чтения но что касается первого бита, я изменил все мои координаты на диапазон от 0 до 1, и его все еще немного смешно, я предполагаю, что им соответствуют неправильные текстурные координаты с формой :( –

+0

Я сделал опечатку, я имел в виду , «... конвертировать вогнутые полигоны ...». Не видя смешной формы, я могу только догадываться: возможно, это связано с тем, что контур текстурного автомобиля не идеально согласуется с полигоном. –

+0

он скручивает изображение в заднюю половину фигуры, а затем рекламу ds немного изображения в белое пространство спереди:/ http://i378.photobucket.com/albums/oo230/tcc_hellgate/carnew.png –