1

私はこのサイトをたくさん検索しましたが、私の問題を正確に見つけることができませんでした. 同様の問題のほとんどは、コンソールと glut ライブラリを使用していました。しかし、私は OpenGL と MFC が初めてで、MFC の組み合わせから始めたので、あまり役に立ちませんでした。

ここでは、自分の目的のために codeguru でクラスCOpenGLcontrolをカスタマイズしています。これは完全にカスタマイズされたクラスですが、ダウンロードすることに興味がない場合は、関連する部分について説明します。これにはしばらく時間がかかる場合がありますので、しばらくお待ちください。

まず最初に、このような長方形を描画する目的は、プログラムでクラスのインスタンスを 2 つ作成することです。 ここに画像の説明を入力
小さいウィンドウでは、画像は常にzoom extentモードになりますが、大きいウィンドウでは、ユーザーはさまざまなナビゲーション タスクを実行できます。たとえば、画像がパンまたはズームされるたびOnDrawに、大きなインスタンスの関数the extent rectangleが計算されて小さなウィンドウに渡され、そこに描画されて、そのような大きな画像全体のどこにいるのかが示されます。

次の手順に
従いました: 射影行列スタックの変更と 2D シーンのシミュレーション

void COpenGLControl::OnSize(UINT nType, int cx, int cy)
{
wglMakeCurrent(hdc, hrc);
CWnd::OnSize(nType, cx, cy);

if (0 >= cx || 0 >= cy || nType == SIZE_MINIMIZED) return;
oglWindowWidth = cx;
oglWindowHeight = cy;
// Map the OpenGL coordinates.
glViewport(0, 0, oglWindowWidth, oglWindowHeight);

// Projection view
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Set our current view perspective
glOrtho(-oglWindowWidth/2, oglWindowWidth/2, -oglWindowHeight/2,oglWindowHeight/2, 1, -1);
// Model view
glMatrixMode(GL_MODELVIEW);
wglMakeCurrent(NULL, NULL);
}  

モデルビュー マトリックス スタックの変更とカメラの設定 (Z 軸の負の方向を見ているようです)

void COpenGLControl::OnDraw(CDC *pDC)
{
// TODO: Camera controls
wglMakeCurrent(hdc,hrc);
glLoadIdentity();
gluLookAt(0,0,1,0,0,0,0,1,0);
glTranslatef(m_fPosX, m_fPosY, 0.0f);
glScalef(m_fZoom,m_fZoom,1.0);
setViewRectangle();
if (WantToDrawRectangle)
    DrawRectangleOnTopOfTexture();
wglMakeCurrent(NULL, NULL);
}  

この行は、クラスのパブリック メンバー データの 1 つsetViewRectangle()を計算するためのものであり、ユーザーが望む場合は、他のパブリック メンバー データを使用して四角形を描画します。これは、大きなウィンドウではこのような長方形を描画するのではなく、小さなウィンドウでは描画するためです。そして、小さい方が大きい方のデータを使用します。しかし、クラスの 2 つのインスタンス間でこれらのデータをリアルタイムで渡す方法はまだ実装していません。 クラスを試してみるために、 の初期値を次のように設定しました。ウィンドウは で設定されているため、テクスチャの上部の中央に長方形を描画する必要があると思います。しかし、そうではありません。 とにかくOnTimer で呼び出されるテクスチャを適用するコードvector<int>ViewRectanglevector<int>RectangleToDraw
RectangleToDraw[0,0,573,543]glOrtho

void COpenGLControl::oglDrawScene(void)
{
wglMakeCurrent(hdc, hrc);
float x0 = -ImageWidth/2; // top left corner of image
float y0 = ImageHeight/2;
float x1 = x0 + ImageWidth; // bottom right corner of image
float y1 = y0 - ImageHeight;

glBegin(GL_TRIANGLE_STRIP);
{
    glTexCoord2f(0,1);glVertex2f(x0, y1);
    glTexCoord2f(0,0);glVertex2f(x0, y0);
    glTexCoord2f(1,1);glVertex2f(x1, y1);
    glTexCoord2f(1,0);glVertex2f(x1, y0);
}
glEnd();
wglMakeCurrent(NULL, NULL);
}  

ViewRectangleクラスの別のインスタンスに渡される計算するコード

void COpenGLControl::setViewRectangle()
{
ViewRectangle.at(0) = m_fPosX - oglWindowWidth*m_fZoomInverse/2;
ViewRectangle.at(1) = m_fPosY - oglWindowHeight*m_fZoomInverse/2;
ViewRectangle.at(2) = m_fPosX + oglWindowWidth*m_fZoomInverse/2;
ViewRectangle.at(3) = m_fPosY + oglWindowHeight*m_fZoomInverse/2;
}  

テクスチャの上に四角形を描画するコード

void COpenGLControl::DrawRectangleOnTopOfTexture()
{
wglMakeCurrent(hdc, hrc);
glColor3f(1.0f,0.0f,0.0f);
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
glBegin(GL_QUADS);
   glVertex3f(RectangleToDraw.at(0),RectangleToDraw.at(1),0.5);
   glVertex3f(RectangleToDraw.at(0),RectangleToDraw.at(3),0.5);
   glVertex3f(RectangleToDraw.at(2),RectangleToDraw.at(3),0.5);
   glVertex3f(RectangleToDraw.at(2),RectangleToDraw.at(1),0.5);
glEnd();
SwapBuffers(hdc);
wglMakeCurrent(NULL, NULL);
}  

上記の関数で使用glVertex2fしても違いはなく、両方の状況で次のように遭遇
ここに画像の説明を入力
します。混乱しないでください。両方のウィンドウに間違った描画が適用される理由は、コンストラクターで設定したためです。

WantToDrawRectangle = true;  
RectangleToDraw.at(0) = -100;
RectangleToDraw.at(1) = -100;
RectangleToDraw.at(2) = 100;
RectangleToDraw.at(3) = 100;  

テクスチャの上に長方形を描く方法を試すためだけに。確かに正しいコードを書いた後、私はそれらを真のモードに設定します。ただ私に言って

リアルタイム レンダリングが必要なオブジェクト指向の方法で、できればテクスチャの上に長方形を描画する方法を教えてください。

4

1 に答える 1

1

最新の OpenGL では非推奨になっているためedge flags、ポリゴン塗りつぶしモードを使用してアウトラインを描画することは避けます。スクリーンショットが正しく理解できれば、長方形の描画に使用される 2 つの三角形の内側の端に線が表示されます。

代わりに、長方形の 4 つの角を使用する赤を描画します...これも非推奨であるGL_LINE_LOOPため、移植性の理由から推奨される手法です。GL_QUADS

glColor3f     (1.0f, 0.0f, 0.0f);
glBegin       (GL_LINE_LOOP);
   glVertex3f (RectangleToDraw.at (0), RectangleToDraw.at (1), -1.0f);
   glVertex3f (RectangleToDraw.at (0), RectangleToDraw.at (3), -1.0f);
   glVertex3f (RectangleToDraw.at (2), RectangleToDraw.at (3), -1.0f);
   glVertex3f (RectangleToDraw.at (2), RectangleToDraw.at (1), -1.0f);
glEnd         ();

また、あなたのスクリーンショットは、輪郭にテクスチャを付けようとして苦しんでいるようです. GL_TEXTURE_2D線を引く前に無効にします。

于 2013-08-28T03:04:24.733 に答える