opengl之glScalef()函数

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;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值