OpenGL坐标变换 平移,缩放与旋转

OpenGL坐标变换 平移,缩放与旋转

OpenGL有内建的坐标系,事实上OpenGl有两套坐标系,一个坐标系被称为眼睛坐标(eye coordinate system) 简称ECS 。  OpenGL还有一套坐标,被称为(object coordinate system) 简称OCS ,而这个才是更为重要的,其实我们用来绘图的正是OCS

两个坐标系中ECS 可以看成是一个现实存在的 基本不变的全局坐标系,而OCS则可以看成是用户自定义的坐标系,我们可以将这个坐标系任意的平移与缩放,在初始情况下他和ECS是重合的,也可以通过glLoadIdentity()强制复位,这样可以给我们的绘图带来极大的方便。这里有一点是要值得注意的是在使用一个函数时需要弄清它是使用什么坐标系的,刚刚我们用到的glVertex系列函数都是用的OCS

    下面是一个平移和缩放例子:

#include<stdio.h>
#include <GL/glut.h>
#include <GL/glext.h>
void makecross(float *color) //在当前OCS的中心画一个十字
{
              glBegin(GL_LINES);
                        glColor3fv(color); //设置当前颜色
                        glVertex3f(-1,0,0);
                        glVertex3f(1,0,0);
                        glVertex3f(0,-1,0);
                       glVertex3f(0,1,0);
              glEnd();
}
void display()
{
         float red[3]={1,0,0};
         float blue[3]={0,1,0};
         float green[3]={0,0,1};
         float yellow[3]={1,1,0};

         glClearColor(1,1,1,1);
         glClear(GL_COLOR_BUFFER_BIT);

         glLoadIdentity();
         makecross(red);
         glTranslatef(-0.5,-0.5,0);//坐标平移
//glLoadIdentity();//坐标复位
         makecross(blue);
         //glTranslatef(1,0.25,0);
         //makecross(green);
         //glTranslatef(-0.75,0.75,0);
         //glScalef(0.5,0.5,1); //在x,y 上缩小一半
         //makecross(yellow);
        glFlush();          //更新窗口
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(0, 0);
glutInitWindowSize(600, 600);
glutCreateWindow("OpenGL 3D View");
glutDisplayFunc(display);
glutMainLoop();
return 0;
}

 这两个函数中makecross的作用是在坐标中心画一个十字,前面我们知道glVertex使用的是OCS 所以makecross 的作用便是在当前OCS的中心画一个十字,以观察OCS的位置,

  glColor3fv(color)的功能于之前我们看到的glColor3f(r,g,b)是一样的,只不过一个是使用一个数组作为参数

1. void glLoadIdentity(void)

  在display中 glLoadIdentity 的作用是使OCS 与ECS 重合,在这里我们用来初始化OCS 

2. void glTranslate{fd}(TYPEx, TYPE y, TYPEz);

glTranslatef 是将OCS平移至x,y,z 出,也就是在(x,y,z)处建立新的OCS,这里要注意这里的参数X,Y,Z也是OCS坐标

3. void glScale{fd}(TYPEx, TYPE y, TYPEz);

  glScalef则是当前OCS的缩放,x,y,z 分别指在三个方向上的放大倍数

   说完了缩放和平移,我们来看看旋转,opengl 里的旋转是通过glrotate来实现的,他的本质是将当前矩阵在乘于旋转矩阵,就是将当前的OCS 旋转一个指定的角度

4. void glRotate{fd}(TYPE angle, TYPE x, TYPE y, TYPE z);

glrotate 是将当前OCS绕向量(x,y,z)逆时针旋转angle度 例如我们要讲上例中的图形旋转绕Z轴旋转45度则可以通过glrotatef(45,0,0,1)来实现。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenGL是一种开放源代码的图形库,用于开发二维和三维图形应用程序。其支持光照、平移旋转缩放等功能。 光照是在OpenGL中实现逼真和真实感的一个重要方面。通过对物体表面的光照进行计算和模拟,可以模拟出光线在真实世界中的表现。OpenGL提供了多种光照模型和光源类型,如平行光照、点光源和聚光灯等。通过设置光源的属性,如位置、颜色和强度,可以控制光照的效果。同时,还可以设置材质的属性,如漫反射、镜面反射和环境光反射等,以使物体表面具有不同的反射特性。 平移旋转缩放是控制物体在OpenGL中位置、方向和大小的重要操作。通过平移(Translation),可以改变物体的位置。通过旋转(Rotation),可以改变物体的方向。通过缩放(Scaling),可以改变物体的大小。这些操作可以通过设置模型视图矩阵来实现,将物体的顶点坐标进行相应的变换。平移旋转缩放都可以相对于世界坐标系进行,也可以相对于物体自身坐标系进行。 在OpenGL中,可以通过矩阵操作来实现平移旋转缩放平移可以通过将物体的位置矩阵与一个平移矩阵相乘来实现。旋转可以通过将物体的方向矩阵与一个旋转矩阵相乘来实现。缩放可以通过将物体的大小矩阵与一个缩放矩阵相乘来实现。通过改变这些矩阵的数值,可以控制物体在空间中的位置、方向和大小。 总结来说,OpenGL提供了一系列的函数和接口,可以实现光照、平移旋转缩放等操作,使得开发者可以自由控制物体的表现和行为。这些功能在图形应用程序中非常重要,可以帮助开发者创建出逼真和动态的图形效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值