机械版CG 实验3 变换参考实例

#include <GL/glut.h> #include <stdlib.h> static int shoulder = 0, elbow = 0;//shoulder:肩部角度,elbow: 肘部角度

void init(void)

{

       glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

       glShadeModel(GL_FLAT);

}

void display(void) {

       glClear(GL_COLOR_BUFFER_BIT);

       glPushMatrix();//把当前的变换矩阵压入OpenGL内部栈中,用以保存当前矩阵

       //画机器人的上臂

       glTranslatef(-1.0f, 0.0f, 0.0f);//用平移矩阵乘当前矩阵,格式为:glTranslatef(x,y,z)

       glRotatef((GLfloat) shoulder, 0.0f, 0.0f, 1.0f);//用旋转矩阵乘当前矩阵,格式为glRotatef (角度,x轴,y轴,z轴),这里是绕Z轴旋转

       glTranslatef(1.0f, 0.0f, 0.0f);//再用平移矩阵乘当前矩阵,注意顺序

       glPushMatrix();//变换矩阵压栈

       glScalef(2.0f, 0.4f, 1.0f);//用缩放矩阵乘以当前矩阵,格式为glScalef(x缩放比例,y缩放比例,z缩放比例)

       glutWireCube(1.0f);//glut库函数,画一个三维的Cube,参数为边长

       glPopMatrix();//弹栈,现在矩阵恢复到使用缩放前的样子

       //画机器人的前臂,请注意平移矩阵和旋转矩阵的变化

       glTranslatef(1.0f, 0.0f, 0.0f);

       glRotatef((GLfloat) elbow, 0.0f, 0.0f, 1.0f);

       glTranslatef(1.0f, 0.0f, 0.0f);

       glPushMatrix();

       glScalef(2.0f, 0.4f, 1.0f);

       glutWireCube(1.0f);

       glPopMatrix();

       glPopMatrix();

       glFlush();

}

void reshape (int width, int height)

{

       glViewport(0, 0, width, height);

       glMatrixMode(GL_PROJECTION);

       glLoadIdentity();

       gluPerspective(65.0f, (GLfloat)width/(GLfloat)height, 1.0f, 20.0f);//建立一个透视投影视图体,格式为:gluPerspective(视域的角度,宽高比,视点到近裁剪面的距离(总为正),视点到远裁剪面的距离(总为正))

       glMatrixMode(GL_MODELVIEW);

       glLoadIdentity();

       glTranslatef(0.0f, 0.0f, -5.0f);//用平移矩阵乘当前矩阵,注意,这会将所有绘制过程中绘制的物体平移

}

void keyboard(unsigned char key, int x, int y)

{

       switch (key)

       {

              case 'a'://处理四个按键,改变旋转角度,转动手臂

                     shoulder = (shoulder + 5) % 360;

                     glutPostRedisplay();//重画

                     break;

              case 'd':

                     shoulder = (shoulder - 5) % 360;

                     glutPostRedisplay();

                     break;

              case 'q':

                     elbow = (elbow + 5) % 360;

                     glutPostRedisplay();

                     break;

              case 'e':

                     elbow = (elbow - 5) % 360;

                     glutPostRedisplay();

                     break;

              case 'x':

                     exit(0);

                     break;

              default:

                     break;

   }

}

int main(int argc, char** argv)

{

       glutInit(&argc, argv);

       glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

       glutInitWindowSize(500, 500);

       glutInitWindowPosition(100, 100);

       glutCreateWindow("Transform");

       init();

       glutDisplayFunc(display);

       glutReshapeFunc(reshape);

       glutKeyboardFunc(keyboard);

       glutMainLoop();

       return 0;

}

这个例子涉及了三维的造型,出现了许多新函数。

