Ich arbeite an dem Sonnensystem und ich versuche, die Sonne zu der zentralen Lichtquelle dieses Programms zu machen, aber es funktioniert nicht so, wie ich dachte.Sonne als Lichtquelle mit OpenGL und C++
Hier ist ein Bild von dem, was ich ohne Beleuchtung habe.
Hier ist das gleiche Programm mit Beleuchtung.
Ein anderer Winkel hier so, dass sich die Erde hat keinen Schatten sehen kann, wie es soll (die rote auf dem Mond ignorieren, das ist für meine Referenz)
Ich weiß nicht, ob du es sehen kannst, aber es sieht so aus, als ob das Licht in jeder Kugel zentriert ist und nicht in der Sonne. Der Schatten auf der Erde ist so, als würde das Licht von oben kommen. Gleich mit der Sonne. Die Sonne ist hier keine Lichtquelle, es ist nur eine Kugel, die auch von irgendeiner Quelle beleuchtet wird. Es gibt keinen Schatten von der Erde auf dem Mond oder vom Mond auf der Erde.
Das hier ist der Code, der das System
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;
Diese beiden nächsten Funktionen sind verantwortlich für die Koordinaten zieht und zeichnen die Kugeln
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();
}
Wenn ich weg auf bin, was ich tue, Könntest du mich auf ein gutes Tutorial hinweisen? Ich habe ein paar gelesen, aber ich glaube, ich habe sie nicht so verstanden, wie ich gedacht habe. Wenn ich auf dem richtigen Weg bin, könntest du mir zeigen, wo ich falsch liege und was ich tun muss, richtig?
Das sieht für mich gut aus, was genau willst du erreichen? Ich habe vielleicht nicht richtig verstanden. –
Ich werde hier ein anderes Bild machen ... Das Licht der Erde kommt nicht von der Sonne. – TRod
Oh, du meinst einen Schatten vom Mond auf der Erde. Es war schwer von dem Bild zu unterscheiden. –