OpenGL中平移使用glTranslated函数或者glTranslatef函数实现,该函数的声明如下所示:
WINGDIAPI void APIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z);
WINGDIAPI void APIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z);
其中,坐标(x,y,z)表示分别沿着x、y、z轴移动的距离。
使用glTranslated函数或者glTranslatef函数就是在当前矩阵的基础上,乘以下面这个4*4矩阵得到了平移变换:
这里,应该注意,z的值应该是小于0的,因为我们观察图形的方向是从向着屏幕里面的,屏幕所在的平面是z=0面,只有z<0的平面才能被看到。
我们看一个平移的例子,下面的例子就是Jeff Molofee第三课做的那个例子,我只是使用了那个三角形:
int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity(); // 重置模型视图矩阵为单位矩阵,即当前矩阵就是单位矩阵
glTranslatef(-1.5f,0.0f,-6.0f); // 向左(x轴负方向)移动1.5个单位,向里(z轴负方向)移动6个单位
glBegin(GL_TRIANGLES); // 启动画三角形
glColor3f(1.0f,0.0f,0.0f); // 设置上顶点颜色为红色
glVertex3f( 0.0f, 1.0f, 0.0f); // 上顶点
glColor3f(0.0f,1.0f,0.0f); // 设置左下顶点为绿色
glVertex3f(-1.0f,-1.0f, 0.0f); // 左下顶点
glColor3f(0.0f,0.0f,1.0f); // 设置右下顶点为蓝色
glVertex3f( 1.0f,-1.0f, 0.0f); // 右下顶点
glEnd(); // 关闭画三角形
return TRUE;
}
运行效果如图所示:
屏幕所在平面的中心位置坐标为(0.0, 0.0,)。
调用glTranslatef(-1.5f,0.0f,-6.0f); 将三角形的位置平移到点(-1.5, 0.0, -6)处。
上面直接调用了glTranslatef函数。如果我们不使用该函数,就可以直接定义一个矩阵,然后使用glLoadMatrixf函数设置当前矩阵,实现平移变换,如下所示:
int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
GLfloat translateMatrix[4][4] = { // 定义一个用来进行平移变换的4*4矩阵
1.0f, 0.0f, 0.0f, 0.5f,
0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
-1.5f, 0.0f, -6.0f, 1.0f
};
glLoadMatrixf(&translateMatrix[0][0]); // 调用glLoadMatrixf函数设置当前矩阵为所定义的矩阵
glBegin(GL_TRIANGLES);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 0.0f, 1.0f, 0.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glEnd();
return TRUE;
}
运行效果和上面的相同。
使用glLoadMatrixf函数的时候,需要定义一个4*4数组,而且数组应该是列主序的。
例如,数组中的元素按照下面的排列就是列主序的:
数组中的元素按照下面的排列就是行主序的:
另外,还可以使用glMultMatrixd 函数或者glMultMatrixf函数来实现上述变换,该函数的声明如下所示:
WINGDIAPI void APIENTRY glMultMatrixd (const GLdouble *m);
WINGDIAPI void APIENTRY glMultMatrixf (const GLfloat *m);
矩阵m也要求是列主序的。