OpenGL学习:第四课

OpenGL学习:第四课

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也要求是列主序的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值