应重新绘制 Bspline,而不删除窗口的所有其余部分

发布于 2024-11-16 10:00:44 字数 426 浏览 2 评论 0原文

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

In my mousefunc i call a function bspline. It works like this:
With your mouse you can put controllpoints and according to these points the bspline is drawn.So if you have drawn three points a curve between those points is displayed. By adding another point the old curve disappears and a new one appears. This new one lies now between the four points.This works just fine. BUT: This bspline curve is only displayed in one viewport.This viewport has a black border. This border disappears when my bspline is redrawn. This happens because of calling glutPostredisplay. Because in my glutDisplayFunc i call glClear(GL_COLOR_BUFFER_BIT). So it is the natural thing to happen. If i delete the glClear(GL_COLOR_BUFFER_BIT) in my displayfunc the border stays but the old curves stay too. Even if i say that the border should be redrawn nothing happens. I cant think of an alternative. Would appreciate it if you could help me...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

荭秂 2024-11-23 10:00:44

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

In OpenGL the usual approach is to rerender the whole scene whenever some part of it changes. In your case changing the control points of the B-Spline should trigger a redisplay of the scene instead of perform drawing operations in the mouseclick handler function.

OpenGL has no geometry persistency, it just draws primitves to a pixelbased framebuffer. And as such you must use it.

To clarify, some pseudocode:

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();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文