D12.1.0 如何在MFC中使用OpenGL实现图形旋转,缩放和移动?

01函数解释

void glTranslatef(GLfloat x,GLfloat y,GLfloat z);

函数功能:沿X轴正方向平移x个单位(x是有符号数),沿Y轴正方向平移y个单位(y是有符号数),沿Z轴正方向平移z个单位(z是有符号数)。

void glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLfloat z);

先解释一下旋转方向,做(0,0,0)到(x,y,z)的向量,用右手握住这条向量,大拇指指向向量的正方向,四指环绕的方向就是旋转的方向。

函数功能:以点(0,0,0)到点(x,y,z)为轴,旋转angle角度;

void glScalef(GLfloat x, GLfloat y, GLfloat z);

函数功能:参数x,y,z分别为模型在x,y,z轴方向的缩放比。

原文链接: https://blog.csdn.net/tan_handsome/article/details/50614146

02具体步骤

步骤如下:

1、设置当前绘图句柄。

2、设置绘图模型

3、进行缩放,移动,旋转等操作

这些操作需要在绘图之前完成。因为glTranslatef(),glScalef(),glRotatef()等此类几何变换接口的作用是对当前模型空间进行几何变换,在glBegin()和glEnd()之间是无效的。因此,对模型的位置进行转换,要在glBegin()和glEnd()接口之前进行处理。

4、画图

glBegin(GL_POINTS);//自己根据实际情况选定图元模式
    ………………
    各种调用glColor3f()和glVertex3fv();
    ………………
glEnd();

5、交换缓冲区

glFinish();
::SwapBuffers(hDC);

代码如下:

**//1.设置当前绘图句柄。已知HGLRC的情况下,设定当前绘图句柄为hDC.**
HDC hDC = ::GetDC(hWnd);
if (_hRC)
    wglMakeCurrent(hDC, _hRC);
else
    return;

**//2.设置绘图模型**
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//设置透视投影//
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glColor3f(1.0, 1.0, 0.0);
gluPerspective(80, (double)23 / (double)10, 1.5, 0);/*视角80度,纵横比,进裁剪面,远裁剪面*/

//设置模型视图矩阵,开始画图//
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(2, 2, 2, 0, 0, 0, 0, 1, 0);


**//3、进行缩放,移动,旋转等操作**
glTranslatef(_translatePoint.x, _translatePoint.y, _translatePoint.z);
glRotatef(_xAngle, 1.0f, 0.0f, 0.0f);
glRotatef(_yAngle, 0.0f, 1.0f, 0.0f);
glScalef(_scale, _scale, _scale);

**//4、绘图**
DrawEverythingYouWant();

**//5、刷新缓冲区,显示图片**
glFinish();
::SwapBuffers(hDC);

03关于glPushMatirx()和glPopMatrix()的理解

一句话理解:可用于恢复模型最开始的状态。

比如说在开始坐标原点在(0,0,0)的位置,再进行一堆移动操作之后,原点位置变为(10,100,200)。这个时候你想恢复到(0,0,0),怎么办?在移动模型之前使用glPushMatirx()保存好模型的状态,当需要恢复之前的状态是,调用函数glPopMatrix()。

glPushMatrix、glPopMatrix操作其实就相当于栈里的入栈和出栈。许多人不明白的可能是入的是什么,出的又是什么?

例如你当前的坐标系原点在你电脑屏幕的左上方。现在你调glPushMatrix,然后再调用一堆平移、旋转代码等等,然后再画图。那些平移和旋转都是基于坐上角为原点进行变化的。而且都会改变坐标的位置,经过了这些变化后,你的坐标肯定不再左上角了。

那如果想恢复怎么办呢?这时就调用glPopMatrix从栈里取出一个“状态”,这个状态就是你调用glPushMatrix之前的那个状态。就如很多opengl的书上所讲:调用glPushMatrix其实就是把当前状态做一个副本放入堆栈之中。

当你做了一些移动或旋转等变换后,使用glPushMatrix();OpenGL会把这个变换后的位置和角度保存起来。然后你再随便做第二次移动或旋转变换,再用glPopMatrix(),OpenGL就把刚刚保存的那个位置和角度恢复。

比如:

glLoadIdentity();
glTranslatef(1,0,0);//向右移动(1,0,0)
glPushMatrix();//保存当前位置
glTranslatef(0,1,0);//现在是(1,1,0)了
glPopMatrix();//这样,现在又回到(1,0,0)了

03板块大部分解释摘自:https://blog.csdn.net/passtome/article/details/7768379

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值