2012-03-28 11 views
0

私はC++で、ウィンドウの中心とマウスポインタの現在の位置を結ぶ線を表示する単純なOpenGLプログラムを書いています。glutPassiveMotionFunc()を使用しています。 GLUTで

私のコードは次のとおり

#ifdef __APPLE__ 
#include <GLUT/glut.h> 
#else 
#include <GL/glut.h> 
#endif 
#include<iostream> 

using namespace std; 

void passive(int,int); 
void reshape(int,int); 
void init(void); 
void display(void); 
void camera(void); 

int x=3,y=3; 

int main (int argc,char **argv) { 
    glutInit (&argc,argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA); 
    glutInitWindowSize(1364,689); 
    glutInitWindowPosition(0,0); 
    glutCreateWindow("Sample"); 
    init(); 
    glutDisplayFunc(display); 
    glutIdleFunc(display); 
    glutPassiveMotionFunc(passive); 
    glutReshapeFunc(reshape); 
    glutMainLoop(); 
    return 0; 
} 

void display(void) { 
    glClearColor (0.0,0.0,0.0,1.0); 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    camera(); 

    glBegin(GL_LINES); 
     glVertex3f(0,0,0); 
     glVertex3f(x,y,0); 
    glEnd(); 
    glutSwapBuffers(); 
}  

void camera(void) { 
    glRotatef(0.0,1.0,0.0,0.0); 
    glRotatef(0.0,0.0,1.0,0.0); 
    glTranslated(0,0,-20); 
}  

void init(void) { 
    glEnable (GL_DEPTH_TEST); 
    glEnable (GL_BLEND); 
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glEnable(GL_COLOR_MATERIAL); 
}  

void reshape(int w, int h) { 
    glViewport(0,0,(GLsizei)w,(GLsizei)h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(60,(GLfloat)w/(GLfloat)h,1.0,100.0); 
    glMatrixMode(GL_MODELVIEW); 
} 

void passive(int x1,int y1) { 
    x=x1; y=y1; 
} 

私が直面しています問題は、パッシブ()関数で設定したxとyの値が正しく透視投影を使用してスクリーンにマッピングされないことです。したがって、描画された線は、中心を画面外の他の座標に結合しています。コードを変更して正しく動作させるには?

答えて

1

正射影投影行列を作成し、すべての2D要素(この行を含め、glutPassiveMotionFuncによって提供されるスクリーン座標を使用して)をレンダリングするのが簡単な方法です。

このような何か:

void display() { 
    // clear 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(...) // create 3D perspective projection matrix 
    glMatrixMode(GL_MODELVIEW); 

    // Render 3D content here 

    // Render 2D content 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0, width, height, 0); // create 2D orthographic projection matrix with coordinate system roughly equivalent to window position 
    glMatrixMode(GL_MODELVIEW); 

    glBegin(GL_LINES); 
    glVertex2f(width/2, height/2); // now we can use "pixel coordinates" 
    glVertex2f(cursorX, cursorY); 
    glEnd(); 

    ... 
} 

はあなたのreshape法で透視投影のご変更にこれを比較してください。

「2D」レンダリング(デプスバッファチェックなど)に意味のない状態を無効にしたいのは明らかですが、それはかなり明白です。他の人がこの同じ作業をどのように行うかについては、this GDSE postをご覧ください。

+0

ありがとうございました!それは働いた。 –

関連する問題