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
    点赞
  • 145
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: OpenGL是一种跨平台的图形编程接口,用于实现计算机图形的平移旋转和缩放操作。 平移是指将对象从一个位置移动到另一个位置,可以通过修改OpenGL的模型视图矩阵来实现。以下是一个实现平移的代码示例: glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(x, y, z); // 渲染对象 这段代码将当前矩阵设置为模型视图矩阵,并将其重置为单位矩阵。然后,使用glTranslatef函数,将对象在x、y和z方向上平移旋转是指将对象绕某个轴心旋转一定角度,可以使用OpenGL的模型视图矩阵和旋转函数来实现。以下是一个实现绕Y轴旋转的代码示例: glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotatef(angle, 0, 1, 0); // 渲染对象 这段代码将当前矩阵设置为模型视图矩阵,并将其重置为单位矩阵。然后,使用glRotatef函数,将对象绕Y轴旋转angle度。 缩放是指按照一定比例调整对象的大小,可以通过修改OpenGL的模型视图矩阵来实现。以下是一个实现缩放的代码示例: glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glScalef(scaleX, scaleY, scaleZ); // 渲染对象 这段代码将当前矩阵设置为模型视图矩阵,并将其重置为单位矩阵。然后,使用glScalef函数,按照scaleX、scaleY和scaleZ的比例进行缩放。 总结起来,使用OpenGL进行平移旋转和缩放操作的代码示例如下: glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(x, y, z); // 平移 glRotatef(angle, 0, 1, 0); // 旋转 glScalef(scaleX, scaleY, scaleZ); // 缩放 // 渲染对象 以上是实现OpenGL平移旋转和缩放的基本代码示例,根据实际需求可以进行进一步的扩展和修改。 ### 回答2: OpenGL是一种图形库,用于图形的绘制和处理。在OpenGL平移旋转和缩放是常用的操作,可以通过以下代码实现: 平移: ``` glTranslatef(x, y, z); ``` 其,x、y和z分别表示在x轴、y轴和z轴上的平移距离。这段代码将当前坐标系统在三个轴上同时平移旋转: ``` glRotatef(angle, x, y, z); ``` 其,angle表示旋转角度,x、y和z分别表示旋转轴向量的坐标。这段代码将当前坐标系统绕指定的轴旋转。 缩放: ``` glScalef(x, y, z); ``` 其,x、y和z分别表示在x轴、y轴和z轴上的缩放比例。这段代码将当前坐标系统在三个轴上进行缩放操作。 以上代码都是针对当前坐标系统进行操作,可以通过不同的参数调整实现不同的效果。通常,需要在绘制对象之前进行这些操作,以确保正确的展示效果。 例如,如果要绘制一个平移旋转的立方体,可以按照下面的步骤进行: ``` glPushMatrix(); // 保存当前的坐标系统 glTranslatef(x, y, z); // 平移操作 glRotatef(angle, 0, 1, 0); // 绕y轴旋转 glutSolidCube(1.0); // 绘制立方体 glPopMatrix(); // 恢复之前保存的坐标系统 ``` 这段代码会根据给定的平移旋转参数把立方体绘制在对应的位置和角度上。 这是一个简单的例子,演示了OpenGL平移旋转和缩放的用法。实际上,还有更多的参数和功能可以提供更详细和复杂的变换效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值