2011-02-01 2 views
0

私はW、A、S、またはDを押すと、画面上にたくさんの線が移動するようにしようとしています。私はファイルからすべての行を読み込んで表示しますが、うまくいきます。glTranslateがダブルバッファGLUTウィンドウで何もしないのはなぜですか?

私は表示機能の中でglTranslateで使うXとY変数をインクリメントするswitch文を持っていますが、私の行は動かないのです。誰もがこれで私を助けることができますか?

#include <GL/glut.h> 
#include <stdlib.h> 
#include <fstream> 
#include <iostream> 

int height = 640, width = 640; 

int X = 0, Y = 0; 

void drawPolyLineFile(char * fileName) { 
    std::fstream inStream; 
    inStream.open(fileName, std::ios::in); 
    if (inStream.fail()) { 
     std::cerr<< "Error opening file"; 
     return; 
    } 

    glClear(GL_COLOR_BUFFER_BIT); 

    GLint numpolys, numLines, x, y; 
    inStream >> numpolys; 
    for (int j =0; j < numpolys; j++) { 
     inStream >> numLines; 
     glBegin(GL_LINE_STRIP); 
     for (int i = 0; i < numLines; i++) { 
      inStream >> x >> y; 
      glVertex2i(x, y); 
     } 
     glEnd(); 
    } 

    //glutSwapBuffers(); 

    inStream.close(); 
} 

void display(void) 
{ 
/* clear all pixels */ 
    glClear (GL_COLOR_BUFFER_BIT); 

    glTranslatef(X, Y, 0); 
    drawPolyLineFile("dino.dat"); 

/* don't wait! 
* start processing buffered OpenGL routines 
*/ 
    glutSwapBuffers(); 
} 

void init (void) 
{ 
/* select clearing color  */ 
    glClearColor (0.0, 0.0, 0.0, 0.0); 

/* initialize viewing values */ 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0.0, 640.0, 0.0, 640.0, -1.0, 1.0); 
} 


void keyboard(unsigned char key, int x, int y) { 
    float speed = 5.0f; 
    switch (key) { 
     case 'a': 
      X -= speed; 
      std::cerr<< X << std::endl; 
      break; 
     case 'd': 
      X += speed; 
      std::cerr<< X << std::endl; 
      break; 
     case 's': 
      Y -= speed; 
      std::cerr<< Y << std::endl; 
      break; 
     case 'w': 
      Y += speed; 
      std::cerr<< Y << std::endl; 
      break; 
     default: 
      break; 
    } 

} 


/* 
* Declare initial window size, position, and display mode 
* (single buffer and RGBA). Open window with "hello" 
* in its title bar. Call initialization routines. 
* Register callback function to display graphics. 
* Enter main loop and process events. 
*/ 
int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); 
    glutInitWindowSize (640, 640); 
    glutInitWindowPosition (100, 100); 
    glutCreateWindow ("hello"); 
    init(); 
    glutKeyboardFunc(keyboard); 
    glutDisplayFunc(display); 
    glutMainLoop(); 
    return 0; /* ANSI C requires main to return int. */ 
} 

答えて

1

私はあまりにも慎重に読んでいないが、あなたは最も可能性の高いglTranslateへの呼び出しの前に

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

を逃しています。 glTranslateは翻訳を作成します。あなたのコードから、あなたはそれが翻訳を設定することを期待しているようです。

おそらく、すべてのフレームでディスクから読み込まないようにすることもできます。起動時にモデルをデータ構造にロードし、その代わりにモデルをレンダリングします。

+0

私はそれを試みましたが、どちらもうまくいきませんでした。しかし、私はメインメソッドにglutIdleFunc(display)を追加しましたが、今はすべて正常に動作しています。ご協力いただきありがとうございます! – kyle

0

キーボードハンドラにglutPostRedisplayがありませんでした。それがなければ、ウィンドウの再描画は開始されませんでした。設定はアイドル状態のまま表示されますが、funcはトリックも行いますが、動作は異なります。ウィンドウは常に再描画され、ほとんどすべてのCPU時間が描画に使用されます。あなたのコードには他にもいくつかの誤りがありました。私はそれを修正した。

#include <GL/glut.h> 
#include <stdlib.h> 
#include <fstream> 
#include <iostream> 
#include <stdexcept> 

int X = 0, Y = 0; 

void drawPolyLineFile(char * fileName) throw(std::runtime_error) 
{ 
    std::fstream inStream; 
    inStream.open(fileName, std::ios::in); 
    if (inStream.fail()) { 
     throw std::runtime_error("Error opening file") 
    } 

    GLint numpolys, numLines, x, y; 
    inStream >> numpolys; 
    for (int j =0; j < numpolys; j++) { 
     inStream >> numLines; 
     glBegin(GL_LINE_STRIP); 
     for (int i = 0; i < numLines; i++) { 
      inStream >> x >> y; 
      glVertex2i(x, y); 
     } 
     glEnd(); 
    } 

    inStream.close(); 
} 

void display(void) 
{ 
    int window_width, window_height; 

    window_width = glutGet(WINDOW_WIDTH); 
    window_height = glutGet(WINDOW_HEIGHT); 

    glViewport(0, 0, window_width, window_height); 

    /* clear all pixels */ 
    glClearColor (0.0, 0.0, 0.0, 0.0); 
    glClear (GL_COLOR_BUFFER_BIT); 

    /* always set all projection parameters a new 
    * each rendering pass 
    */  
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0.0, window_width, 0.0, window_height, -1.0, 1.0); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glTranslatef(X, Y, 0); 
    drawPolyLineFile("dino.dat"); 

    /* 
    * SwapBuffers will flush the OpenGL queue indeed, 
    * but more importantly it brings the content from 
    * the back buffer to the front 
    */ 
    glutSwapBuffers(); 
} 

void keyboard(unsigned char key, int x, int y) { 
    float speed = 5.0f; 
    switch (key) { 
     case 'a': 
      X -= speed; 
      std::cerr<< X << std::endl; 
      break; 
     case 'd': 
      X += speed; 
      std::cerr<< X << std::endl; 
      break; 
     case 's': 
      Y -= speed; 
      std::cerr<< Y << std::endl; 
      break; 
     case 'w': 
      Y += speed; 
      std::cerr<< Y << std::endl; 
      break; 
     default: 
      break; 
    } 
    glutPostRedisplay();  
} 


/* 
* Declare initial window size, position, and display mode 
* (single buffer and RGBA). Open window with "hello" 
* in its title bar. Call initialization routines. 
* Register callback function to display graphics. 
* Enter main loop and process events. 
*/ 
int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); 

    glutInitWindowSize (640, 640); 
    glutInitWindowPosition (100, 100); 
    glutCreateWindow ("hello"); 
    glutKeyboardFunc(keyboard); 
    glutDisplayFunc(display); 

    try { 
     glutMainLoop(); 
    } catch (std::runtime_error &err) { 
    std::cerr << err.what(); 
    } 

    return 0; 
} 
関連する問題