c++ - Sun 作为光源使用 opengl 和 c++

标签 c++ opengl lighting

我正在研究太阳系,我试图让太阳成为这个程序的中心光源,但它并没有像我想象的那样工作。

这是我没有照明的照片。 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;

接下来的两个函数负责坐标和绘制球体

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

}

如果我对我正在做的事情偏离了方向,你能给我指一个好的教程吗?我读过一些,但我想我并不像我想的那样理解它们。 如果我走上正轨,你能告诉我我错在哪里以及我需要做些什么吗?

最佳答案

您需要调用glLightfv(GL_LIGHT0, GL_POSITION, pos);并将光源的位置设置为太阳的中心。

关于c++ - Sun 作为光源使用 opengl 和 c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16723524/

相关文章:

c++ - OpenMP 隐式屏障

c++ - C++ 中的多重定义错误,即使我没有包含多个文件

c++ - 将 C++ 静态成员函数声明为其所在类的友元(语法)

在没有 XCode 的情况下使用 CGL/NSOpenGL 在 OSX 上使用 OpenGL 的 C++ 代码?

java - 为什么当我缩放多边形时我的光强度会改变?

c++ - 镜面反射分量不正确的法线贴图和 phong 着色

c++ - 哪个是最好的、标准的(希望是免费的)C++ 编译器?

无法链接程序,glLinkProgram() 给我 GL_INVALID_OPERATION

c++ - 球体的 OpenGL UV 贴图(有接缝)

java - 正确光线追踪反射表面