(二)OpenGL坐标平移、旋转与缩放

  1. 坐标平移glTranslate
  2. 坐标旋转glRotate
  3. 坐标缩放glScale

1.坐标平移:glTranslate

void glTranslated(GLdouble x,Gldouble y, Gldouble z)
void glTranslatef(GLfloat x,Glfloat y, Glfloat z)
  参数说明:x,y,z 指定平移向量的x,y,z坐标,即将当前坐标系分别向x,y,z方向移动x,y,z个单位长度。
  举例,将在原坐标系中画一个红色三角形,坐标平移后,用同样的参数再画一个三角形,画为绿色以便区分。
代码如下:

#include <windows.h>
#include <stdlib.h>
#include <GL/glut.h>

//初始化背景色为白色
void init(void){
    glClearColor(1,1,1,1);
}

//画一个三角形
void drawtriangle(void){
    glBegin(GL_LINE_LOOP);
        glVertex2f(-50,0);
        glVertex2f(50,0);
        glVertex2f(0,50);
    glEnd();
}

void display(void){
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0,0,0);//画笔为黑色
    
    //画初始坐标系的x,y轴
    glBegin(GL_LINES);
        glVertex2f(150,300);
        glVertex2f(150,0);
    glEnd();
    glBegin(GL_LINES);
        glVertex2f(0,150);
        glVertex2f(300,150);
    glEnd();
    
    //将坐标系中心平移到窗口中心(窗口初始大小为300*300)
    glTranslatef(150,150,0);
    
    //使用红色画一个三角形
    glColor3f(1,0,0);
    drawtriangle();
    
	//使用绿色画笔
    glColor3f(0,1,0);

    //1
    glTranslatef(100,50,0);
     glTranslatef(-50,0,0);
    //2 glRotatef(135,0,0,1);
    glTranslated(50,0,0);
    //3.1 glScalef(-1,-1,-1);
    //3.2 glScalef(0.5,0.5,0.5);
    
    //在新的坐标系中画一个三角形
    drawtriangle();

    glFlush();
}

//适应窗口变动
void reshape(GLsizei w,GLsizei h){
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0,(GLdouble)w,0,(GLdouble)h);//更改窗口坐标系,窗口的左上、左下、右下、右上的坐标分别为(0,h)(0,0)(w,0)(w,h)
}

int main(int argc,char* * argv){
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(300,300);//300,300即为初始状态下的w,h
    glutInitWindowPosition(200,200);
    glutCreateWindow("rotate the triangle");
    init();
    glutReshapeFunc(reshape);
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}

运行结果:
在这里插入图片描述
可以将代码1的参数进行修改,观察效果,但不要改最后一个参数,因为目前是在二维平面中进行操作,下述内容同理。

2.坐标旋转 glRotate

void glRotated(GLdouble angle, GLdouble x,Gldouble y, Gldouble z)
void glRotatef(GLfloat angle, GLfloat x,Glfloat y, Glfloat z)
  参数说明:angle 制定旋转角度单位为度,旋转方向为逆时针 x,y,z 指定向量的x,y,z坐标
  举例,在坐标系中画一个红色三角形, 将坐标绕向量(0,0,1)旋转135°,再按原参数画一个三角形,画为绿色以便区分。
代码如下:

将上述代码1注释掉,代码2.2解注释即可

运行结果:
在这里插入图片描述
结果可以这样理解,
  二维空间中:三角形绕着原点旋转135°得到新的三角形。
  三维空间中:我们先画了一个二维中的三角形,然后在三维空间中绕着直线(0,0,1)旋转135°,就像先画了竹蜻蜓的翅膀,然后绕着棍子转。
那如果说我现在不想绕着(0,0,1)转,而是想绕着与(0,0,1)平行的其它直线转呢?放到二维空间中说,我不想绕原点转,我想绕别的点转,比如说绕点(-1,0),应该怎么做?答案在本文最后,但是建议读者自己思考,提示:利用坐标平移。

3.坐标缩放 glScale

void glScaled(GLdouble x,Gldouble y, Gldouble z)
void glScaled(GLfloat x,Glfloat y, Glfloat z)
  参数说明:x,y,z 各个方向的缩放比例
  举例:同样,画个红色三角形,将坐标系进行缩放,用同样的参数画一个三角形,画为绿色以便区分

将上述代码2注释,3.2解注释

运行结果:
在这里插入图片描述
将代码3.2注释,代码3.1解注释,结果如下:
在这里插入图片描述

坐标旋转答案:
将代码2前后增加几行代码,如下。

    glTranslatef(-50,0,0);//增加的代码
    glRotatef(135,0,0,1);//代码2
    glTranslated(50,0,0);//增加的代码

这里以绕着点(-50,0),即三角形的一个点,旋转为例,运行结果如下:
在这里插入图片描述
个人理解,其实就是先将坐标平移,告诉电脑要绕着这条直线旋转,然后再将坐标返回去,进行作图。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值