2016-06-09 88 views
1

我只是想做水平移動的輪子。有一個代碼,但它不起作用 - 車輪只是作爲一個圓圈移動,留下痕跡。我試圖glTranslatef(0.0f, moveY, 0.0f);但它不工作。OpenGL移動對象不起作用

#include "stdafx.h" 
#include <math.h> 
#include <GL/freeglut.h> 
#include <GL\GL.h> 

#define window_width 1080 
#define window_height 720 

GLfloat angle; // wheel's rotator 
GLfloat moveX; // wheel's mover by X 

void DrawCircle(float cx, float cy, float r, int num_segments) { 
    glLoadIdentity(); 

    glTranslatef(0, 0, -10); // set place where wheel starts to draw 

    glRotatef(angle, 0.0f, 0.0f, -0.1f); // rotate our wheel. it works correctly I think 

    glTranslatef(moveX, 0.0f, 0.0f); // but it makes me wonder. moving circle by X doesn't work 

    // part of a circle 
    glBegin(GL_TRIANGLE_FAN); 
    glColor3f(255, 255, 255); 
    for (int ii = 0; ii < num_segments; ii++) { 
     double twicePi = 2.0 * 3.142; 
     float theta = 2.0f * 3.1415926f * float(ii)/float(num_segments); 
     float x = r * cosf(theta); 
     float y = r * sinf(theta); 
     glVertex2f(x + cx, y + cy); 
    } 

    glEnd(); 

    // second part of a circle 
    int i, x, y; 
    double radius = 1.20;  

    glColor3ub(0.0, 0.0, 0.0); 
    double twicePi = 2.0 * 3.142; 
    x = 0, y = 0; 
    glBegin(GL_TRIANGLE_FAN); 
    glVertex2f(x, y); 
    for (i = 0; i <= 20; i++) { 
     glVertex2f(
      (x + (radius * cos(i * twicePi/20))), 
      (y + (radius * sin(i * twicePi/20))) 
     ); 
    } 
    glEnd(); 
    // there's an end of drawning of a circle 

    // this is where wheel starts to rotate and move 
    angle += 0.02f; 
    moveX += 0.00005f; 



    // there are spokes of a wheel 
    glBegin(GL_LINES); 
     glColor3f(255, 255, 255); 
     glVertex3f(0.0, 0.0, 0.0); 
     glVertex3f(0.0, -1.2f, 0.0); 
    glEnd(); 

    glBegin(GL_LINES); 
     glColor3f(255, 255, 255); 
     glVertex3f(0.0, 0.0, 0.0); 
     glVertex3f(0.0, 1.2f, 0.0); 
    glEnd(); 

    glBegin(GL_LINES); 
     glColor3f(255, 255, 255); 
     glVertex3f(0.0, 0.0, 0.0); 
     glVertex3f(1.2f, 0.0, 0.0); 
    glEnd(); 

    glBegin(GL_LINES); 
     glColor3f(255, 255, 255); 
     glVertex3f(0.0, 0.0, 0.0); 
     glVertex3f(-1.2f, 0.0, 0.0); 
    glEnd(); 

    glBegin(GL_LINES); 
     glColor3f(255, 255, 255); 
     glVertex3f(0.0, 0.0, 0.0); 
     glVertex3f(1.f, 1.f, 0.0); 
    glEnd(); 

    glBegin(GL_LINES); 
     glColor3f(255, 255, 255); 
     glVertex3f(0.0, 0.0, 0.0); 
     glVertex3f(-1.f, 1.f, 0.0); 
    glEnd(); 

    glBegin(GL_LINES); 
     glColor3f(255, 255, 255); 
     glVertex3f(0.0, 0.0, 0.0); 
     glVertex3f(1.f, -1.f, 0.0); 
    glEnd(); 

    glBegin(GL_LINES); 
     glColor3f(255, 255, 255); 
     glVertex3f(0.0, 0.0, 0.0); 
     glVertex3f(-1.f, -1.f, 0.0); 
    glEnd(); 

    glBegin(GL_LINES); 
     glColor3f(255, 255, 255); 
     glVertex3f(0.0, 0.0, 0.0); 
     glVertex3f(1.2f, 0.5f, 0.0); 
    glEnd(); 

    glBegin(GL_LINES); 
     glColor3f(255, 255, 255); 
     glVertex3f(0.0, 0.0, 0.0); 
     glVertex3f(-1.2f, -0.5f, 0.0); 
    glEnd(); 

    glBegin(GL_LINES); 
     glColor3f(255, 255, 255); 
     glVertex3f(0.0, 0.0, 0.0); 
     glVertex3f(-1.2f, -0.5f, 0.0); 
    glEnd(); 

    glBegin(GL_LINES); 
     glColor3f(255, 255, 255); 
     glVertex3f(0.0, 0.0, 0.0); 
     glVertex3f(-1.2f, 0.5f, 0.0); 
    glEnd(); 

    glBegin(GL_LINES); 
     glColor3f(255, 255, 255); 
     glVertex3f(0.0, 0.0, 0.0); 
     glVertex3f(1.2f, -0.5f, 0.0); 
    glEnd(); 

} 


