博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
opengl之glScalef()函数
阅读量:2440 次
发布时间:2019-05-10

本文共 2715 字,大约阅读时间需要 9 分钟。

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

转载地址:http://jzjqb.baihongyu.com/

你可能感兴趣的文章
oracle备份功能简述
查看>>
[转]数据库三大范式
查看>>
恢复编录的创建和使用.txt
查看>>
truncate 命令使用
查看>>
[script]P_CHECK_BLACK.sql 检查当前用户下是否有varchar2字段的末尾包含空格
查看>>
实验-数据分布对执行计划的影响.txt
查看>>
实验-闪回数据库
查看>>
实验-闪回表
查看>>
oracle审计
查看>>
日期格式的转换
查看>>
typeof运算符_JavaScript typeof运算子
查看>>
react 前端拆分_React中的代码拆分
查看>>
jsonp_JSONP指南
查看>>
如何禁用ESLint规则
查看>>
如何在macOS上安装PostgreSQL
查看>>
mysql用户权限_MySQL用户权限
查看>>
JavaScript切换条件
查看>>
在邮件标头中找到无效的字符_在Express中使用HTTP标头
查看>>
express 邮件发送_使用Express发送回复
查看>>
react生命周期_React生命周期事件
查看>>