void glTranslatef(GLfloat x,GLfloat y,GLfloat z);
函数功能:沿X轴正方向平移x个单位(x是有符号数)
  沿Y轴正方向平移y个单位(y是有符号数)
  沿Z轴正方向平移z个单位(z是有符号数)
void glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLfloat z);
先解释一下旋转方向,做(0,0,0)到(x,y,z)的向量,用右手握住这条向量,大拇指指向向量的正方向,四指环绕的方向就是旋转的方向;
函数功能:以点(0,0,0)到点(x,y,z)为轴,旋转angle角度;
这两个函数,不论是平移还是旋转都是针对于上一个矩阵来说的,下面举个例子说明一下
以下函数代码模拟了地月模型
#include<Windows.h>
#include<GL\glut.h>
//太阳、地球和月亮
//假设每个月都是30天
//一年12个月,共是360天
static int day = 200; // day的变化:从0到359
void myDisplay(void)
{
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(75, 1, 1, 2000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, -200, 200, 0, 0, 0, 0, 0, 1);
//绘制红色的“太阳”
glColor3f(1.0f, 0.0f, 0.0f);
glutSolidSphere(69.6, 100, 100);

//绘制蓝色的“地球”
glColor3f(0.0f, 0.0f, 1.0f);
glRotatef(day / 360.0*360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(150, 0.0f, 0.0f);
glutSolidSphere(15.945, 100, 100);

//绘制黄色的“月亮”
glColor3f(1.0f, 1.0f, 0.0f);
glRotatef(day / 30.0*360.0 - day / 360.0*360.0, 0.0f, 0.0f, -1.0f);
glRotatef(day / 30.0*360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(38, 0.0f, 0.0f);
glutSolidSphere(4.345, 100, 100);
glFlush();
glutSwapBuffers();
}
void myIdle(void)
{
Sleep(50);
++day;
if (day >= 360)
day = 0;
myDisplay();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowPosition(200, 100);
glutInitWindowSize(600, 600);
glutCreateWindow("I love OpenGL");
glutDisplayFunc(&myDisplay);
glutIdleFunc(&myIdle);
glutMainLoop();
return 0;
}

这段程序代码的大致功能是在屏幕中心(坐标原点)绘制一个红色的太阳,然后将坐标原点沿x轴平移150单位,然后以Z轴正向为旋转轴旋转day/360*360个角度,沿X轴正向平移150个单位绘制蓝色的地球,再以地球为中心以Z轴正向为旋转轴旋转day / 30.0*360.0 - day / 360.0*360.0个角度,沿X轴正向平移38个单位绘制黄色的月球
运行的结果是这样的:
下面做一下修改
#include<Windows.h>
#include<GL\glut.h>
//太阳、地球和月亮
//假设每个月都是30天
//一年12个月,共是360天
static int day = 200; // day的变化:从0到359

void myDisplay(void)
{
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);

glLoadIdentity();
gluPerspective(75, 1, 1, 2000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, -200, 200, 0, 0, 0, 0, 0, 1);

//绘制红色的“太阳”
glColor3f(1.0f, 0.0f, 0.0f);
glutSolidSphere(69.6, 100, 100);
glPushMatrix();//修改的地方,将太阳的变换矩阵压入栈中
//绘制蓝色的“地球”
glColor3f(0.0f, 0.0f, 1.0f);
glRotatef(day / 360.0*360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(150, 0.0f, 0.0f);
glutSolidSphere(15.945, 100, 100);
//绘制黄色的“月亮”
glPopMatrix();//修改的地方,将栈中的矩阵弹出来
glColor3f(1.0f, 1.0f, 0.0f);
glRotatef(day / 30.0*360.0 - day / 360.0*360.0, 0.0f, 0.0f, -1.0f);
glRotatef(day / 30.0*360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(120, 0.0f, 0.0f);//修改的地方,沿X轴平移120个单位(方便观察)
glutSolidSphere(10, 100, 100);//修改的地方,绘制的月亮稍微大一点(方便观察)
glFlush();
glutSwapBuffers();
}
void myIdle(void)
{
Sleep(50);
++day;
if (day >= 360)
day = 0;
myDisplay();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowPosition(200, 100);
glutInitWindowSize(600, 600);
glutCreateWindow("I love OpenGL");
glutDisplayFunc(&myDisplay);
glutIdleFunc(&myIdle);
glutMainLoop();
return 0;
}

“月亮”的平移和旋转是不是相对于太阳来说了

OpenGL中平移函数glTranslatef()、旋转函数glRotatef()的理解(非常好的文章)相关推荐

  1. OpenGL中平移函数glTranslatef()、旋转函数glRotatef()的理解

    https://blog.csdn.net/tan_handsome/article/details/50614146 void glTranslatef(GLfloat x,GLfloat y,GL ...

  2. OPenGL中的VBO、VAO、EBO作用理解

    VBO是顶点缓冲对象(Vertex Buffer Objects, VBO),包含了顶点的3d坐标和颜色.但它们是按同类数组存储的,存放在一片显存空间中,程序并不知道这些数字哪个代表3d坐标,哪个代表 ...

  3. 关于在Opengl中先平移后旋转和先旋转后平移的效果不一样的原因

    一.现象 在OpenGL中先移动后旋转与先旋转后移动的最终效果是并不一定相同的,也就是说在Opengl中如果调用函数glTranslatef和函数glRotatef的次序不同,即使参数一样,效果也可能 ...

  4. OpenGL中glRotatef()函数究竟对矩阵做了什么

    OpenGL中glRotatef()函数究竟对矩阵做了什么 我们知道OpenGL中维持着两套矩阵,一个是模型视图矩阵(model view matrix),另一个是投影矩阵(projection ma ...

  5. opengl中的glRotatef 函数

    函数原型:glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLfloat z) 该函数用来设置opengl中绘制实体的自转方式,即物体如何旋转 参数说明: an ...

  6. opencv 中affine函数实现旋转和平移

    图像旋转和平移是图像处理中常用的一种操作,opencv2和opencv3中对图像的旋转和平移都是通过仿射变换函数cv::warpAffine()来实现的. 1.图像的旋转 图像的旋转具体实现分为两步: ...

  7. OpenGL中的平移旋转缩放

    1.opengl中缩放使用的函数是glScalef 其原型为void glScalef(GLfloat  x,  GLfloat  y,  GLfloat  z); 该函数表示模型在各轴上进行扩大和缩 ...

  8. OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理【转帖】

    OpenGL中的glLoadIdentity.glTranslatef.glRotatef原理 单位矩阵 对角线上都是1,其余元素皆为0的矩阵. 在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法 ...

  9. 计算机图形学OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理,用法

    单位矩阵 对角线上都是1,其余元素皆为0的矩阵. 在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,我们称这种矩阵为单位矩阵. 它是个方阵,除左上角到右下角的对角线(称为主对角线)上的元素 ...

最新文章

  1. 谈一谈算法工程师的落地能力
  2. php 长短字符串转换,将php的数组按照字符串长短进行排序
  3. Windows Server 2003 简介
  4. 原生态纯JavaScript 100大技巧大收集---你值得拥有
  5. CodeForces - 1295C Obtain The String(dp预处理+贪心)
  6. notepad++ tcl_TCL科技前三季度净利20亿元,投资并购超200亿元
  7. 用手动和自动分别实现使用其DVD安装盘作为本地yum源
  8. mysql 笔记打包下载_mysql 5.7压缩包安装笔记
  9. QTP和WinRunner区别
  10. 【java】抽象类下有两个具体子类,子类下有两个实例
  11. adb dumpsys 查看手机内存
  12. 一个开发周期为6个月的中小型软件开发项目成本预算大致表,不足之处请指点...
  13. 导数与微分的知识点思维导图_高中历史各大板块知识点与思维导图汇总(必修二)...
  14. html5制作前端优势,HTML5前端开发原来有这么多优势!
  15. SaveIG什么意思--Instagram图片下载最佳途径,
  16. 开发者经验谈:如何一天时间搞定iOS游戏开发?
  17. Spring核心是什么
  18. division by zero_MySQL5.7 group_by报错问题解决办法,大部分程序员都收藏了
  19. 《机器学习基石》第12节课学习笔记
  20. 小红书流量怎么提升?小红书流量不好是什么原因导致?

热门文章

  1. 打包vue项目的方法
  2. python字符串转浮点数_Python字符串转换成浮点数函数分享
  3. 2012年12月读书计划
  4. 新手该如何使用 GitHub?(超详细)
  5. PAT——年会抽奖(错位 排序 )
  6. 数学家George Dantzig的传奇故事 - 把公认的统计学难题当做家庭作业解答
  7. 一、SQL Server列名显示无效却可以运行问题解决?
  8. R语言:R语言ggplot2的安装过程。
  9. c语言写字符个数,利用c语言写出并判断字符的个数
  10. 千万别学英语中的方法