2016-11-21 2 views
1

Он рисует цилиндр со стеками и краями, но проблема в том, что стеки подключены к одной точке, а не к новой. Может быть, картина будет показывать лучше: CylinderЦилиндр с треугольниками в OpenGL

А вот как я рендеринга на стороне, потому что диски предоставляются отдельно:

for (int i = 1; i <= height; ++i) { 
     for (int j = 0; j < edges; ++j) { 
      glBegin(GL_TRIANGLES); { 
       // 0 bottom 
       glVertex3f(x + radius * cos(theta + interval), y , z + radius * sin(theta + interval)); 
       // 1 bottom 
       glVertex3f(x + radius * cos(theta), y + y_value * i, z + radius * sin(theta)); 
       // 2 top 
       glVertex3f(x + radius * cos(theta), y + y_value * i, z + radius * sin(theta)); 
       // 2 top 
       glVertex3f(x + radius * cos(theta), y + y_value * i, z + radius * sin(theta)); 
       // 3 top 
       glVertex3f(x + radius * cos(theta + interval), y + y_value * i, z + radius * sin(theta + interval)); 
       // 0 bottom 
       glVertex3f(x + radius * cos(theta + interval), y , z + radius * sin(theta + interval)); 
      } glEnd(); 
      theta += interval; 
     } 
     theta = 0.0; 
    } 

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

ОБНОВЛЕНИЕ: Я изменил его для рендеринга с помощью квадроциклов, используя совет ybungalobill. Теперь я борюсь с УФ-картографированием. И, надеюсь, когда эта часть будет решена, будет легко конвертироваться в треугольники. Вот что я сейчас: enter image description here

И вот код, я использую для УФ отображения:

u = 0.0, 
v = 0.0, 
u_inter = 1.0/edges, 
v_inter = 1.0/y_value; // (y_value = height/edges) 

    for (int i = 1; i <= height; ++i) { 
     for (int j = 0; j < edges; ++j) { 
      glBegin(GL_QUAD_STRIP); { 
       // 0 bottom 
       glTexCoord2f(u, v); 
       // 1 bottom 
       glTexCoord2f(u + u_inter, v); 
       // 2 top 
       glTexCoord2f(u + u_inter, v + v_inter); 
       // 3 top 
       glTexCoord2f(u, v + v_inter); 
      } glEnd(); 
      theta += interval; 
      u += u_inter; 
     } 
     v += v_inter; 
     theta = 0.0; 
    } 

ответ

1
float y0 = y + y_value * (i-1); 
float y1 = y + y_value * i; 
// 0 bottom 
glVertex3f(x + radius * cos(theta + interval), y0, z + radius * sin(theta + interval)); 
// 1 bottom 
glVertex3f(x + radius * cos(theta), y0, z + radius * sin(theta)); 
// 2 top 
glVertex3f(x + radius * cos(theta), y1, z + radius * sin(theta)); 
// 2 top 
glVertex3f(x + radius * cos(theta), y1, z + radius * sin(theta)); 
// 3 top 
glVertex3f(x + radius * cos(theta + interval), y1, z + radius * sin(theta + interval)); 
// 0 bottom 
glVertex3f(x + radius * cos(theta + interval), y0, z + radius * sin(theta + interval)); 
+0

Спасибо! Работает! – carrotcake

+0

На самом деле мне пришлось изменить y0 в // 1 до y1, но я думаю, что понимаю, что вы там делали. – carrotcake

+0

Странно, потому что у вас должно быть три вершины сверху и внизу. – ybungalobill

Смежные вопросы