openGL系列(3) 您所在的位置:网站首页 opengl绘制二维坐标轴 openGL系列(3)

openGL系列(3)

2024-02-26 21:20| 来源: 网络整理| 查看: 265

预备知识:坐标系是按右手定则的笛卡尔坐标系。对话框正正中间是原点,右为+X,上为+Y,屏幕外为+Z。

 

用openGL画图时,例如画三角面、矩形、点、直线,都是在物体坐标系内画的。

物体坐标系可以平移/旋转/缩放。

平移,就是把物体坐标系在世界坐标系中平移。下面看个示例:

openGL初始化完之后,世界坐标系和物体坐标系是重合的,我先在物体坐标系的原点(0,0,0)处画了个正方体①,然后我又想在这个球的右侧5单位处再画个正方体②,那么该怎么做呢?有两种方法: (1)直接在物体坐标系的(0+5,0,0)处画正方体; (2)把物体坐标系平移(0+5,0,0),使之位于世界坐标系的(5,0,0),然后在物体坐标系的(0,0,0)处画正方体。

此时在世界坐标系中已经有2个立方体了,我想在立方体体①的正上方6单位处再画个正方体③,该怎么办? 很简单,把物体坐标系平移(-5,6,0)使之位于世界坐标系的(0,6,0)处,然后在物体坐标系的(0,0,0)处画立方体③。

主要程序如下:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深度缓存 glLoadIdentity();//重置物体坐标系,使之与世界坐标系重合 gluLookAt(-3, 8, 10,//眼睛的位置 0, 0, 0, //聚焦点 0, 1, 0);//头顶的方向 glTranslatef(0, 0, 0);//平移物体坐标系 paintGL_pureCube();//绘制立方体 glTranslatef(5, 0, 0); paintGL_pureCube();//绘制立方体 glTranslatef(-5, 6, 0); paintGL_pureCube();//绘制立方体

综上可见,通过移动坐标系来画图是很简便的,比如上面画的3个正方体,可以共用同一个函数,因为三个立方体都是在物体坐标系的(0,0,0)处画的。如果不移动物体坐标系,那么想画这3个立方体,你就得分别计算出他们的面坐才行,这计算就复杂了。有人可能觉得,这一点都不复杂,我稍微一算就能算出来,那么请你再看看下面这个需求,你就能体会到操作物体坐标系的优势了。

例题:要求在世界坐标系的(0,0,0)处画一个2x2x2的正方体①,然后在它的右侧5单位处画一个绕屏幕法线(即Z轴)旋转了45度的立方体②,然后在①的上方画一个水平线旋转45度的正方体③。

程序如下:

glClearColor(0.0f, 0.00f, 0.00f, 1.0f);//重新填充背景色 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深度缓存 glLoadIdentity();//重置物体坐标系,使之与世界坐标系重合 gluLookAt(-3, 8, 10,//眼睛的位置 0, 0, 0, //聚焦点 0, 1, 0);//头顶的方向 glTranslatef(0, 0, 0); paintGL_pureCube();//绘制立方体 glTranslatef(5, 0, 0);//平移物体坐标系 glRotatef(45, 0.0f, 0.0f, 1.0f);//把物体坐标系绕自己的Z轴转45度 paintGL_pureCube();//绘制立方体 glRotatef(-45, 0.0f, 0.0f, 1.0f);//旋转回来摆正 glTranslatef(-5, 6, 0); glRotatef(45, 1.0f, 0.0f, 0.0f);//把物体坐标系绕自己的X轴转45度 paintGL_pureCube();//绘制立方体

这种歪曲的立方体想要人工算出面的角点坐标就很困难了,这就体现出操作物体坐标系的优势了。

 

最后再来看一个缩放的例子:要求在世界坐标系的(0,0,0)处画一个2x2x2的正方体①,然后在它的右侧5单位处画一个绕屏幕法线(即Z轴)旋转了45度的4*4*4立方体②,然后在①的上方画一个水平线旋转45度的1*1*1正方体③。

glTranslatef(0, 0, 0); paintGL_pureCube();//绘制2x2x2立方体 glTranslatef(5, 0, 0);//平移物体坐标系 glRotatef(45, 0.0f, 0.0f, 1.0f);//把物体坐标系绕自己的Z轴转45度 glScalef(2.0f, 2.0f, 2.0f);//物体坐标系缩小(物体放大2倍) paintGL_pureCube();//绘制立方体 glScalef(0.5f, 0.5f, 0.5f);//物体坐标系放大回来 glRotatef(-45, 0.0f, 0.0f, 1.0f);//旋转回来摆正 glTranslatef(-5, 6, 0); glRotatef(45, 1.0f, 0.0f, 0.0f);//把物体坐标系绕自己的X轴转45度 glScalef(0.5f, 0.5f, 0.5f);//物体坐标系放大(物体缩小为1/2) paintGL_pureCube();//绘制立方体

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有