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

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;
}
“月亮”的平移和旋转是不是相对于太阳来说了
 
 

推荐一个视频自学网站:

[url=http://www.51zxw.net/study.asp?vip=16791798 【51自学网】-专业培训老师录制的视频教程,让学习变得很轻松[/url]

 
  • 21
    点赞
  • 146
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值