2

このプロジェクトではSDLとOpenGLを使用しています。プログラム起動時の画面は640x480で、glOrthoの設定も同様です。したがって、プログラムは同期して開始されます。しかし、私のプログラムでは、ユーザーはディスプレイの一部のマウスを使用して選択範囲を作成し、ズームインすることができます。たとえば、ユーザーは320,240(_mouseStart)から640,480(_mouseEnd)までの領域を選択できます。次に、この選択領域がglOrthoに渡され、選択した領域を中央に配置してズームインできるようになります。私の問題は、SDLマウス座標が選択された新しい領域(この場合は320、240から640,480)ではなく、0,0から640,480の範囲にあるため、既にズームインされた領域の領域を選択しようとしたときです。領域を選択して既にズームインしようとしたときに、実際のマウスの位置を計算する方法が必要です。

ここに写真を投稿することはできませんでしたが、gamedev.netに投稿を作成しました。これは、さらに情報が必要な場合に参照できます。http://www.gamedev.net/topic/636257-opengl-2d-selection-scaling-multiple-times/

ここで、ユーザーが領域を選択した後、すべてのマウス位置を計算します(これは正しいです)

// modify mouse coordinates to fit scaled image
            _mouseStart.x = ((_mouseStart.x / SCREEN_WIDTH) * (_portionEnd.x - _portionStart.x)) + _portionStart.x;
            _mouseStart.y = ((_mouseStart.y / SCREEN_HEIGHT) * (_portionEnd.y - _portionStart.y)) + _portionStart.y;
            _mouseEnd.x = ((_mouseEnd.x / SCREEN_WIDTH) * (_portionEnd.x - _portionStart.x)) + _portionStart.x;
            _mouseEnd.y = ((_mouseEnd.y / SCREEN_HEIGHT) * (_portionEnd.y - _portionStart.y)) + _portionStart.y;

これが、glOrthoを中央にリセットして、選択した領域を表示する方法です。

glLoadIdentity();
glOrtho(_portionStart.x, _portionEnd.x, _portionEnd.y, _portionStart.y, 1, -1);
4

1 に答える 1

3

プロセスを説明する画像を作成しました(私は願っています)

  • 青い長方形は、(ズームされていない)ベースビューポートです。
  • 小さな緑色の長方形は、ベースビューポートで選択された領域です
  • 大きな緑色の長方形は、新しいズームされたビューポートです
  • ズームされたビューポート内で、新しい長方形が選択されます(赤い長方形)。

赤い長方形の赤い座標は、マウスの位置から取得する必要のある座標です。この座標を使用して、現在ズームされているビューポートの値(緑色の座標)を計算できます。ズームされていない最終的な座標(青の値)を取得するには、緑の長方形のオフセット(228,88)を追加する必要があります。

緑の長方形のオフセットと緑の長方形の高さが同じであるため、私の例は最適ではないことに注意してください(両方の値は228です)

計算

于 2012-12-24T22:01:03.890 に答える