Солнце как источник света с использованием opengl и Stack Overflow

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

Вот картинка того, что у меня без освещения.
введите описание изображения здесь

Вот та же программа с освещением.

введите описание изображения здесь

Здесь другой угол, чтобы вы могли видеть, что на Земле нет тени, как это должно быть (игнорируйте красный цвет на Луне, это для моей справки)

введите описание изображения здесь

Я не знаю, можете ли вы сказать, но похоже, что свет сосредоточен в каждой сфере, а не на Солнце.
Тень на Земле, как будто свет шел сверху. То же самое с Солнцем. Солнце здесь не является источником света, это просто сфера, которая также освещается каким-то источником. Нет тени от Земли на Луне или от Луны на Земле.

Это вот код, который рисует систему

GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat pos[] = { 0.0, 0.0, 1.0, 0.0 };
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightf(GL_LIGHT0, GL_POSITION, pos);
//SUN
//Picture location, major radius, minor radius, major orbit, minor orbit, angle
Planet Sun ("/home/rodrtu/Desktop/SolarSystem/images/Sun.png",
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
Planet Earth ("/home/rodrtu/Desktop/SolarSystem/images/EarthTopography.png",
50, 49, 500.0, 450.0, 23.5);
double eaOrbS = orbitSpeed*2;
double eaRotS = rotatSpeed*5;

Earth.displayPlanet(eaOrbS, eaRotS, 0.0, 0.0);
//Orbit path
drawCircle(800, 720, 1, 50);

//EARTH'S MOON
Planet Moon ("/home/rodrtu/Desktop/SolarSystem/images/moonTest.png",
25, 23, 100.0, 100.0, 15);
double moOrbS = rotatSpeed*4;
double moRotS = eaOrbS;

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

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

rotatSpeed+=2.0;
if (rotatSpeed > 719.0)
rotatSpeed = 0.0;

Следующие две функции отвечают за координаты и рисование сфер

void Planet::setOrbit(double orbitSpeed, double rotationSpeed,
double moonOrbitX, double moonOrbitY)
{
majorAxis = orbitSemiMajor * cos(orbitSpeed / 180.0 * Math::Constants<double>::pi);
minorAxis = orbitSemiMinor * sin(orbitSpeed / 180.0 * Math::Constants<double>::pi);

glTranslate(majorAxis+moonOrbitX, minorAxis+moonOrbitY, 0.0);
glRotatef(orbitAngle, 0.0, 1.0, 1.0);
glRotatef(rotationSpeed, 0.0, 0.0, 1.0);

}

void Planet::displayPlanet(double orbitSpeed,double rotationSpeed,
double moonOrbitX, double moonOrbitY)
{
GLuint surf;
Images::RGBImage surfaceImage;
surfaceImage=Images::readImageFile(texture);
glEnable(GL_TEXTURE_2D);
glGenTextures(0, &surf);
glBindTexture(GL_TEXTURE_2D, surf);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
surfaceImage.glTexImage2D(GL_TEXTURE_2D,0,GL_RGB);

glPushMatrix();
setOrbit(orbitSpeed,rotationSpeed, moonOrbitX, moonOrbitY);
drawSolidPlanet(equatRadius, polarRadius, 1, 40, 40);
glPopMatrix();

}

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

7

Решение

Вам нужно позвонить glLightfv(GL_LIGHT0, GL_POSITION, pos); и установите положение источника света в центре солнца.

3

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

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

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