display()中用到了glPushMatrix()和glPopMatrix(),事实上glPushMatrix()可以理解为建立一个局部坐标系,glPopMatrix()恢复全局坐标系,它们可以嵌套使用。这两个函数会很频繁的用到。glutWireCube()画的是一个线框的Cube,这样的函数还有 void glutWireSphere(GLdouble radius, GLint slices, GLint stacks);

void glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);

void glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);

void glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);

void glutWireCube(GLdouble size);

void glutSolidCube(GLdouble size);

void glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);

void glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);

……

上面的例子里用glTranslatef (0.0, 0.0, -5.0)模拟了视点的变换,其实这一句可以放到display()中,效果是一样的,由于display()是不断被调用的,所以你的视点被不断改变.还有一个方法可以改变视点,函数

    gluLookAt(eye_x, eye_y, eye_z, centerx, centery, centerz, upx, upy, upz)

参数:

eyex, eyey, eyez 

指定视点的位置

centerx, centery, centerz  

指定参考点(“目光”的焦点)

upx, upy, upz         

指定向上向量的方向 (声明:本例部分来自《OpenGL编程指南》一书的示例,由于该书的旧版(第一版,1994年)已经流传于网络,希望没有触及到版权问题。) )

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据挖掘DT机器学习

数据挖掘十大算法--K近邻算法

k-近邻算法是基于实例的学习方法中最基本的,先介绍基于实例学习的相关概念。 一、基于实例的学习。 1、已知一系列的训练样例,很多学习方法为目标函数建立起明确的一...

39450
来自专栏素质云笔记

相似性︱python+opencv实现pHash算法+hamming距离(simhash)(三)

pHash跟simhash很多相近的地方。一个是较多用于图像,一个较多用于文本。 之前写关于R语言实现的博客: R语言实现︱局部敏感哈希算法(LSH)解决文...

1.2K50
来自专栏PPV课数据科学社区

【学习】干货:与数据挖掘有关或有帮助的R包和函数的集合

与数据挖掘有关或者有帮助的R包和函数的集合。 1、聚类 常用的包: fpc,cluster,pvclust,mclust 基于划分的方法: kmeans, pa...

27550
来自专栏用户2442861的专栏

matlab使用

x=[7.0  10.5  13.0  17.5  34.0  40.5  44.5  48.0  56.0  61.0  68.5  76.5  80.5...

12520
来自专栏深度学习入门与实践

【深度学习系列】PaddlePaddle垃圾邮件处理实战(二)

  在上篇文章中我们讲了如何用支持向量机对垃圾邮件进行分类,auc为73.3%,本篇讲继续讲如何用PaddlePaddle实现邮件分类,将深度学习方法运用到文本...

12300
来自专栏大数据挖掘DT机器学习

深度学习、机器学习图像/人脸/字幕/自动驾驶数据集(Dataset)汇总

1. CIFAR-10 & CIFAR-100 CIFAR-10包含10个类别,50,000个训练图像,彩色图像大小:32x32,10,000个测试图像...

66250
来自专栏hadoop学习笔记

Hanlp中使用纯JAVA实现CRF分词

与基于隐马尔可夫模型的最短路径分词、N-最短路径分词相比,基于条件随机场(CRF)的分词对未登录词有更好的支持。本文(HanLP)使用纯Java实现CRF模型的...

13000
来自专栏一棹烟波

OpenCV亚像素角点cornerSubPixel()源代码分析

  上一篇博客中讲到了goodFeatureToTrack()这个API函数能够获取图像中的强角点。但是获取的角点坐标是整数,但是通常情况下,角点的真实位置并不...

53640
来自专栏iOSer成长记录

OpenGL ES(四) 变换

15320
来自专栏用户2442861的专栏

相似图片检测:感知哈希算法之dHash的Python实现

某些情况下,我们需要检测图片之间的相似性,进行我们需要的处理:删除同一张图片、标记盗版等。 如何判断是同一张图片呢?最简单的方法是使用加密哈希(例如MD5, ...

44010

扫码关注云+社区

领取腾讯云代金券