2015-10-13 70 views
1

我正在嘗試使用OpenGL繪製一個空心圓柱體。 (火箭的身體)我目前使用GL_TRIANGLE_STRIP來做到這一點。OpenGL:三角帶環 - 如何繪製圓柱體?

這是我生成我的「頂點」:

GLfloat *rocket_body_verticies = new GLfloat[3 * 20]; 
for(int i = 0; i < 20; ++ i) 
{ 
    const GLdouble step = 2.0 * CONST_PI/(double)(20); 
    rocket_body_verticies[3 * i + 0] = 0.25 * std::cos(i * step); 
    rocket_body_verticies[3 * i + 1] = 0.25 * std::sin((i * step + 0.5 * step)); 
    rocket_body_verticies[3 * i + 2] = 1.0 * (i % 2 == 0 ? -0.5 : 0.5); 
} 

我然後繪製此稍後使用:(使緩衝對象等之後)

glDrawArrays(GL_TRIANGLE_STRIP, 0, 20); 

這將產生一個三角形帶,但並未加入「火箭體」的最後部分。沒有畫出圓柱體的矩形切片。

我可以通過將for循環索引i中的「20」更改爲「22」來更正此問題。或者我可以將步驟更改爲:step = 2.0 * PI/18.0。因此,我會在其他要點上畫點。這似乎可能不是最好的方法。

有沒有更好的方法可以使用?我相當確定沒有這樣的對象,如TRIANGLE_STRIP_LOOP

回答

2

我可以通過在for循環索引i中將「20」更改爲「22」來解決此問題。或者我可以將步驟更改爲:step = 2.0 * PI/18.0。因此,我會在其他要點上畫點。這似乎可能不是最好的方法。

您需要重複氣缸的兩個起點關閉它。您可以通過重複頂點(對於像這樣的簡單模型非常容易和最小的影響)或使用元素緩衝區多次指定頂點(對於更復雜的頂點更常複製的模型更好,這不是更好這裏的情況)。

+0

'glDrawElements'如何提供幫助?我對文檔有點困惑 - 它看起來跟我的'glDrawArrays'一樣 – user3728501

+1

@ user3728501 https://open.gl/drawing#Elementbuffers它接受一個元素緩衝區,用於索引頂點數據,允許頂點重複。 –

+0

啊,對,我有點看到這是怎麼回事 – user3728501