opengl之glScalef()函数

来源:互联网 发布:mac上打开flac 编辑:程序博客网 时间:2024/05/29 04:28

glScalef是openGL中的模型缩放函数,就是把当前矩阵与一个表示延各个轴对物体进行拉伸、压缩、反射的矩阵相乘。这个物体的每个点的x,y,z坐标与对应的xyz参数相乘。

先看函数定义
void glScalef(GLfloat x,
       GLfloat y,
       GLfloat z);

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

例如:
如glScalef(2.0f,3.0f,4.0f);将模型按x,y,z方向分别拉伸了2,3,4倍。
参数也可取负数,也可以理解为先关于某轴翻转180°,再缩放;
如glScalef(1.0f,1.0f,-1.0f);将模型关于z轴翻转了180°(即关于xy轴所在平面对称);

如glScalef(1.0f,1.0f,-2.0f);将模型关于-z轴拉伸2倍。

下面通过具体的代码进行说明:

这段代码中主要功能是实现鼠标按键出发事件,就不一一截图了,大家自行运行体会

// 001.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <GL/glut.h>#include "math.h"float seta = 0;float mx=0,my=0,mz=-50,rx=0,ry=0,rz=0;//平移和旋转float sx=1,sy=1,sz=1;//缩放float mspeed=1.5,rspeed=1;void myDisplay(void);void myTimerFunc(int val){seta+=1;myDisplay();glutTimerFunc(1,myTimerFunc,0);}void myKeyboardFunc(unsigned char key,int x, int y){switch(key){case 'w':my+=mspeed;break;case 's':my-=mspeed;break;case 'a':mx-=mspeed;break;case 'd':mx+=mspeed;break;case 'q':mz+=mspeed;break;case 'e':mz-=mspeed;break;case 'i':rx+=rspeed;break;case 'k':rx-=rspeed;break;case 'j':ry-=rspeed;break;case 'l':ry+=rspeed;break;case 'u':rz+=rspeed;break;case 'o':rz-=rspeed;break;case '1':sx+=0.1;break;case '2':sx-=0.1;break;case '3':sy+=0.1;break;case '4':sy-=0.1;break;case '5':sz+=0.1;break;case '6':sz-=0.1;break;}}void SetRC(){glShadeModel(GL_FLAT);//glEnable(GL_CULL_FACE);glFrontFace(GL_CCW);glEnable(GL_DEPTH_TEST);glPolygonMode(GL_BACK,GL_LINE);}void myDisplay(void){    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glPushMatrix();//模型控制glTranslatef(mx,my,mz);glRotatef(rz,0,0,1);//rglRotatef(rx,1,0,0);//pglRotatef(ry,0,1,0);//hglScalef(sx,sy,sz);//绘制三角扇glBegin(GL_TRIANGLE_FAN);glVertex3f(0,20,0);GLfloat angle,x,y=0,z;int iPivot = 1;//标记颜色for(angle = 0;angle<2*3.14;angle+=3.14/8){x = 20*sin(angle);z = 20*cos(angle);if(iPivot%2)glColor3f(1,0,0);elseglColor3f(0,1,0);iPivot++;glVertex3f(x,0,z);}glEnd();glPopMatrix();glutSwapBuffers();}void myReshape(int w,int h){GLfloat nRange = 100.0f;glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60,GLfloat(w)/h,1,1000);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}int main(int argc, char *argv[]){//初始化opengl环境    glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);//创建窗口    glutInitWindowPosition(100, 100);    glutInitWindowSize(400, 400);    glutCreateWindow("第一个OpenGL程序");//设置相关回掉函数    glutDisplayFunc(&myDisplay);//绘制三角形glutTimerFunc(1,myTimerFunc,0);//设置计时器glutReshapeFunc(&myReshape);//glutKeyboardFunc(&myKeyboardFunc);////初始化opengl绘制状态SetRC();//进入消息循环    glutMainLoop();    return 0;}


0 0
原创粉丝点击