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); //r
glRotatef(rx,1,0,0); //p
glRotatef(ry,0,1,0); //h
glScalef(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);
else
glColor3f(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;
}