2010-12-02 12 views
3

ウィンドウ内に2次元矩形を表示する必要があるWindows(XP)アプリケーションがあります。長方形は切り取られてはならず(すなわち、常にビューポート内に完全に存在しなければならない)、サイズ変更時にそのアスペクト比を保持しなければならない。現在、レイアウトを処理するメソッドは、ウィンドウと一致するように矩形の縦横比を歪ませます。私は、長方形をウィンドウに合わせて拡大し、ウィンドウ内に中央揃えしたい(再びクリッピングすることなく)。その方法は以下の通りです。 lWinDistとlMaxDepthは(それが重要ならば、インチの48thsで)表示される矩形の幅と高さ:ウィンドウ上の2Dオブジェクトの縦横比を維持する

void CRoRRecView::RedoLayout(long lWinDist, long lMaxDepth) 
{ 
    CDC* pDC = GetDC() ; 

    if (pDC != NULL) 
    { 
     m_lWinDist = lWinDist; 
     GetClientRect(m_rectClient) ; 
     int nClientWidth = m_rectClient.Width(); 
     int nClientHeight = m_rectClient.Height(); 
     glViewport(0, 0, nClientWidth, nClientHeight); 

     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 

     m_fWinXDist = (float) lWinDist ; 
     m_fWinYDist = lMaxDepth ; 
     m_fAspectRatio = m_fWinXDist/m_fWinYDist; 

     glOrtho(0.0, m_fWinXDist, 0.0, m_fWinYDist, -1, 1) ; 

     glRotatef(180.0, 0,1,0); 
     glTranslatef((float)(-1 * lWinDist),0,0); // Translate across the x axis 

     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 

     ReleaseDC(pDC) ; 
    } 
} 

答えて

3

この1つは期待通りに拡大すべきです:

// g++ main.cpp -lglut -lGL 
#include <GL/glut.h> 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    double w = glutGet(GLUT_WINDOW_WIDTH); 
    double h = glutGet(GLUT_WINDOW_HEIGHT); 
    double ar = w/h; 
    glOrtho(-2 * ar, 2 * ar, -2, 2, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glColor3ub(255, 0, 0); 
    glBegin(GL_QUADS); 
    glVertex2i(-1, -1); 
    glVertex2i( 1, -1); 
    glVertex2i( 1, 1); 
    glVertex2i(-1, 1); 
    glEnd(); 

    glutSwapBuffers(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 
    glutInitWindowSize(640, 480); 
    glutCreateWindow("Aspect Ratio"); 
    glutDisplayFunc(display); 
    glutMainLoop(); 
    return 0; 
} 
+0

はい、それはきれいにスケールします。残念ながら、問題はすべて私の目的ではなくなりました。アスペクト比が固定されると宣言された権限は、とにかくこれをバックポケットに入れておきます。 – PSU

0

はこれを試してみてください:

#include <GL/glut.h> 

size_t win_w = 0; 
size_t win_h = 0; 

void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, win_w, 0, win_h, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glColor3ub(255,0,0); 
    glPushMatrix(); 
     glTranslatef(win_w/2,win_h/2,0); 
     glScalef(50,50,50); 
     glBegin(GL_QUADS); 
      glVertex2f(-1,-1); 
      glVertex2f(1,-1); 
      glVertex2f(1,1); 
      glVertex2f(-1,1); 
     glEnd(); 
    glPopMatrix(); 

    glFlush(); 
    glutSwapBuffers(); 
} 

void reshape(int w, int h) 
{ 
    win_w = w; 
    win_h = h; 
    glViewport(0, 0, w, h); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 

    glutInitWindowSize(800,600); 
    glutCreateWindow("Aspect Ratio"); 

    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    glutMainLoop(); 
    return 0; 
} 
+1

ありがとうございました。ただし、オブジェクトの縦横比とセンタリングは維持されますが、ウィンドウのサイズが変更されるとサイズ変更されません。つまり、オブジェクトがウィンドウの高さの3/4を占めることから始めると、サイズ変更後のウィンドウの高さの3/4を占めることになります。 – PSU

+0

@PSU:そうです、そうです。私は正しいことをしたやや異なるバージョンを持っていた、私はそれを引き上げることができるかどうかがわかります。おかげさまで – genpfault

1

この改造機能を試してください。アスペクト比を保持し、オブジェクトのサイズを変更し、ビューポートを集中化します。

// initial window screen size 
int WIDTH = 400; 
int HEIGHT = 300; 

// reshape function, call with glutReshapeFunc(reshape) in yout main function 
void reshape(int width, int height) { 
    const float ar_origin = (float) WIDTH/(float) HEIGHT; 
    const float ar_new = (float) width/(float) height; 

    float scale_w = (float) width/(float) WIDTH; 
    float scale_h = (float) height/(float) HEIGHT; 
    if (ar_new > ar_origin) { 
     scale_w = scale_h; 
    } else { 
     scale_h = scale_w; 
    } 

    float margin_x = (width - WIDTH * scale_w)/2; 
    float margin_y = (height - HEIGHT * scale_h)/2; 

    glViewport(margin_x, margin_y, WIDTH * scale_w, HEIGHT * scale_h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, WIDTH/ar_origin, 0, HEIGHT/ar_origin, 0, 1.0); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity() ; 
} 
0

私はあなたが正しい番号を取得するためにこれを見なければならないと思う:その価値を与えるか、または取る、画像の幅である上記のコード、wOffset、で

self.hOffset = (self.wOffset/(16.0/9.0)); 
self.xOffset = ((int)ceil((_backingWidth/2.0) - ((_backingWidth + self.wOffset)/2.0))); 
self.yOffset = ((int)ceil((_backingHeight/2.0) - ((_backingHeight + self.hOffset)/2.0))); 

glViewport(self.xOffset, self.yOffset, _backingWidth + self.wOffset, _backingHeight + self.hOffset); 

を介して変更しましたスライダー。最初の行は、幅が正しい比率で増加するにつれて高さを増やします。これは16:9になります(幅を高さで分けて比を得るのはうまくいかず、明示的に指定すると最適です)。次の2行はイメージのx、y座標を調整するので、サイズの増減に応じて常に中央にとどまります。

これは、GPU上ではるかに簡単で簡単なアプローチで軽量です。私がここで見ているメガコーディング手法がより良い理由がある場合、私はそれを理解できません。がんばろう。

関連する問題