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;
}
#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个单位绘制黄色的月球
运行的结果是这样的:
![](https://i-blog.csdnimg.cn/blog_migrate/cc987d2b5fbd4280c6ed9758df1167a9.png)
下面做一下修改
#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;
}
//太阳、地球和月亮
//假设每个月都是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;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6c4d42c27d6e628b54a378f1e9a10608.png)
“月亮”的平移和旋转是不是相对于太阳来说了
推荐一个视频自学网站:
[url=http://www.51zxw.net/study.asp?vip=16791798 【51自学网】-专业培训老师录制的视频教程,让学习变得很轻松[/url]