0

私の mousefunc では、関数 bspline を呼び出します。これは次のように動作します: マウスを使って制御点を配置すると、これらの点に従って B スプラインが描画されます。したがって、3 つの点を描画すると、それらの点の間の曲線が表示されます。別のポイントを追加すると、古い曲線が消え、新しい曲線が現れます。この新しいものは現在、4 つの点の間にあります。これは問題なく動作します。BUT: この bspline 曲線は 1 つのビューポートにのみ表示されます。このビューポートには黒い境界線があります。この境界線は、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 に答える