2012-10-18 29 views
1

程序應該模擬繞另一個星球旋轉的行星。
我使用gltranslatef讓行星繞着更大的行星移動,但問題在於行星應該隱藏在更大的行星上,因爲dz是-0.5。
但是如果我測試程序,我總是看到藍色的那顆紅色星球。
我有另一個問題:地球旋轉得太快,我該如何減慢它?Delta zeta不適用gltranslatef

#include <OpenGL/OpenGL.h> 
#include <GLUT/GLUT.h> 
#include "utility.h" 

GLfloat dx=0.0; 
GLfloat dz=-0.5; 
bool plus=true; 

void init() 
{ 
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 
    glLoadIdentity(); 
    glOrtho(-1, 1, -1, 1, -1, 1); 
    glEnable(GLUT_DEPTH); 
} 

void render() 
{ 
    glClearColor(BLACK); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor4f(BLUE); 
    glutWireSphere(0.25, 100, 100); 
    glPushMatrix(); 
    glLoadIdentity(); 
    glTranslatef(-0.5+dx, 0.0, -dz); 
    glColor4f(RED); 
    glutWireSphere(0.05, 100, 100); 
    glPopMatrix(); 
    glFlush(); 
} 


void idle() 
{ 
    if(plus) 
    { 
     dx+=0.05; 
    } 
    else 
    { 
     dx-=0.05; 
    } 
    if(dx>=1.0) 
    { 
     dx=0.5; 
     plus=false; 
    } 
    else if(dx<=-0.0) 
    { 
     dx=0.0; 
     plus=true; 
    } 
    glutPostRedisplay(); 
} 



int main(int argc, const char * argv[]) 
{ 
    glutInit(&argc, (char**)argv); 
    glutInitWindowSize(500, 500); 
    glutInitWindowPosition(150, 150); 
    glutInitWindowPosition(0, 0); 
    glutCreateWindow("Simple"); 
    glutIdleFunc(idle); 
    init(); 
    glutDisplayFunc(render); 
    glutMainLoop(); 
    return 0; 
} 

我沒有理解以及如何在空閒功能的工作,爲什麼它被調用這麼多次?我能不能選擇一個時間間隔來調用閒置函數?

更多信息:RED和BLUE是RGB浮動,在utility.h頭文件中定義。
plus是一個bool,用於瞭解是否必須減少或增加dx。

+1

'GLUT_D EPTH'從來沒有成爲'glEnable()'的有效參數。 – genpfault

回答

3

這給一個鏡頭:

#include <GL/glut.h> 

double GetSeconds() 
{ 
    return glutGet(GLUT_ELAPSED_TIME)/1000.0f; 
} 

void render() 
{ 
    glClearColor(0,0,0,0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glColor3ub(0,0,255); 
    glutWireSphere(0.25, 100, 100); 

    glPushMatrix(); 
    glLoadIdentity(); 

    static double prv = GetSeconds(); 
    double cur = GetSeconds(); 
    double delta = cur - prv; 
    prv = cur; 

    const float DEG_PER_SEC = 60.0f; 
    static float angle = 0.0f; 
    angle += DEG_PER_SEC * delta; 
    while(angle > 360) angle -= 360; 

    glPushMatrix(); 
    glRotatef(angle, 0, 1, 0); 
    glTranslatef(0.5, 0, 0); 
    glColor3ub(255,0,0); 
    glutWireSphere(0.05, 100, 100); 
    glPopMatrix(); 

    glutSwapBuffers(); 
} 

void reshape(int w, int h) 
{ 
    glViewport(0,0,w,h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-1, 1, -1, 1, -1, 1); 
} 

void timer(int extra) 
{ 
    glutPostRedisplay(); 
    glutTimerFunc(16, timer, 0); 
} 

int main(int argc, const char * argv[]) 
{ 
    glutInit(&argc, (char**)argv); 
    glutInitWindowSize(500, 500); 
    glutInitWindowPosition(150, 150); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 
    glutCreateWindow("Simple"); 
    glutReshapeFunc(reshape); 
    glutTimerFunc(0, timer, 0); 
    glutDisplayFunc(render); 

    glEnable(GL_DEPTH_TEST); 

    glutMainLoop(); 
    return 0; 
} 

重要部分:

  • 明確glMatrixMode()電話

  • 調用glutInitDisplayMode()glutCreateWindow()

  • 雙緩衝需要glutSwapBuffers()

  • 經由GL_DEPTH_BUFFER_BIT

  • glEnable(GL_DEPTH_TEST)

  • glRotatef()清除深度緩衝器,用於行星旋轉

  • 基於定時器的動畫

+0

謝謝,我研究了你的代碼,現在我可以自己編寫代碼。 –