7

私は太陽系に取り組んでおり、太陽をこのプログラムの中心的な光源にしようとしていますが、思ったように機能していません。

これは私が照明なしで持っているものの写真です。 ここに画像の説明を入力

これは、照明を使用した同じプログラムです。

ここに画像の説明を入力

ここで別の角度から、地球には想定どおりに影がないことがわかります (月の赤は無視してください。これは参照用です)。

ここに画像の説明を入力

わかるかどうかわかりませんが、光は太陽ではなく、各球の中心にあるように見えます。地球の影は、あたかも上から光が差し込んでいるかのようです。太陽と同じ。ここでの太陽は光源ではなく、何らかの光源によって照らされている単なる球体です。月には地球からの影も、地球には月からの影もありません。

これは、システムを描画するコードです

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;

これらの次の 2 つの関数は、座標と球体の描画を担当します。

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();

}

私がやっていることから離れている場合は、良いチュートリアルを教えてもらえますか? いくつか読んだが、思ったほど理解できなかったようだ。順調に進んでいる場合は、どこが間違っているのか、何を正しく行う必要があるのか​​を教えていただけますか?

4

1 に答える 1

3

glLightfv(GL_LIGHT0, GL_POSITION, pos);光源の位置を太陽の中心に呼び出して設定する必要があります。

于 2013-05-23T20:56:18.153 に答える