用glut库实现旋转,平移,缩放

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangkaidehao/article/details/80315318

平移glTranslate<f,d>(tx,ty,tz),对于二维情形,tz=0.0

示例如下:

glTranslatef(3.0,2.0f,0.0f);

旋转 glRotate<f,d>(theta,vx,vy,vz):

    theta,vx,vy,vz指定这个旋转物体的矩阵,物体将绕着(0,0,0)到(x,y,z)的直线以逆时针旋转,参数 theta表示旋转的角度。取正时为逆时针。对于二维情形,tx=0.0 ty=0.0 tz=1.0.

示例如下:

glRotatef(30.0,0.0,0.0,1.0);

缩放  glScale<f,d>(sx,sy,sz):

    把当前矩阵和一个表示缩放物体的

矩阵相乘。sx,sy,sz指定这个缩放物体的矩阵,分别表示在 x,y,z方向上的缩放比例,它们可以是任意的实数值,当缩放参数为负值时,该函数为反射矩阵,缩放相对于原点进行.

示例如下:

glScalef(1.0,2.0,1.0);

以下用平移,旋转,缩放绘制一个图形:


代码如下:

#include<GL/glut.h>
#include "math.h"

void init(void)
{
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);//投影视图
gluOrtho2D(-5.0,5.0,-5.0,5.0);//设置显示的范围是X:-5.0~5.0,Y:-5.0~5.0
glMatrixMode(GL_MODELVIEW);//设置当前操作的矩阵为“模型视图矩阵”
}


void drawDiamond(void)//绘制中心在原点的菱形,一个顶角60度。
{
glBegin(GL_POLYGON);//顶点指定需要按逆时针方向
glVertex2f(0.0f,-1.0f);//下点
glVertex2f(sqrt(3),0.0f);//右点
glVertex2f(0.0f,1.0f);//上点
glVertex2f(-sqrt(3),0.0f);//左点
glEnd();
}


void myDraw(void)
{
glClear(GL_COLOR_BUFFER_BIT);//清空
glLoadIdentity();//将当前矩阵设为单位矩阵

glPushMatrix();
glScalef(1.0,1.0,1.0);
glRotatef(-90.0,0.0,0.0,1.0);//绕(0,0,1)点顺时针旋转90度
glTranslatef(-sqrt(3),0.0f,0.0f);
glColor3f(1.0,0.0,0.0);
drawDiamond();//上方的红色棱形
glPopMatrix();

//glLoadIdentity();//将当前矩阵设为单位矩阵

glPushMatrix();
glScalef(1.0,1.0,1.0);
glRotatef(30,0.0,0.0,1.0);
glTranslatef(-sqrt(3),0.0,0.0);
glColor3f(0.0,0.0,1.0);
drawDiamond();//右下蓝色矩形
glPopMatrix();

glPushMatrix();
glScalef(1.0,1.0,1.0);
glRotatef(-30,0.0,0.0,1.0);//逆时针旋转30角度
glTranslatef(sqrt(3),0.0,0.0f);
glColor3f(0.0,1.0,0.0);
drawDiamond();//左下绿色矩形
glPopMatrix();


glFlush();
}



void main(int argc,char* *argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(0,0);
glutInitWindowSize(600,600);
glutCreateWindow("几何变换函数");
init();
glutDisplayFunc(myDraw);
glutMainLoop();
}

注意:在绘图中,平移和旋转缩放的顺序是与代码的顺序相反的,也就是对于代码:

glScalef(1.0,1.0,1.0);
glRotatef(30,0.0,0.0,1.0);
glTranslatef(-sqrt(3),0.0,0.0);
程序绘图时,是先平移,再旋转,最后缩放。这是因为对于矩阵来说:假设当前矩阵为单位矩阵,然后先乘以一个表示旋转的矩阵 R,再乘以一个表示移动的矩阵 T,最后得到的矩阵再乘上每一个顶点的坐标矩阵 v。那么,经过变换得到的顶点坐标就是((RT)v)。由于矩阵乘法满足结合率,((RT)v)=R(Tv))。
展开阅读全文

没有更多推荐了,返回首页