私はopenglが初めてです。ユーザーがキーを押したときにシーンを数回描画したいのですが、キーが押されたときに for ループで glutPostRedisplay を呼び出しましたが、シーンを 1 回だけ再描画します。この問題をどのように処理すればよいですか?
1 に答える
まず、glutPostRedisplayはGLUTに属する関数であり、OpenGLの一部ではなく、サードパーティのライブラリ/フレームワークです。他のフレームワークもありますが、すべてを最初から行うこともできます(14年ほど前にOpenGLを学び始めたとき、GLUTが適切に機能しないため、フレームワークを最初から作成しました)。
ユーザーがキーを押したときにシーンを数回描きたい
描画とアニメーションのロジックをイベント処理と混在させないでください。ユーザーがアニメーションをトリガーするキーを押した場合は、アニメーションを再生するフラグ(=変数)を設定してから、レンダリング/アニメーションループでアニメーションを繰り返し処理します。
キーが押されたときにforループでglutPostRedisplayを呼び出しましたが、シーンが1回だけ再描画されます
glutPostRedisplayは、すぐに再描画をトリガーしません。これは、GLUTメッセージループがすべてのメッセージ処理後にアイドル状態になる代わりに再描画を発行するというフラグを設定します。もちろん、このフラグは蓄積されません。
これがGLUTを使用したレイアウトです。残念ながら、GLUTは、イベントループを制御できないため、この種のことにはあまり適していません。これにより、正確なタイミングを実現するのが面倒になります。
time_t rendertimer;
void stopwatch(time_t); // some external helper function that reports time between calls
typedef enum {stop, play} animstate;
struct animation {
float time;
float duration;
animstate state;
};
animation animations[...];
void keyboard(key, x, y)
{
if(key == ...) {
animations[0].time = 0;
animations[0].state = play;
}
glutPostRedisplay();
}
void idle()
{
float deltaT = stopwatch(rendertimer);
if( animation[...].state == play ) {
animation[...].time += deltaT;
if( animation[...].duration <= animation[...].time ) {
animation[...].state = stop;
}
}
glutPostRedisplay();
}
void display()
{
draw_objects_according_to_animation();
}