2013-05-23 26 views
7

私は太陽系に取り組んでいます。太陽をこのプログラムの中心的な光源にしようとしていますが、それは私が思ったように動作しません。OpenGLとC++を使ったSunの光源

私は照明なしで何を持っているかの写真です。 enter image description here

照明付きの同じプログラムです。

enter image description here

あなたはそれが想定されて地球が何の影を持っていないことを確認できるように、ここでは異なる角度

enter image description here

(月面赤を無視するが、それは私の参照のためです)あなたが知ることができるかどうかはわかりませんが、光は太陽の中でなく各球の中心にあるように見えます。 地球上の影は、光が上から来ているかのようです。太陽と同じです。ここの太陽は光源ではなく、ある種の光源によっても照らされている球です。地球上の月や月の影はありません。

これここでは

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

} 

私は私がやっているものに道オフだ場合私は良いチュートリアルを教えてくれますか?私はいくつかを読んだことがあると思ったが、私はそれらを理解していなかったと思う。 私が進んでいる場合は、私が間違っている場所と私が正しいことをする必要がある場所を私に見せてもらえますか?

+0

これは私にはうまく見えますが、正確に達成しようとしているのは何ですか?私は正しく理解していないかもしれません。 –

+0

私はここに別の写真を置くでしょう...地球の光は太陽から来ていません。 – TRod

+0

ああ、あなたは地球上の月の影を意味します。写真からは分かりづらい。 –

答えて

3

glLightfv(GL_LIGHT0, GL_POSITION, pos);に電話をかけ、光源の位置を太陽の中心に設定する必要があります。

+0

どのような変数が 'pos'ですか?私はこれを行うとエラーが発生し続けます。 以下のエラー: メンバー関数 'virtual void SolarSystem :: display(GLContextData&)const': solarSystem.cpp:31:40:エラー: 'float'を 'const GLfloat * {aka const float *}'に変換できません引数 '3'を 'void glLightfv(GLenum、GLenum、const GLfloat *)'に設定します。 make:*** [o/g ++ - 3.g0.O3/solarSystem.o]エラー1 – TRod

+2

位置のWコンポーネントはしかし、言及することも重要です。位置のw成分が0の場合、光源は指向性光源として扱われます。 – Grimmy

+0

http://www.khronos.org/opengles/sdk/1.1/docs/man/glLight.xml – Grimmy

関連する問題