本OpenGL SuperBible fram Addison-Wesley
を読んで読んだ:
glTranslate への各呼び出しは、modelview マトリックスに累積され
ます。これはどういう意味ですか?
たとえば、次のコードを意味します:
glTranslatef(2.0,3.0,0);
glTranslatef(4.0,5.0,0);
最初に原点にあるオブジェクトをポイントに(2,3,0)
移動し、次にそれを原点からではなく再び平行移動(2,3,0)
し(2+4,3+5,0+0) = (6,8,0)
ますか?
glScalef
これはandについても当てはまりglRotatef
ますか?
たとえば、このコード:
glScalef(2.0,3.0,4.0);
glScalef(3.0,4.0,5.0);
最初に1x1x1
立方体を2x3x4
立方体の長方形に変換し、次にこの立方体の長方形を1 に変換し6x12x20
ますか?
最後に、このコードは x 軸を中心に合計 75 度回転することを意味しますか?
glRotatef(30.0,1,0,0);
glRotatef(45.0,1,0,0);
最も重要なこと:これらの関数を呼び出す前に glLoadIdentity() を呼び出すと、これらの機能がキャンセルされますか? つまり、
このコードが毎回保証していると思いますか?translates will be done from the origin?
scale changes will be done from the initial state?
void COpenGLControl::ZoomToFullExtent()
{
float zoom1 = (float)oglWindowWidth/(float)ImageWidth;
float zoom2 = (float)oglWindowHeight/(float)ImageHeight;
m_fZoom = min(zoom1,zoom2);
m_fZoomInverse = 1/m_fZoom;
m_fPosX = 0;
m_fPosY = 0;
OnDraw(NULL);
}
void COpenGLControl::FixedZoomIn()
{
m_fZoom = 2*m_fZoom;
m_fZoomInverse = 1/m_fZoom;
OnDraw(NULL);
}
void COpenGLControl::FixedZoomOut()
{
m_fZoom = 0.5*m_fZoom;
m_fZoomInverse = 1/m_fZoom;
OnDraw(NULL);
}
void COpenGLControl::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (WantToPan)
{
if (m_fLastX < 0.0f && m_fLastY < 0.0f)
{
m_fLastX = (float)point.x;
m_fLastY = (float)point.y;
}
diffX = (int)(point.x - m_fLastX);
diffY = (int)(point.y - m_fLastY);
m_fLastX = (float)point.x;
m_fLastY = (float)point.y;
if (nFlags & MK_MBUTTON)
{
m_fPosX += (float)0.2f*m_fZoomInverse*diffX;
m_fPosY += (float)0.2f*m_fZoomInverse*diffY;
}
OnDraw(NULL);
}
CWnd::OnMouseMove(nFlags, point);
}
void COpenGLControl::OnDraw(CDC *pDC)
{
// TODO: Camera controls
wglMakeCurrent(hdc,hrc);
glLoadIdentity();
gluLookAt(0,0,1,0,0,0,0,1,0);
glScalef(m_fZoom,m_fZoom,1.0);
glTranslatef(m_fPosX, m_fPosY, 0.0f);
wglMakeCurrent(NULL, NULL);
}