0

我正在尝试开发空间模拟器。我正在尝试使用太阳作为光源。我的问题是照明剂量按预期工作。也许我对法线使用了错误的计算。我正在使用单个“createsphere”函数来创建一个球体,然后使用不同的坐标和大小来显示它们。问题是屏幕上的所有球体都显示几乎相同的效果(即我只应用了一个光源,但它似乎已应用于所有球体)。而且光线也随着它们旋转。我不确定问题出在哪里......我正在发布我的代码......

球体显示代码

void DisplaySphere_sun (double R, GLuint texture)
{

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

int b,m = 0;
glScalef (0.0125 * R, 0.0125 * R, 0.0125 * R);
glBindTexture (GL_TEXTURE_2D, texture);
glBegin (GL_TRIANGLE_STRIP);


for ( b = 0; b <VertexCount; b++)
{
    /*if((b%3)==0)
    {
        glNormal3f(normal[m].x,normal[m].y,normal[m].z);
        m++;
    }*/

    glTexCoord2f (VERTEX[b].U, VERTEX[b].V);
    /*glNormal3f(-VERTEX[b].X, -VERTEX[b].Y, -VERTEX[b].Z);*/
    glVertex3f (VERTEX[b].Y, VERTEX[b].X, -VERTEX[b].Z);
}

m = 0;

for ( b = 0; b <VertexCount; b++)
{
    /*if((b%3)==0)
    {
        glNormal3f(normal[m].x,normal[m].y,normal[m].z);
        m++;
    }*/

    glTexCoord2f (VERTEX[b].U, -VERTEX[b].V);
/*  glNormal3f(-VERTEX[b].X, -VERTEX[b].Y, -VERTEX[b].Z);*/
    glVertex3f (VERTEX[b].Y, VERTEX[b].X, VERTEX[b].Z);
}


glEnd();
//glRotatef(120,0,0,0);

}

创建球体的代码

void CreateSphere (double R, double X, double Y, double Z) {
int n,m;
double a;
double b;
n = 0;
m = 0;


for( b = 0; b <= 90 - space; b+=space){

for( a = 0; a <= 360 - space; a+=space)
{
    VERTEX[n].X = R * sin((a) / 180 * PI) * sin((b) / 180 * PI) - X;
    VERTEX[n].Y = R * cos((a) / 180 * PI) * sin((b) / 180 * PI) + Y;
    VERTEX[n].Z = R * cos((b) / 180 * PI) - Z;
    VERTEX[n].V = (2 * b) / 360;
    VERTEX[n].U = (a) / 360;

    n++;
    VERTEX[n].X = R * sin((a) / 180 * PI) * sin((b + space) / 180 * PI) - X;
    VERTEX[n].Y = R * cos((a) / 180 * PI) * sin((b + space) / 180 * PI) + Y;
    VERTEX[n].Z = R * cos((b + space) / 180 * PI) - Z;
    VERTEX[n].V = (2 * (b + space)) / 360;
    VERTEX[n].U = (a) / 360;

    n++;
    VERTEX[n].X = R * sin((a + space) / 180 * PI) * sin((b) / 180 * PI) - X;
    VERTEX[n].Y = R * cos((a + space) / 180 * PI) * sin((b) / 180 * PI) + Y;
    VERTEX[n].Z = R * cos((b) / 180 * PI) - Z;
    VERTEX[n].V = (2 * b) / 360;
    VERTEX[n].U = (a + space) / 360;
    n++;


    VERTEX[n].X = R * sin((a + space) / 180 * PI) * sin((b + space) /180 * PI) - X;
    VERTEX[n].Y = R * cos((a + space) / 180 * PI) * sin((b + space) /180 * PI) + Y;
    VERTEX[n].Z = R * cos((b + space) / 180 * PI) - Z;
    VERTEX[n].V = (2 * (b + space)) / 360;
    VERTEX[n].U = (a + space) / 360;
n++;
}

}
}

和照亮太阳的代码

glPushMatrix();

 gluLookAt (0.0, 10.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0); //defines a viewing transformation.

 // Now translate to the sun 

  glTranslatef(0.0, -7.0, 3.0);

  /* For LIGHT0 */

 GLfloat lightZeroPosition[] = {0.0f, 0.0f, 0.0f, 1.0f};

 /*GLfloat lightvec[] = {0.5f, 0.2f, 0.0f, 1.0f};*/

 GLfloat lightZeroColor[] = {0.5f, 0.5f, 0.5f, 1.0f};


 GLfloat amb[] = {1, 1, 1, 1};

 GLfloat spec[] = {0.3, 0.3, 0.3, 1};

 glLightfv(GL_LIGHT0, GL_POSITION, lightZeroPosition);

 glLightfv(GL_LIGHT0, GL_DIFFUSE, lightZeroColor);

 glLightfv(GL_LIGHT0, GL_SPECULAR, spec);

  glEnable(GL_LIGHT0);

 glRotatef(angle,0,0,1);

 DisplaySphere(5,textures);

// function to display the sun

 glPopMatrix();
4

1 回答 1

1

我有点纳闷,为什么不把太阳画在太阳系的原点?太阳是一颗恒星,恒星承载了其恒星系统质量的 95% 以上,因此对于大多数行星来说,整个物体的重心都在太阳内部(只有木星的质量如此之大,以至于它的重心稍微移动了一点)在太阳的光球半径之外)。

至于您的照明问题,通常不会照亮光源。画太阳的时候关灯就行了。然后在绘制行星时将光源放在太阳内。OpenGL 不是一个全局渲染器,也就是说,在你绘制了一些东西之后,它会完全忘记它,即你不会在你绘制的东西之间得到任何光照交互(也意味着,没有免费的阴影)。

这就是我绘制太阳系的方式(伪代码):

draw_solar_system():
    glPushMatrix()

    glDisable(GL_LIGHTING)
    draw_origin_sphere(sun_radius)

    glEnable(GL_LIGHTING)
    glLightfv(GL_LIGHT0, GL_POSITION, (0., 0., 0., 1.))
    glLightfv(GL_LIGHT0, GL_DIFFUSE, (1., 1., 1., 1.))
    glLightfv(GL_LIGHT0, GL_AMBIENT, (0., 0., 0., 1.))

    for p in planets:
        glPushMatrix()

        glRotatef(p.orbital_inclination, p.axis_of_orbital_inclination)
        glRotatef(p.orbital_angle, 0., 1., 0.)
        glTranslatef(p.orbit_radius, 1., 0. 0.)
        glRotate(p.axial_of_inclination, p.axis_of_axis_inclination)
        glRotate(p.time_of_day, 0., 1., 0.)

        draw_origin_sphere(p.radius)

        glPopMatrix()
    glPopMatrix()
于 2011-11-28T09:13:02.497 回答