2013-04-18 56 views
0

我一直在嘗試使用各種代碼片斷在線代碼opengl中的球體,但運行代碼後,這是一個流浪的頂點,我不知道我的代碼在哪裏錯過了它:OpenGL頂點數組球面散射頂點

enter image description here

CODE:

float Lats = 1/(float)(longitude-1); 
    float Longs = 1/(float)(latitude-1); 

    int r,s; 

    vector<GLfloat> vertices; 
    vector<GLfloat> normals; 
    vector<GLfloat> texcoords; 
    vector<GLushort> indices; 

    for(r = 0; r < longitude; r++) 
    { 
     for(s = 0; s < latitude; s++) 
     { 
      float const x = cos(2*M_PI * s * Longs) * sin(M_PI * r * Lats); 
      float const y = sin(-M_PI_2 + M_PI * r * Lats); 
      float const z = sin(2*M_PI * s * Longs) * sin(M_PI * r * Lats); 

      vertices.push_back(x * getR()); 
      vertices.push_back(y * getR()); 
      vertices.push_back(z * getR()); 

      normals.push_back(x); 
      normals.push_back(y); 
      normals.push_back(z); 

      texcoords.push_back(s*Lats); 
      texcoords.push_back(r*Longs); 
     } 
    } 

    for(r = 0; r < longitude; r++) 
    { 
     for(s = 0; s < latitude; s++) 
     { 
      indices.push_back(r * latitude + s); 
      indices.push_back(r * latitude + (s+1)); 
      indices.push_back((r+1) * latitude + (s+1)); 
      indices.push_back((r+1) * latitude + s); 
     } 
    } 

任何人都可以看到我在哪裏呢?

+0

我們可以看到完整的渲染代碼?也許當你畫線(我假設你使用glBegin/glEnd原語?)時,第一個點不是你定義的圓的第一個頂點,而是(0,0,0)頂點,無論出於何種原因。 – Tuxer

+0

我正在使用GL_QUADS繪圖的頂點數組 – Split

回答

1

你是計算,

float Lats = 1/(float)(longitude-1); 
float Longs = 1/(float)(latitude-1); 

球體的北極由0

更新

導致分裂你的代碼再次找我後認爲這個問題可能會更微妙一些。

我們假定你是

2*M_PI/* double */ * (latitude - 1)/*int*/ * 1/(float)(latitude - 1)/*float*/ == 2*M_PI 

因爲那可能不是真正的浮動點的問題。這適用於sin()中的所有其他表達式()& cos()

可能您正在處理精度損失。

由於它是確定性的,你甚至可以在最後手動修復它。這仍然適用。

有趣的是你的正面,背面顏色編碼清楚地表明這個問題,有一個「結」在頂部

+0

嗨,感謝您的回覆。我不確定這是否經度/緯度永遠不會是1,所以lats和longs永遠不會是1/0,球體上有一個紋理來解釋顏色。如果您願意,我可以張貼另一張沒有紋理的照片嗎? – Split

+0

@Split是的,請張貼清晰的圖像。 –

+0

已經這樣做:) – Split