0

在我的 mousefunc 中,我调用了一个函数 bspline。它的工作原理是这样的:使用鼠标,您可以放置​​控制点,然后根据这些点绘制 bspline。因此,如果您绘制了三个点,则会显示这些点之间的曲线。通过添加另一个点,旧曲线消失并出现新曲线。这个新的现在位于四个点之间。这很好用。但是:此 bspline 曲线仅显示在一个视口中。此视口有黑色边框。当我的 bspline 被重绘时,这个边框消失了。这是因为调用了 glutPostredisplay。因为在我的 glutDisplayFunc 中,我调用 glClear(GL_COLOR_BUFFER_BIT)。所以这是很自然的事情发生。如果我删除了 displayfunc 中的 glClear(GL_COLOR_BUFFER_BIT) 边框会保留,但旧曲线也会保留。即使我说应该重新绘制边界,也没有任何反应。我想不出替代方案。如果您能帮助我,将不胜感激...

4

1 回答 1

1

在 OpenGL 中,通常的方法是在场景的某些部分发生变化时重新渲染整个场景。在您的情况下,更改 B 样条的控制点应该触发场景的重新显示,而不是在 mouseclick 处理程序函数中执行绘图操作。

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();
}
于 2011-06-20T14:26:39.327 回答