2013-05-29 2 views
1

Я пытаюсь создать фон своей солнечной системы с помощью skybox; однако он не выводит то, что я думал.Проблемы с skybox с использованием opengl C++

Прежде всего, проблема с отображением. На рисунках ниже показана проблема, с которой я сталкиваюсь. enter image description here

различный угол: enter image description here

другой угол: enter image description here

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

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

Вот код, который я использую для визуализации skybox и солнечной системы. (Держать в моем, что солнечная система работает так, как я предполагал ее)

это код скайбокса:

void Skybox::displaySkybox() 
{ 

    Images::RGBImage test[6]; //6 pictures for 6 sides 
    test[0]=Images::readImageFile(fileName); //I'll only use one for testing purposes 
    glEnable(GL_TEXTURE_2D); 
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    test[0].glTexImage2D(GL_TEXTURE_2D,0,GL_RGB); 

    // Save Current Matrix 
    glPushMatrix(); 

    // Second Move the render space to the correct position (Translate) 
    glTranslatef(0,0,0); 

    // First apply scale matrix 
    glScalef(10000,10000,10000); 

    float cz = -0.0f,cx = 1.0f; 
    float r = 1.0f; // If you have border issues change this to 1.005f 
    // Common Axis Z - FRONT Side 

    glBegin(GL_QUADS); 
     glTexCoord2f(cx, cz); glVertex3f(-r,1.0f,-r); 
     glTexCoord2f(cx, cx); glVertex3f(-r,1.0f, r); 
     glTexCoord2f(cz, cx); glVertex3f(r,1.0f, r); 
     glTexCoord2f(cz, cz); glVertex3f(r,1.0f,-r); 
    glEnd(); 

    // Common Axis Z - BACK side 

    glBegin(GL_QUADS);  
     glTexCoord2f(cx,cz); glVertex3f(-r,-1.0f,-r); 
     glTexCoord2f(cx,cx); glVertex3f(-r,-1.0f, r); 
     glTexCoord2f(cz,cx); glVertex3f(r,-1.0f, r); 
     glTexCoord2f(cz,cz); glVertex3f(r,-1.0f,-r); 
    glEnd(); 

// Common Axis X - Left side 

glBegin(GL_QUADS);  
    glTexCoord2f(cx,cx); glVertex3f(-1.0f, -r, r); 
    glTexCoord2f(cz,cx); glVertex3f(-1.0f, r, r); 
    glTexCoord2f(cz,cz); glVertex3f(-1.0f, r,-r); 
    glTexCoord2f(cx,cz); glVertex3f(-1.0f, -r,-r);  
glEnd(); 

// Common Axis X - Right side 

glBegin(GL_QUADS);  
    glTexCoord2f(cx, cx); glVertex3f(1.0f, -r, r); 
    glTexCoord2f(cz, cx); glVertex3f(1.0f, r, r); 
    glTexCoord2f(cz, cz); glVertex3f(1.0f, r,-r); 
    glTexCoord2f(cx, cz); glVertex3f(1.0f, -r,-r); 
glEnd(); 

// Common Axis Y - Draw Up side 

glBegin(GL_QUADS);  
    glTexCoord2f(cz, cz); glVertex3f(r, -r, 1.0f); 
    glTexCoord2f(cx, cz); glVertex3f(r, r, 1.0f); 
    glTexCoord2f(cx, cx); glVertex3f(-r, r, 1.0f); 
    glTexCoord2f(cz, cx); glVertex3f(-r, -r, 1.0f); 
glEnd(); 

// Common Axis Y - Down side 

glBegin(GL_QUADS);  
    glTexCoord2f(cz, cz); glVertex3f(r, -r, -1.0f); 
    glTexCoord2f(cx, cz); glVertex3f(r, r, -1.0f); 
    glTexCoord2f(cx, cx); glVertex3f(-r, r, -1.0f); 
    glTexCoord2f(cz, cx); glVertex3f(-r, -r, -1.0f); 
glEnd(); 

// Load Saved Matrix 
glPopMatrix(); 


} 

Вот код для Солнечной системы:

void SolarSystem::display(GLContextData& contextData) const 
{ 

glDisable(GL_LIGHTING); 
Skybox test("images/test.jpg"); 
test.displaySkybox(); 

drawCircle(800, 720, 2, 100); 
//SUN 
     //Picture location, major radius, minor radius, major orbit, minor orbit, angle 
Planet Sun ("images/Sun.jpg", 
       100, 99, 200.0, 0.0, 0.0); 
double sunOrbS = 0; 
double sunRotS = rotatSpeed/10; 

//orbit speed, rotation speed, moon reference coordinates (Parent planet's major and minor Axis) 
Sun.displayPlanet(sunOrbS, sunRotS, 0.0, 0.0); 


//EARTH 

GLfloat light_diffuse[] = { 1.5, 1.5, 1.5, 1.5 }; 
GLfloat pos[] = { 200.0, 0.0, 0.0, 1.0}; 
glEnable(GL_LIGHTING); 
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); 
glLightfv(GL_LIGHT0, GL_POSITION, pos); 


Planet Earth ("images/earth.jpg", 
      50, 49, 500.0, 450.0, 23.5); 
double eaOrbS = orbitSpeed; 
double eaRotS = rotatSpeed*3; 

Earth.displayPlanet(eaOrbS, eaRotS, 0.0, 0.0); 


//EARTH'S MOON 
Planet Moon ("images/moon.jpg", 
      25, 23, 100.0, 100.0, 15); 
double moOrbS = rotatSpeed*4; 
double moRotS = eaOrbS; 

Moon.displayPlanet(moOrbS, moRotS, Earth.getMajorAxis(), Earth.getMinorAxis()); 

orbitSpeed+=.3; 
if (orbitSpeed > 359.0) 
orbitSpeed = 0.0; 


rotatSpeed+=1.0; 
if (rotatSpeed > 7190.0) 
rotatSpeed = 0.0; 


} 
+0

Как только вы получите все, что вам нужно, вы не хотите, чтобы переводы влияли на ваш skybox. Только вращение. Перемещение слишком много внутри skybox может заставить вещи выглядеть действительно странно. – Grimmy

+0

Что вы имеете в виду? – TRod

ответ

2
void Skybox::displaySkybox() 
{ 
    ... 
    glPushMatrix(); 
    ... 
    glPushMatrix(); 
    ... 
    glPopMatrix(); 
    ... 
    // huh? where's the second glPopMatrix()? 
} 

Не делайте этого. Удостоверьтесь, что вы Pop столько, сколько вы Push.

+0

Я исправил его. Я попробовал что-то между двумя «Push», но это не сработало, поэтому я удалил его и забыл удалить его. Спасибо, что поймали его. Это позаботилось о проблеме переполнения стека. – TRod

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