void main_loop_function() { 
    DrawCircle(0.0, 0.0, 1.45, 200); 
    glutSwapBuffers(); 
} 

void GL_Setup(int width, int height) { 
    glViewport(0, 0, width, height); 
    glMatrixMode(GL_PROJECTION); 
    gluPerspective(45, (float) width/height, 0.1, 100); 
    glMatrixMode(GL_MODELVIEW); 
} 

int main(int argc, char** argv) { 
    glutInit(&argc, argv); 
    glutInitWindowSize(window_width, window_height); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); 
    glutCreateWindow("trata"); 
    glutIdleFunc(main_loop_function); 
    GL_Setup(window_width, window_height); 
    glutMainLoop(); 
} 
+1

你可以添加屏幕截圖結果嗎?什麼不行?我認爲你需要在glTranslatef之前調用glRotatef。 – Unick

+0

@不用你太棒了! – phen0men

+0

你不客氣。 – Unick

回答

2

這只是一個快速修復,使您的代碼工作,因此您可以進一步開發和調試它。我看到代碼中的一些關鍵問題:

(0)混合使用Windows路徑POSIX路徑:

#include <GL/freeglut.h> 
#include <GL\GL.h> 

(1),包括自定義頁眉和期待社會各界猜測它是什麼。我評論說。

//#include "stdafx.h" 

(2)誤寫蒙上的功能 - 它應該是:

float theta = 2.0f * 3.1415926f * (float)ii/(float)num_segments; 

(3)在你的代碼沒有glutDisplayFunc。您應該註冊類似於:

glutDisplayFunc(main_display_function); 

註冊之前glutIdleFunc()。然後,在你的代碼,你應該有所以下列方式進行定義:

void main_display_function() { 
    DrawCircle(0.0, 0.0, 1.45, 200); 
    glutSwapBuffers();  
} 

(4)即使在函數不清除重繪之前的「窗口內容」:

void DrawCircle(float cx, float cy, float r, int num_segments) { 
    glClearColor (0., 0., 0., 1); 
    glClear (GL_COLOR_BUFFER_BIT); 
    {… … … } //the rest of your code 
} 

( 5)錯誤的數據類型的傳色度值:

glColor3f(255, 255, 255); //unsigned byte passed, float expected! 

glColor3ub(0.0, 0.0, 0.0); //float passed, unsigned byte expected! 

很少有直接解決您的問題更多的問題 - 你會容易理解和調試他們自己,一旦你修復程序正常工作(調用glRotatef和第二glTranslatef,正確計算movex的順序,繪製橫樑或輻條)。請看看this SO post

PS。您使用C++編譯器構建此程序並不會使其成爲C++代碼。程序中沒有一行C++特定的代碼。另外,OpenGL和GLUT都是純C的API。

+0

非常感謝你 – phen0men

+0

哦,我的上帝'glClear(GL_COLOR_BUFFER_BIT);'是非常有用的。再來一次! – phen0men

+0

還有很多效率低下的代碼,例如在循環內部劃分常量:'twicePi/20',或冗餘:所有重複的'glColor3f()'調用輻條,實際上只使用一種顏色。 .. – user3078414