0

私は、ユーザーがクリックして左(強度を下げる)または右(強度を上げる)にドラッグすることで、単純なウィンドウの背景色を調整できる単純なOpenGLアプリケーションに取り組んでいます。たとえば、右にドラッグすると、次のようになります。

intensity += 0.0001*x;  //where x is the current mouse location 

...そして左側、反対の方法:

intensity -= 0.0001*x;

intensityglClearColorは、複数回呼び出されるdisplay関数で渡されるグローバル静的GLfloatです。この戦略は、ユーザーが右にドラッグしているときに色を濃くするとうまく機能しますが、左にドラッグすると特定のポイントの後で混乱します。ドラッグすると色が弱くなり、本来のように黒に戻りますが、その後濃くなります。元の色。

問題は、ドラッグしすぎると強度(0から1の間)が負になりglClearColor、符号を正(?)に戻すだけで問題が解決することだと思います。その場合、渡された値がglClearColor適切な範囲内にとどまるように強制するにはどうすればよいですか?現在の強度が負にならないようにすることで問題を解決しようとしました/それがすでに低すぎる場合は調整が行われませんが、うまくいかなかったようです:

if(x <= xPrev && intensity >= (.0001*x))  //moving left to de-intensify color
  intensity -= 0.0001*x;

...これを間違って行っているのでしょうか、それともglClearColor負の値を予想とは異なる方法で処理しているのでしょうか。

浮かび上がったもう1つの興味深い問題は、私の「強度」調整がr、g、および/またはb値でのみ機能するように見えることです(つまり、「強度」をの値の1つとして渡しglClearColorます。値の使用は機能しませんでした...しかし、それは色の強度を変えることになっていないのですか?

4

1 に答える 1

1

これは、ヒステリシスの問題に少し似ています。イベントがどのように受信されるか、またはどの座標系xが使用されているかは明確ではありません。おそらく、ボタンが押されたときに「アンカー」( xStart) をドロップし、ドラッグ中に後続のすべての値をこの値からのオフセットとして処理します。ウィンドウとイベントに使用しているツールキット/ライブラリは何ですか? コンソールから起動する場合は、おそらく次のようなトレース ステートメントを追加します。

fprintf(stderr, "%.8e\n", x);

の値が各フレームで期待する値にx対応しているかどうかを確認します。

glClearColorは値を[0, 1]にクランプするため、おそらく問題ではありません。おそらくトレースintensityが役立つでしょうか?

于 2012-09-26T02:51:31.220 に答える