пассивное движение в OpenGL - PullRequest
0 голосов
/ 26 марта 2011

Я пытаюсь нарисовать линию пассивным движением мыши (это из книги), но мне не удается это сделать.

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();

}

Здесь что-то отсутствует?

Ответы [ 3 ]

1 голос
/ 26 марта 2011

Если этот код действительно из книги, то эта книга ужасна, вы должны просто бросить ее, прежде чем она повредит ваш мозг, и пойти на что-то лучшее (и бесплатное), например NeHe учебники вместо.

Я вижу, например, серьезную проблему со строками ...

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

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

вы устанавливаете xf, yf и xs, ys равными значениям (поэтому ваша строка будет иметь длину 0)... и более того, учитывая, что x и y являются целыми числами, эти деления, вероятно, всегда будут давать результат 0.

1 голос
/ 26 марта 2011

Одна ошибка в том, что у вас есть glLogicOp-вызовы между парами glBegin / End. Очень мало вызовов OpenGL разрешено между началом и концом. Сделайте это следующим образом:

glLogicOp(GL_XOR);
glBegin(GL_LINES);
glVertex2f(xf, yf);
glVertex2f(xs, ys);
glEnd() ;
glLogicOp(GL_COPY);
0 голосов
/ 26 марта 2011

Это скопировано прямо из книги?Если это так, я предлагаю вам прекратить читать это!Практически во всех случаях любые вызовы рисования должны выполняться между началом и концом 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();

}

РЕДАКТИРОВАТЬ: Вилле Крумлинде, конечно, прав, вы не можете сделать glLogicOp в предложениях Begin и End, я обновил приведенный выше код, чтобы включить исправление.

...