OpenGL C ++ - 太阳能系统

时间:2016-04-10 19:16:28

标签: c++ opengl

我已经使用OpenGL和C ++完成了太阳能系统的构建。该系统的特征之一是在每个行星上指向北方的相机位置,其基于行星变换而移动。摄像机的位置是:一个位于顶部,一个位于行星后面,最后一个位于远离行星的位置。还有一些其他功能,但我没有任何问题。

所以,我遇到的问题是,一些行星在他们的中心周围旋转时似乎因某种原因而颤抖。如果我提高旋转的速度,行星将停止颤抖或颤抖变得不明显。整个太阳系完全基于真实纹理和比例空间计算,并且它具有多个摄像头位置,如前所述。

以下是一些可能有助于理解我要实现的目标的代码:

//Caculate the earth postion
GLfloat UranusPos[3] = {Uranus_distance*DistanceScaler * cos(-uranus * M_PI / 180), 0, Uranus_distance*DistanceScaler * sin(-uranus * M_PI / 180)};
//Caculate the Camera Position
GLfloat cameraPos[3] = {Uranus_distance*DistanceScaler * cos(-uranus * M_PI / 180), (5*SizeScaler), Uranus_distance*DistanceScaler * sin(-uranus * M_PI / 180)};
//Setup the camear on the top of the moon pointing 
gluLookAt(cameraPos[0], cameraPos[1], cameraPos[2], UranusPos[0], UranusPos[1], UranusPos[2]-(6*SizeScaler), 0, 0, -1);

SetPointLight(GL_LIGHT1,0.0,0.0,0.0,1,1,.9);
//SetMaterial(1,1,1,.2);
//Saturn Object
// Uranus Planet
UranusObject(  UranusSize * SizeScaler,   Uranus_distance*DistanceScaler,   uranusumbrielmoonSize*SizeScaler,   uranusumbrielmoonDistance*DistanceScaler,   uranustitaniamoonSize*SizeScaler,   uranustitaniamoonDistance*DistanceScaler,   uranusoberonmoonSize*SizeScaler,   uranusoberonmoonDistance*DistanceScaler);

以下是我要调用的行星函数在显示函数中绘制对象:

void UranusObject(float UranusSize, float UranusLocation, float UmbrielSize, float UmbrielLocation, float TitaniaSize, float TitaniaLocation, float OberonSize, float OberonLocation)
{
    glEnable(GL_TEXTURE_2D);
    glPushMatrix();

    glBindTexture( GL_TEXTURE_2D, Uranus_Tex);
    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
    glRotatef( uranus, 0.0, 1.0, 0.0 );
    glTranslatef( UranusLocation, 0.0, 0.0 );
    glDisable( GL_LIGHTING );
    glColor3f( 0.58, 0.29, 0.04 );
    DoRasterString( 0., 5., 0., "     Uranus" );
    glEnable( GL_LIGHTING );
    glPushMatrix();
    // Venus Spinning
    glRotatef( uranusSpin, 0., 1.0, 0.0 );
    MjbSphere(UranusSize,50,50);

    glPopMatrix();
    glDisable(GL_TEXTURE_2D);
    glEnable(GL_TEXTURE_2D);
    glPushMatrix();

    glBindTexture( GL_TEXTURE_2D, Umbriel_Tex);
    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
    glDisable(GL_LIGHTING);
    if (LinesEnabled)
    {
        glPushMatrix();
        gluLookAt( 0.0000001, 0., 0.,     0., 0., 0.,     0., 0., .000000001 );
        DrawCircle(0.0, 0.0, UmbrielLocation, 1000);
        glPopMatrix();
    }
    glEnable( GL_LIGHTING );
    glColor3f(1.,1.,1.);
    glRotatef( uranusumbrielmoon, 0.0, 1.0, 0.0 );
    glTranslatef( UmbrielLocation, 0.0, 0.0 );
    MjbSphere(UmbrielSize,50,50);

    glPopMatrix();
    glDisable(GL_TEXTURE_2D);
    glEnable(GL_TEXTURE_2D);
    glPushMatrix();

    glBindTexture( GL_TEXTURE_2D, Titania_Tex);
    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
    glDisable(GL_LIGHTING);
    if (LinesEnabled)
    {
        glPushMatrix();
        gluLookAt( 0.0000001, 0., 0.,     0., 0., 0.,     0., 0., .000000001 );
        DrawCircle(0.0, 0.0, TitaniaLocation, 1000);
        glPopMatrix();
    }
    glEnable( GL_LIGHTING );
    glColor3f(1.,1.,1.);
    glRotatef( uranustitaniamoon, 0.0, 1.0, 0.0 );
    glTranslatef( TitaniaLocation, 0.0, 0.0 );
    MjbSphere(TitaniaSize,50,50);

    glPopMatrix();
    glDisable(GL_TEXTURE_2D);
    glEnable(GL_TEXTURE_2D);
    glPushMatrix();

    glBindTexture( GL_TEXTURE_2D, Oberon_Tex);
    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
    glDisable(GL_LIGHTING);
    if (LinesEnabled)
    {
        glPushMatrix();
        gluLookAt( 0.0000001, 0., 0.,     0., 0., 0.,     0., 0., .000000001 );
        DrawCircle(0.0, 0.0, OberonLocation, 1000);
        glPopMatrix();
    }
    glEnable( GL_LIGHTING );
    glColor3f(1.,1.,1.);
    glRotatef( uranusoberonmoon, 0.0, 1.0, 0.0 );
    glTranslatef( OberonLocation, 0.0, 0.0 );
    MjbSphere(OberonSize,50,50);

    glPopMatrix();
    glDisable(GL_TEXTURE_2D);
    glPopMatrix();
    glDisable(GL_TEXTURE_2D);
}

最后,以下代码用于太阳能动画的转换计算:

uranus += 0.0119 * TimeControl;

if( uranus > 360.0 )
    uranus -= 360.0;

// Clockwise Rotation
uranusSpin -= 2.39 * TimeControl;
if( uranusSpin <= -360.0 )
    uranusSpin = 0.0;

注意:问题仅发生在4个行星上。

我真的很感激任何可以解决问题的想法。

0 个答案:

没有答案