Demo使用glRotatef ,glTranslatef来实现一个太阳、地球、月亮运动的3D图形。

1.glTranslatef() ——模型变换函数移动

voidglTranslatef(GLfloatx, GLfloaty, GLfloatz);

这个函数表示模型是怎样移动的。举个例子:

glTranslatef(-1.0,0.0,-2.0);//表示物体沿x负方向移动1.0,沿z轴负方向移动2.0。

2.glRotatef()——模型变换函数旋转

voidglRotatef(GLfloatangle, GLfloatx, GLfloaty, GLfloatz);

angle表示旋转的角度(注意单位不是弧度),(x,y,z)表示转轴。举个例子:

glRotatef(45.0, 0.0, 0.0, 1.0);//表示模型沿着(0,0,1)这个轴旋转45°。

3.glPerspective() ——投影变换函数透视投影

voidgluPerspective(GLdoublefovy, GLdoubleaspect, GLdoublezNear, GLdoublezFar);

glPerspective函数的相关参数代表的意义参看下图:

fovy视角宽度

aspect:w/h

平移、旋转、以及缩放效果:

正交投影以及透视投影:

正交投影下显示效果:

右击鼠标右键菜单选择是否显示坐标轴以及透视和正交投影模式:

透视投影:

源代码:

// GlutSolarDemo.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <gl/glut.h>
#include <math.h>
//圆周率宏
#define GL_PI 3.1415f
//获取屏幕的宽度
GLint SCREEN_WIDTH=0;
GLint SCREEN_HEIGHT=0;
//设置程序的窗口大小
GLint windowWidth=400;
GLint windowHeight=300;
//绕x轴旋转角度
GLfloat xRotAngle=0.0f;
//绕y轴旋转角度
GLfloat yRotAngle=0.0f;
//受支持的点大小范围
GLfloat sizes[2];
//受支持的点大小增量
GLfloat step;
//最大的投影矩阵堆栈深度
GLint iMaxProjectionStackDepth;
//最大的模型视图矩阵堆栈深度
GLint iMaxModeviewStackDepth;
//最大的纹理矩阵堆栈深度
GLint iMaxTextureStackDepth;GLfloat  whiteLight[] = { 0.4f, 0.4f, 0.4f, 1.0f };
GLfloat  sourceLight[] = { 0.8f, 0.8f, 0.8f, 1.0f };
GLfloat  lightPos[] = { 0.0f, 0.0f, 0.0f, 1.0f };GLint iCoordinateaxis=2;
GLint iProjectionMode=1;
void changSize(GLint w,GLint h);
//菜单回调函数
void processMenu(int value){switch(value){case 1:iCoordinateaxis=1;break;case 2:iCoordinateaxis=2;break;case 3:iProjectionMode=1;//强制调用窗口大小变化回调函数,更改投影模式为正交投影changSize(glutGet(GLUT_WINDOW_WIDTH),glutGet(GLUT_WINDOW_HEIGHT));break;case 4:iProjectionMode=2;//强制调用窗口大小变化回调函数,更改投影模式为透视投影changSize(glutGet(GLUT_WINDOW_WIDTH),glutGet(GLUT_WINDOW_HEIGHT));break;default:break;}//重新绘制glutPostRedisplay();
}
//显示回调函数
void renderScreen(void){static float fMoonRot = 0.0f;static float fEarthRot = 0.0f;//将窗口颜色清理为黑色glClearColor(0.0f, 0.0f, 0.0f, 0.0f);//把整个窗口清理为当前清理颜色:黑色;清除深度缓冲区。glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//将当前Matrix状态入栈glPushMatrix();if(2==iProjectionMode)glTranslatef(0.0f, 0.0f, -250.0f);   //透视投影为便于观察整个坐标系往内移动250个单位//坐标系绕x轴旋转xRotAngleglRotatef(xRotAngle,1.0f,0.0f,0.0f);//坐标系绕y轴旋转yRotAngleglRotatef(yRotAngle,0.0f,1.0f,0.0f);//进行平滑处理 glEnable(GL_POINT_SMOOTH);glHint(GL_POINT_SMOOTH,GL_NICEST);glEnable(GL_LINE_SMOOTH);glHint(GL_LINE_SMOOTH,GL_NICEST);glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);//白色绘制坐标系if(1==iCoordinateaxis){glColor3f(1.0f,1.0f,1.0f);glBegin(GL_LINES);glVertex3f(-90.0f,00.0f,0.0f);glVertex3f(90.0f,0.0f,0.0f);glVertex3f(0.0f,-90.0f,0.0f);glVertex3f(0.0f,90.0f,0.0f);glVertex3f(0.0f,0.0f,-90.0f);glVertex3f(0.0f,0.0f,90.0f);glEnd();glPushMatrix();glTranslatef(90.0f,0.0f,0.0f);glRotatef(90.0f,0.0f,1.0f,0.0f);glutSolidCone(3,6,10,10);glPopMatrix();glPushMatrix();glTranslatef(0.0f,90.0f,0.0f);glRotatef(-90.0f,1.0f,0.0f,0.0f);glutSolidCone(3,6,10,10);glPopMatrix();glPushMatrix();glTranslatef(0.0f,0.0f,90.0f);glRotatef(70.0f,0.0f,0.0f,1.0f);glutSolidCone(3,6,10,10);glPopMatrix();}glPushMatrix();glDisable(GL_LIGHTING);//Draw sun at(0.0f,0.0f,0.0f)glColor3ub(255, 255, 0);glutSolidSphere(15.0f, 30, 17);glEnable(GL_LIGHTING);//Move the light after we draw the sun!glLightfv(GL_LIGHT0,GL_POSITION,lightPos);//Rotate coordinate systemglColor3ub(0,0,255);glRotatef(fEarthRot, 0.0f, 1.0f, 0.0f);fEarthRot += 5.0f;if(fEarthRot > 360.0f)fEarthRot = 0.0f;glTranslatef(105.0f,0.0f,0.0f);//Draw the EarthglutSolidSphere(15.0f, 30, 17);//Rotate from Earth based coordinates and draw MoonglColor3ub(200,200,200);glRotatef(fMoonRot,0.0f, 1.0f, 0.0f);fMoonRot+= 15.0f;if(fMoonRot > 360.0f)fMoonRot = 0.0f;glTranslatef(30.0f, 0.0f, 0.0f);glutSolidSphere(6.0f, 30, 17);glPopMatrix();//恢复压入栈的MatrixglPopMatrix();//交换两个缓冲区的指针glutSwapBuffers();
}
//设置Redering State
void setupRederingState(void){// Enable lightingglEnable(GL_LIGHTING);// Setup and enable light 0glLightModelfv(GL_LIGHT_MODEL_AMBIENT,whiteLight);glLightfv(GL_LIGHT0,GL_DIFFUSE,sourceLight);glLightfv(GL_LIGHT0,GL_POSITION,lightPos);glEnable(GL_LIGHT0);// Enable color trackingglEnable(GL_COLOR_MATERIAL);// Set Material properties to follow glColor valuesglColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);glEnable(GL_DEPTH_TEST);  //使能深度测试glFrontFace(GL_CCW);        //多边形正面为逆时针方向glEnable(GL_CULL_FACE);        //不显示背面//设置清理颜色为黑色glClearColor(0.0f,0.0,0.0,1.0f);//设置绘画颜色为绿色glColor3f(1.0f,1.0f,0.0f);//使能深度测试glEnable(GL_DEPTH_TEST);//获取受支持的点大小范围glGetFloatv(GL_POINT_SIZE_RANGE,sizes);//获取受支持的点大小增量glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step);//获取最大的投影矩阵堆栈深度glGetIntegerv( GL_MAX_PROJECTION_STACK_DEPTH,&iMaxProjectionStackDepth);//获取最大的模型视图矩阵堆栈深度glGetIntegerv( GL_MAX_MODELVIEW_STACK_DEPTH,&iMaxModeviewStackDepth);//获取最大的纹理矩阵堆栈深度glGetIntegerv( GL_MAX_TEXTURE_STACK_DEPTH,&iMaxTextureStackDepth);printf("point size range:%f-%f\n",sizes[0],sizes[1]);printf("point step:%f\n",step);printf("iMaxProjectionStackDepth=%d\n",iMaxProjectionStackDepth);printf("iMaxModeviewStackDepth=%d\n",iMaxModeviewStackDepth);printf("iMaxTextureStackDepth=%d\n",iMaxTextureStackDepth);
}
//窗口大小变化回调函数
void changSize(GLint w,GLint h){//横宽比率GLfloat ratio;//设置坐标系为x(-100.0f,100.0f)、y(-100.0f,100.0f)、z(-100.0f,100.0f)GLfloat coordinatesize=120.0f;//窗口宽高为零直接返回if((w==0)||(h==0))return;//设置视口和窗口大小一致glViewport(0,0,w,h);//对投影矩阵应用随后的矩阵操作glMatrixMode(GL_PROJECTION);//重置当前指定的矩阵为单位矩阵 glLoadIdentity();ratio=(GLfloat)w/(GLfloat)h;//正交投影if(1==iProjectionMode){printf("glOrtho\n");if(w<h)glOrtho(-coordinatesize,coordinatesize,-coordinatesize/ratio,coordinatesize/ratio,-coordinatesize*2.0f,coordinatesize*2.0f);elseglOrtho(-coordinatesize*ratio,coordinatesize*ratio,-coordinatesize,coordinatesize,-coordinatesize*2.0f,coordinatesize*2.0f);//当前矩阵设置为模型视图矩阵glMatrixMode(GL_MODELVIEW);//重置当前指定的矩阵为单位矩阵 glLoadIdentity();}else{printf("gluPerspective\n");gluPerspective(45,ratio,10.0f,500.0f);//当前矩阵设置为模型视图矩阵glMatrixMode(GL_MODELVIEW);//重置当前指定的矩阵为单位矩阵 glLoadIdentity();}}//按键输入处理回调函数
void specialKey(int key,int x,int y){if(key==GLUT_KEY_UP){xRotAngle-=5.0f;}else if(key==GLUT_KEY_DOWN){xRotAngle+=5.0f;}else if(key==GLUT_KEY_LEFT){yRotAngle-=5.0f;}else if(key==GLUT_KEY_RIGHT){yRotAngle+=5.0f;}//重新绘制glutPostRedisplay();
}void timerFunc(int value)
{glutPostRedisplay();glutTimerFunc(100, timerFunc, 1);
}int main(int argc, char* argv[])
{//菜单GLint iMainMenu;GLint iCoordinateaxisMenu;GLint iOrthoOrPerspectMenu;//初始化glut glutInit(&argc,argv);//使用双缓冲区、深度缓冲区。glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);//获取系统的宽像素SCREEN_WIDTH=glutGet(GLUT_SCREEN_WIDTH);//获取系统的高像素SCREEN_HEIGHT=glutGet(GLUT_SCREEN_HEIGHT);//创建窗口,窗口名字为OpenGL Solar DemoglutCreateWindow("OpenGL Solar Demo");//设置窗口大小glutReshapeWindow(windowWidth,windowHeight);//窗口居中显示glutPositionWindow((SCREEN_WIDTH-windowWidth)/2,(SCREEN_HEIGHT-windowHeight)/2);//窗口大小变化时的处理函数glutReshapeFunc(changSize);//设置显示回调函数 glutDisplayFunc(renderScreen);//设置按键输入处理回调函数glutSpecialFunc(specialKey);//菜单回调函数iCoordinateaxisMenu=glutCreateMenu(processMenu);//添加菜单glutAddMenuEntry("Display coordinate axis",1);glutAddMenuEntry("Don't dispaly coordinate axis",2);iOrthoOrPerspectMenu=glutCreateMenu(processMenu);glutAddMenuEntry("Ortho",3);glutAddMenuEntry("Perspect",4);iMainMenu=glutCreateMenu(processMenu);glutAddSubMenu("Display or hide coordinate axis",iCoordinateaxisMenu);glutAddSubMenu("Ortho Or Perspect",iOrthoOrPerspectMenu);//将菜单榜定到鼠标右键上glutAttachMenu(GLUT_RIGHT_BUTTON);glutTimerFunc(250,timerFunc, 1);//设置全局渲染参数setupRederingState();glutMainLoop();return 0;
}

VS2012下基于Glut glRotatef glTranslatef示例程序:相关推荐

  1. VS2012下基于Glut OpenGL GL_QUADS示例程序:

    OpenGL 使用GL_QUADS绘制四边形示例程序,显示效果如下所示. GL_QUADS连续点生成四边形的规则如下图所示: 源代码如下: // GlutQuadsDemo.cpp : 定义控制台应用 ...

  2. VS2012下基于Glut OpenGL GL_STENCIL_TEST示例程序:

    模板测试是把像素存储在模板缓冲区的值与一个参考值进行比较.根据测试的结果,对模板缓冲区中得这个值进行相应的修改. Note:模板测试只有在存在模板缓冲区的情况下才会执行,如果不存在模板缓冲区,模板测试 ...

  3. VS2012下基于Glut OpenGL GL_POLYGON示例程序:

    很多书介绍GL_POLYGON连续点生成多边形时这下点必须是凸多边形的,规则如下图所示.写个Demo验证了下似乎不是凸多边形的也可以. Demo的正面与背面显示效果: 源代码如下所示: // Glut ...

  4. VS2012下基于Glut OpenGL glScissor示例程序:

    剪裁测试用于限制绘制区域.我们可以指定一个矩形的剪裁窗口,当启用剪裁测试后,只有在这个窗口之内的像素才能被绘制,其它像素则会被丢弃.换句话说,无论怎么绘制,剪裁窗口以外的像素将不会被修改.有的朋友可能 ...

  5. VS2012下基于Glut 绘制立方体示例程序:

    使用glBegin(GL_QUADS)绘制六个侧面来组成一个立方体:并使用glFrontFace(GL_CW).glFrontFace(GL_CCW)来设置每个面的正面:使用glColor3ub来设置 ...

  6. VS2012下基于Glut OpenGL glDepthMask示例程序:

    glDepthMask (GLboolean flag)函数可以决定将他之后的数据不写入深度缓冲区.当flag为GL_TRUE时之后的数据不写入深度缓冲区,即使启用了深度缓冲区测试功能. 使用上一个D ...

  7. VS2012下基于Glut OpenGL glEdgeFlag示例程序:

    glEdgeFlag (GLboolean flag)表示一个顶点是否应该被认为是多边形的一条边界边的起点.flag为GL_TRUE后面的点都被认为是边界上的点,flag为GL_FALSE则之后的点不 ...

  8. VS2012下基于Glut OpenGL GL_POLYGON_STIPPLE示例程序:

    直线可以被画成虚线,而多边形则可以进行镂空. 首先,使用glEnable(GL_POLYGON_STIPPLE);来启动镂空模式(使用glDisable(GL_POLYGON_STIPPLE)可以关闭 ...

  9. VS2012下基于Glut OpenGL GL_QUAD_STRIP示例程序:

    OpenGL连续点通过GL_QUAD_STRIP生成四边形规则如下图所示: 演示程序效果如下图所示: 源代码如下所示: // GlutQuadStripDemo.cpp : 定义控制台应用程序的入口点 ...

最新文章

  1. 测试归测试,自动驾驶向个人全面开放依然长路漫漫
  2. linux启动java jar文件_推荐:Linux启动Java程序jar包Shell脚本
  3. 基本数据类型和引用数据类型作为参数时候的问题
  4. 学完python基础知识之后可以做些什么-学完Python基础知识后,你真的会python吗?...
  5. _stdcall调用
  6. maven scope含义的说明
  7. C语言 满分代码:L1-044 稳赢 (15分)(解题报告)
  8. (进阶篇)Redis6.2.0 集群 哨兵模式_搭建_01
  9. ARM处理器上电/复位操作
  10. Python 操作 protobuf 常见用法
  11. opencv 写视频时找不到编码器问题解决方法
  12. 字段分行加一 sql语句
  13. ad域 禁用账号_AD域撤销域用户管理员权限方案
  14. 浅谈IDEA Scratch files万能的临时文件功能
  15. android 语音自动播报,Android语音播报的两种简单实现
  16. extmail mysql数据库 重启_linux下安装和配置extmail
  17. 如何开好项目kickoff会议
  18. 两个分数相加(结果最简)
  19. 四舍五入函数round_如何在R中使用round()将数字四舍五入
  20. 数据表格之多表头设置

热门文章

  1. linux单块网卡绑定多个ip及网卡聚合绑定多个ip方法
  2. Oracle数据库的四种启动方式
  3. php的前端环境,PHP中的环境变量
  4. oracle迁移性能对比,SQL Server 2015与Oracle性能对比.doc
  5. mysql openwrt 编译_如何编译OpenWrt
  6. java游戏有个按技能是旋风_快打旋风加难技能增强版
  7. CSS高级技巧【学习笔记】
  8. bigdecimal divide四舍五入_BigDecimal 四则运算
  9. Scale-Adaptive Neural Dense Features: Learning via Hierarchical Context Aggregation
  10. 两个3*3*n旋转矩阵在第三维相乘