Проблемы со скайбоксом при использовании OpenGL Stack Overflow

Я пытаюсь создать фон моей солнечной системы, используя скайбокс; однако это не выводит то, что я думал, что это будет.

Прежде всего, проблема отображения. Изображения ниже показывают проблему, с которой я столкнулся.
введите описание изображения здесь

другой угол:
введите описание изображения здесь

другой угол:
введите описание изображения здесь

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

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

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

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

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;}

1

Решение

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]