Изучение книги OpenGL SuperBible fram Addison-Wesley
, я прочитал:
каждый вызов glTranslate кумулятивный на видовую матрицу
Что это значит?
Означает ли это, что, например, этот код:(каждый вызов glTranslate является кумулятивным по матрице просмотра модели), что это значит и как отключить эту функцию?
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
и glRotatef
тоже?
, например, этот код:
glScalef(2.0,3.0,4.0);
glScalef(3.0,4.0,5.0);
первым превратить 1x1x1
кубоид в 2x3x4
кубического прямоугольника, а затем превращает этот кубический прямоугольник к 6x12x20
один?
И наконец, означает ли этот код, что общий поворот на 75 градусов вокруг оси х?
glRotatef(30.0,1,0,0);
glRotatef(45.0,1,0,0);
наиболее importantant: ли вызова 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);
}