2

openGLでステップバイステップの表示アニメーションを作成するにはどうすればよいですか?

私は、GCodeファイルを読み取ってそれをグラフィックに解釈するためのreprapプリンタープロジェクトを行っています。今、私はオブジェクト全体を描くステップバイステップのアニメーションを作るのに苦労しています。オブジェクト全体を構成するには、短い線をたくさん描く必要があります。例えば:

|-----|
|     |
|     |
|-----|

正方形は多くの短い線で構成されており、各線は次のようなコードによって生成されます。

glPushMatrix();
.....
for(int i=0; i< instruction[i].size(),i++)
{  ....
   glBegin(GL_LINES);
     glVertex3f(oldx, oldy, oldz);
     glVertex3f(x, y, z);
   glEnd();
}
glPopMatrix();

ここで、この正方形がどのように作成されるかを表示するためのステップアニメーションを作成したいと思います。新しい線を引くたびに画面を更新しようとしましたが、うまくいきません。正方形全体が一度に出てきます。誰かがこれを作る方法を知っていますか?

4

3 に答える 3

0

Linesを次々に表示したいだけで、効率や優れたプログラミングスタイルを気にする必要がない場合は、次のようにしてみてください。

(描画ルーチンで)

if (timer > 100) {

//draw the next line

timer = 0;

}

else

timer++;

//draw all the other lines (you have to remember wich one already appeared)

//for example using a boolean array "lineDrawn[10]"

タイマーは、シーンを描画した頻度を示す整数です。大きくすると、プログラムを実行したときに画面上での処理が遅くなります。

もちろん、これは描画ルーチンがある場合にのみ機能します。そうでない場合は、使用することを強くお勧めします。

->どこにでもあるたくさんのチュートリアル、例えば

http://nehe.gamedev.net/tutorial/creating_an_opengl_window_%28win32%29/13001/

幸運を祈ります!

PS:あなたはほぼ同じことをしたと思いますが、タイマーはありません。そのため、すべてが非常に速く描画されたため、すべてが同時に表示されたと思いました。

于 2012-10-22T08:32:59.287 に答える
0

各描画呼び出しの後にSwapBufferメソッドを呼び出す必要があります。マトリックススタックをねじ込まないように注意してください。おそらく、ブレークポイントのようにレンダリングを「一時停止」するための何かが必要になります。

于 2012-10-21T21:23:06.953 に答える
0

一般的なOpenGLの実装では、多数の呼び出しをキューに入れて、それらをまとめてアクティビティのバーストにまとめ、利用可能な通信帯域幅とGPU時間リソースを最適に利用します。

やりたいことは、基本的にダブルバッファレンダリングの反対です。つまり、各描画ステップがすぐに表示されるレンダリングです。これを行う1つの方法は、単一のバッファウィンドウにレンダリングし、glFinish()各ステップの後に呼び出すことです。主な欠点:コンポジットウィンドウマネージャーなどを使用する最新のシステムではうまく機能しない可能性があります。

私がお勧めするもう1つのアプローチは、インクリメンタル描画用に別のバッファーを使用し、このバッファーからメインフレームバッファーを常に更新することです。主なテーマは、フレームバッファオブジェクトRenderToTextureです。

まず、FBOを作成します(たくさんのチュートリアルがあり、StackOverflowの回答として)。FBOは基本的に、テクスチャやレンダーバッファなどのターゲットバッファを接続できる抽象化であり、描画呼び出しの宛先としてバインドできます。

では、どのようにそれらの問題を解決するのですか?まず、描画ループを遅らせてアニメーションを作成しないでください。これにはいくつかの理由がありますが、主な問題は、これによってプログラムの対話性が失われることです。代わりに、アニメーションのどのステップにいるのか(グローバル)カウンターを維持します。それを呼びましょうstep

int step = 0;

次に、描画機能でフェーズを実行する必要があります。1)テクスチャの更新2)画面の更新

フェーズ1は、フレームバッファオブジェクトをレンダリングターゲットとしてバインドすることで構成されます。これが機能するには、ターゲットテクスチャがバインドされていない必要があります

glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebuffer(GL_FRAMEBUFFER, animFBO);
glViewport(0, 0, fbo.width, fbo.height);
set_animFBO_projection();

ここでの秘訣は、animFBOを一度だけ、つまり作成後にクリアし、その後は二度とクリアしないことです。次に、アニメーションの手順に従って線を描画します

draw_lines_for_step(step);

ステップカウンターをインクリメントします(これは複合ステートメントとして実行できますが、より明示的です)

step++;

アニメーションFBOを更新したら、画面を更新します。最初にanimFBOのバインドを解除します

glBindFramebuffer(GL_FRAMEBUFFER, 0);

これで、メインの画面上のフレームバッファが表示されます

glViewport(0, 0, window.width, window.height);
set_window_projection(); //most likely a glMatrixMode(GL_PROJECTION); glOrtho(0, 1, 0, 1, -1, 1);

次に、FBOにアタッチされたテクスチャをバインドし、フルビューポートクワッドに描画します

glBindTexture(GL_TEXTURE_2D, animFBOTexture);
draw_full_viewport_textured_quad();

最後に、バッファスワップを実行して、アニメーションステップの反復を表示します

SwapBuffers();
于 2012-10-21T23:00:58.717 に答える