2011-03-26 26 views
0

我想用鼠標的被動運動畫一條線(它來自一本書),但我無法做到這一點。opengl中的被動運動

float xf, yf, xs, ys; 
int flag=0; 

void setupmywindow() 
{ 
    glClearColor(0,0,0,0); 
    gluOrtho2D(0,100,0,100); 
} 

void myDisplay() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 

    glutSwapBuffers(); 
} 

void move(int x, int y) 
{ 

if(flag == 1) 
{ 
glBegin(GL_LINES); 
glVertex2f(xf, yf); 
glVertex2f(xs, ys); 
glEnd() ; 

} 
xf = x/500; 
yf = (500-y)/500; 

xs = x/500; 
ys = (500-y)/500; 
glBegin(GL_LINES); 
glLogicOp(GL_XOR); 
glVertex2f(xf, yf); 
glVertex2f(xs, ys); 
glLogicOp(GL_COPY); 

glEnd() ; 

} 

int main(int argc, char **argv) 
{ 


    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); 
    glutInitWindowSize(500,500); 
    glutCreateWindow("My window"); 
    setupmywindow(); 
    glutDisplayFunc(myDisplay); 
    glutPassiveMotionFunc(move); 
    glutMainLoop(); 

} 

在這裏失蹤了嗎?

+0

書的名稱是什麼? – 2011-03-26 16:01:04

回答

0

這是直接從書中複製?如果是這樣,我建議你停止閱讀! 在幾乎所有情況下,任何繪圖調用都應該在DisplayFunc的開始和結束之間完成。所以,你應該將程序更改:

float xf, yf, xs, ys; 
int flag=0; 

void setupmywindow() 
{ 
    glClearColor(0,0,0,0); 
    gluOrtho2D(0,100,0,100); 
} 

void myDisplay() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 

    glColor3(1.0f, 1.0f, 1.0f); 
    if(flag == 1) 
    { 
     glBegin(GL_LINES); 
     glVertex2f(xf, yf); 
     glVertex2f(xs, ys); 
     glEnd() ; 
    } 
    glLogicOp(GL_XOR); 

    glBegin(GL_LINES); 
    glVertex2f(xf, yf); 
    glVertex2f(xs, ys); 
    glEnd(); 

    glLogicOp(GL_COPY); 

    glutSwapBuffers(); 
} 

void move(int x, int y) 
{ 
    xf = x/500.0f; 
    yf = (500.0f-y)/500.0f; 

    xs = x/500.0f; 
    ys = (500.0f-y)/500.0f; 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); 
    glutInitWindowSize(500,500); 
    glutCreateWindow("My window"); 
    setupmywindow(); 
    glutDisplayFunc(myDisplay); 
    glutPassiveMotionFunc(move); 
    glutMainLoop(); 

} 

編輯:威樂Krumlinde當然是正確的,你不能一開始和結束子句中做glLogicOp,我已經更新上面的代碼中包含的修補程序。

+0

你好,它沒有工作。(我也加了「glCoror3f(1,1,1)」) – George 2011-03-26 16:54:31

+0

我編輯過,試試這段代碼。並使用glCoror3f(1.0f,1.0f,1.0f)。否則它將被解釋爲字節值(其中255是最大值)。 – Hannesh 2011-07-30 20:48:42

1

一個錯誤是你在glBegin/End對之間有glLogicOp調用。在開始和結束之間,很少有OpenGL調用被允許。這樣做,而不是:

glLogicOp(GL_XOR); 
glBegin(GL_LINES); 
glVertex2f(xf, yf); 
glVertex2f(xs, ys); 
glEnd() ; 
glLogicOp(GL_COPY); 
+0

你好,它沒有工作 – George 2011-03-26 16:55:00

1

如果這段代碼真的來自這本書,那麼這本書很可怕,你應該在它損壞你的大腦之前放下它,然後去尋找更好的東西(和免費的),而不是像NeHe tutorials那樣。

我看到例如與線一個嚴重的問題......

xf = x/500; 
yf = (500-y)/500; 

xs = x/500; 
ys = (500-y)/500; 

要設置XF,YF和XS,YS爲相同的值(所以你的行會是一個長度爲0).. 。此外,假設xy是整數,那麼這些分部可能總會給出0的結果。

+0

是的,你是對的... – George 2011-03-26 17:57:45