Bspline следует перерисовать, не удаляя все остальное окно - PullRequest
0 голосов
/ 20 июня 2011

В моем mousefunc я вызываю функцию bspline.Это работает следующим образом: с помощью мыши вы можете поставить контрольные точки, и в соответствии с этими точками рисуется линия bspline. Так что, если вы нарисовали три точки, отобразится кривая между этими точками.При добавлении другой точки старая кривая исчезает и появляется новая.Этот новый лежит сейчас между четырьмя точками. Это работает просто отлично.НО: эта кривая bspline отображается только в одном окне просмотра. Это окно просмотра имеет черную рамку.Эта граница исчезает, когда мой bspline перерисовывается.Это происходит из-за вызова glutPostredisplay.Потому что в моем glutDisplayFunc я вызываю glClear (GL_COLOR_BUFFER_BIT).Так что это естественно.Если я удаляю glClear (GL_COLOR_BUFFER_BIT) в моем displayfunc, граница остается, но старые кривые остаются.Даже если я скажу, что граница должна быть перерисована, ничего не произойдет.Я не могу придумать альтернативу.Был бы признателен, если бы вы могли мне помочь ...

1 Ответ

1 голос
/ 20 июня 2011

В OpenGL обычный подход - перерисовывать всю сцену всякий раз, когда какая-то ее часть изменяется.В вашем случае изменение контрольных точек B-сплайна должно вызвать повторное отображение сцены вместо выполнения операций рисования в функции обработчика щелчка мышью.

OpenGL не имеет постоянства геометрии, он просто рисует примитивы в пиксельном кадровом буфере,И как таковой вы должны использовать его.

Чтобы уточнить, некоторые псевдокод:

BSpline *b_spline;

void on_mouseclick(int x, int y)
{
    float x_, y_;
    transform_screen_to_scene(x,y, &x_, &y_);
    bspline_add_control_point(b_spline, x_, y_);

    trigger_redisplay();
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    setup_viewport_and_projection();

    bspline_draw(b_spline);

    swap_buffers();
}
...