2014-11-17 2 views
4

Я хочу нарисовать сферу с помощью VBO для координат вершин, цветов и UV для текстуры. Моя проблема в том, что сфера не «закрыта», есть дыра в начале координат. Я знаю, что это связано с тем, что мой код зависит от (1/сегментов) расстояния между каждой вершиной; Я работаю с сегментами = 40. Я знаю, что если я подниму это значение, отверстие будет ниже, но программа будет медленнее. Я не знаю, есть ли способ устранить дыру без повышения переменной.Неполная сфера OpenGL

Вот код:

for(int i = 0; i <= segments; i++){ 

    double lat0 = pi * (-0.5 + (double)(i - 1)/segments); 
    double z0 = sin(lat0); 
    double zr0 = cos(lat0); 
    // lat1 = [-pi/2..pi/2] 
    double lat1 = pi * (-0.5 + (double)i/segments); 
    double z1 = sin(lat1); 
    double zr1 = cos(lat1); 

    for (int j = 0; j <= segments; j++){ // Longitud 
     // lng = [0..2*pi] 
     double lng = 2 * pi * (double)(j - 1)/segments; 
     double x = cos(lng); 
     double y = sin(lng); 
     //glNormal3f(x * zr0, y * zr0, z0); // Normals 
     ballVerts.push_back(x * zr0); //X 
     ballVerts.push_back(y * zr0); //Y 
     ballVerts.push_back(z0);  //Z 

     ballVerts.push_back(0.0f); 
     ballVerts.push_back(0.0f); 
     ballVerts.push_back(0.0f); 
     ballVerts.push_back(1.0f); //R,G,B,A 

     texX = abs(1 - (0.5f + atan2(z0, x * zr0)/(2.0 * pi))); 
     texY = 0.5f - asin(y * zr0)/pi; 
     ballVerts.push_back(texX); // Texture coords 
     ballVerts.push_back(texY); // U, V 


     //glNormal3f(x * zr1, y * zr1, z1); //Normals 
     ballVerts.push_back(x * zr1); //X 
     ballVerts.push_back(y * zr1); //Y 
     ballVerts.push_back(z1);  //Z 
     ballVerts.push_back(0.0f); 
     ballVerts.push_back(0.0f); 
     ballVerts.push_back(1.0f); 
     ballVerts.push_back(1.0f); //R,G,B,A 

     texX = abs(1 - (0.5f + atan2(z1, x * zr1)/(2.0 * pi))); 
     texY = 0.5f - asin(y * zr1)/pi; 
     ballVerts.push_back(texX); // Texture coords 
     ballVerts.push_back(texY); 

    } 
} 
// Create VBO.... 

И это выход у меня есть:

enter image description here

ответ

2

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

for(int i = 0; i <= segments; i++){ 
    double lat0 = pi * (-0.5 + (double)(i - 1)/segments); 

В первой итерации цикла, с i = 0, угол будет меньше, чем -0.5 * pi , в результате чего добавляются дополнительные треугольники, показанные на картинке.

Если вы хотите разделить диапазон широты на segments штук, вам нужно всего лишь пройти через внешний контур segments раз. С кодом выше, с циклом от 0 до и включая segments, вы повторяете segments + 1 раз.

Самый простой способ исправить это, чтобы начать цикл в 1:

for(int i = 1; i <= segments; i++){ 
    double lat0 = pi * (-0.5 + (double)(i - 1)/segments); 

я бы, вероятно, петли от 0 и сделать конец исключительным, и изменить расчеты угла. Но это действительно эквивалентно:

for(int i = 0; i < segments; i++){ 
    double lat0 = pi * (-0.5 + (double)/segments); 
    ... 
    double lat1 = pi * (-0.5 + (double)(i + 1)/segments); 
+0

Большое спасибо! Это было очень легко понять! Теперь я это вижу. – MikeFadeCrew

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