实验九3D编程基础

这篇具有很好参考价值的文章主要介绍了实验九3D编程基础。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用Opengl库实现

实验一

一、实验目的

1.熟悉3D基本编程。

2.熟悉视点观察函数的设置和使用。3.熟悉投影变换函数的设置和使用。4.熟悉基本3D图元的绘制。

二、实验内容

1.读懂以下3D物体程序,并结合本书内容理解一些新的绘制函数和投影变换函数的含义:3D Cube.cpp(见后面参考程序)为正交投影下的旋转3D立方体,按下鼠标可实现不同方向的旋转,效果图参见实验图9-1,分析3D编程代码与程序结构。

对于以下操作需要记录不同效果图和修改的相应参数:

1)让静止的立方体绕Z轴不停旋转。

修改参数:

  1. // 设置旋转轴:两个三维的点确定的旋转轴
  2. GLfloat axis[][3] = {
  3.    0.5f,0.5f, 0.0f,
  4.    0.5f, 0.5f, 1.0f
  5. };
  6.    // 设置绕给定的轴旋转
  7.    glTranslatef(axis[0][0], axis[0][1], axis[0][2]);
  8.    glRotatef(angle, axis[1][0] - axis[0][0], axis[1][1] - axis[0][1], axis[1][2] - axis[0][2]);
  9.    glTranslatef(-axis[0][0], -axis[0][1], -axis[0][2]);

实验九3D编程基础

2)修改不同视点,目标点不变,观看显示效果。

gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, -1, -1, 1); 相当于我们的脑袋位置在(0.0,0.0,5.0)处,眼睛望向(0.0,0.0,0.0),即原点。后面的三个参数(-1, -1, 1),不变

修改:gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, -1, -1, 1);

实验九3D编程基础

3)修改目标点,视点不动,观看显示效果。

修改:gluLookAt(2, 2, 2, 0.0, 0.0, 0.0, -1, -1, 1);

为:gluLookAt(2, 2, 2, 0.0, 1, 0.0, -1, -1, 1); 修改目标点,视点不动

结果如下:

实验九3D编程基础

4)视点与目标点同时修改,观看显示效果。

修改:gluLookAt(2, 2, 2, 0.0, 0.0, 0.0, -1, -1, 1);

为:gluLookAt(1, 2, 0, 0.0, 1, 0.0, -1, -1, 1);//修改目标点和视点

结果如下:

 实验九3D编程基础

5)视点与目标点不变,修改观察体大小,观看显示效果。

//修改正方体大小即修改顶点位置,代码如下:

  1. static const GLfloat vertex[][3] = {  
  2.     0.0f, 0.0f, 0.0f,  
  3.     1.5f, 0.0f, 0.0f,  
  4.     0.0f, 1.5f, 0.0f,  
  5.     1.5f, 1.5f, 0.0f,  
  6.     0.0f, 0.0f, 1.5f,  
  7.     1.50f, 0.0f, 1.5f,  
  8.     0.0f, 1.5f, 1.5f,  

实验九3D编程基础

6)将正交投影观察体改为透视投影观察体,并设置其大小,观察显示效果。

核心代码更改:

void reshape(int w, int h)  
{  
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);  
    glMatrixMode(GL_PROJECTION);//投影矩阵  
    glLoadIdentity();  
    gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0);  
    glMatrixMode(GL_MODELVIEW);//切换回模型视图矩阵  
    //glLoadIdentity();  
    //gluLookAt(2, 2, 2, 0.0, 0.0, 0.0, -1, -1, 1);  
}  
  
//正交投影  
void reshape_2(int w, int h)  
{  
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);  
    glMatrixMode(GL_PROJECTION);//投影矩阵  
    glLoadIdentity();  
  
    //使用正交投影  
    if (w <= h)  
        glOrtho(-2.0, 2.0, -2.0 * (GLfloat)h / (GLfloat)w,  
            2.0 * (GLfloat)h / (GLfloat)w, -10.0, 10.0);  
    else  
        glOrtho(-2.0 * (GLfloat)w / (GLfloat)h,  
            2.0 * (GLfloat)w / (GLfloat)h, -2.0, 2.0, -10.0, 10.0);  
  
    glMatrixMode(GL_MODELVIEW);  
}  

两者变化如下:

实验九3D编程基础实验九3D编程基础

7)将立方体替换为茶壶,观看显示效果。

核心代码:

  1. void displaytadpot(void)  
    {  
        // 设置背景为白色  
        glClearColor(1.0, 1.0, 1.0, 1.0);  
        glClear(GL_COLOR_BUFFER_BIT);  
        glColor3f(1.0, 0.0, 0.0); //画笔红色  
        glLoadIdentity();  //加载单位矩阵    
        gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);  
        glRotatef(angle, 0.0f, 1.0f, 0.0f);  
        glRotatef(0.0, 1.0, 0.0, 0.0);  
        glRotatef(0.0, 0.0, 1.0, 0.0);  
        glRotatef(0.0, 0.0, 0.0, 1.0);  
        glutWireTeapot(1.5);  
        //rote += roate;  
        //glRotatef(angle, 0.0, 1.0, 0.0);  
        //angle += 1.0f;  
        glEnd();  
        glutSwapBuffers();  
    }  

实验结果:

实验九3D编程基础

8)将立方体替换为圆环,观看显示效果。

核心代码:

  1. //画圆环:  
    void display()  
    {  
        // 设置背景为白色  
        glClearColor(1.0, 1.0, 1.0, 1.0);  
        glClear(GL_COLOR_BUFFER_BIT);  
        glColor3f(1.0, 0.0, 0.0); //画笔红色  
        glLoadIdentity();  //加载单位矩阵    
        //视角  
        gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);  
        glRotatef(angle, 0.0f, 1.0f, 0.0f);  
        glRotatef(0.0, 1.0, 0.0, 0.0);  
        glRotatef(0.0, 0.0, 1.0, 0.0);  
        glRotatef(0.0, 0.0, 0.0, 1.0);  
        glutWireTorus(0.2, 1.5, 20, 40);  
        glEnd();  
        glutSwapBuffers();  
    }  

实验结果:

实验九3D编程基础

⒉.构思绘制茶壶和圆环造型程序Teapot_Torus.cpp。在紧挨着茶壶下方添加一个平行的圆环,茶壶和圆环不停绕中心轴旋转,观看显示效果,效果图参见实验图9-2。

实验结果:

实验九3D编程基础

三、最终代码文章来源地址https://www.toymoban.com/news/detail-400544.html

  1. #include<GL/glut.h>  
    #include<math.h>  
      
    #include<iostream>  
    #define COLOR 8.0  
    #define PIX ((GLfloat)(1.0 / COLOR))  
    #define STEP 1.0f  
    #define PI acos(-1)  
    //此处使用pai的值  
    using namespace std;  
      
    // 旋转初始的角度  
    GLfloat angle = 0.0f;  
    // 设置旋转轴:两个三维的点确定的旋转轴  
    GLfloat axis[][3] = {  
        0.5f,0.5f, 0.0f,  
        0.5f, 0.5f, 1.0f  
    };  
      
      
      
      
    void display_2()  
    {  
        // 设置逆时针排列的点围成的平面为正面  
        glFrontFace(GL_CCW);  
        // 设置不绘制背面,节省算力同时不会出现背面覆盖正面的情况  
        glCullFace(GL_BACK);  
        glEnable(GL_CULL_FACE);  
        // 设置背景为白色  
        glClearColor(1.0, 1.0, 1.0, 1.0);  
        glClear(GL_COLOR_BUFFER_BIT);  
        // 加载单位阵  
        glLoadIdentity();  
        // 设置相机的位置和视角  
        // 有关gluLookAt:https://blog.csdn.net/Augusdi/article/details/20470813  
        //gluLookAt(2, 2, 2, 0.0, 1, 0.0, -1, -1, 1);//修改目标点  
        //gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, -1, -1, 1);//修改视点  
         //gluLookAt(1, 2, 0, 0.0, 1, 0.0, -1, -1, 1);//修改目标点和视点  
        gluLookAt(2, 2, 2, 0.0, 0.0, 0.0, -1, -1, 1);  
        // 设置绕给定的轴旋转  
        glTranslatef(axis[0][0], axis[0][1], axis[0][2]);  
        glRotatef(angle, axis[1][0] - axis[0][0], axis[1][1] - axis[0][1], axis[1][2] - axis[0][2]);  
        glTranslatef(-axis[0][0], -axis[0][1], -axis[0][2]);  
        // 设置立方体的八个顶点坐标  
      
        static const GLfloat vertex[][3] = {  
            0.0f, 0.0f, 0.0f,  
            1.0f, 0.0f, 0.0f,  
            0.0f, 1.0f, 0.0f,  
            1.0f, 1.0f, 0.0f,  
            0.0f, 0.0f, 1.0f,  
            1.0f, 0.0f, 1.0f,  
            0.0f, 1.0f, 1.0f,  
            1.0f, 1.0f, 1.0f  
        };  
      
        /* 
    //修改正方体大小 
    static const GLfloat vertex[][3] = { 
        0.0f, 0.0f, 0.0f, 
        1.5f, 0.0f, 0.0f, 
        0.0f, 1.5f, 0.0f, 
        1.5f, 1.5f, 0.0f, 
        0.0f, 0.0f, 1.5f, 
        1.50f, 0.0f, 1.5f, 
        0.0f, 1.5f, 1.5f, 
        1.5f, 1.5f, 1.5f 
    }; 
        */  
        // 设置绘制六个面时顶点的顺序  
        static const GLint index[][4] = {  
            0, 2, 3, 1,  
            0, 4, 6, 2,  
            0, 1, 5, 4,  
            4, 5, 7, 6,  
            1, 3, 7, 5,  
            2, 6, 7, 3  
        };  
        // 绘制六个面  
        glBegin(GL_QUADS);  
        for (unsigned int i = 0; i < 6; i++)  
            for (unsigned int j = 0; j < 4; j++) {  
                // 每个顶点的RGB颜色值和其顶点位置坐标一致  
                glColor3fv(vertex[index[i][j]]);  
                glVertex3fv(vertex[index[i][j]]);  
            }  
      
      
        glEnd();  
        // 双缓冲下的刷新帧缓存  
        glutSwapBuffers();  
    }  
    //画茶壶  
    void displaytadpot(void)  
    {  
        // 设置背景为白色  
        glClearColor(1.0, 1.0, 1.0, 1.0);  
        glClear(GL_COLOR_BUFFER_BIT);  
        glColor3f(1.0, 0.0, 0.0); //画笔红色  
        glLoadIdentity();  //加载单位矩阵    
        gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);  
        glRotatef(angle, 0.0f, 1.0f, 0.0f);  
        glRotatef(0.0, 1.0, 0.0, 0.0);  
        glRotatef(0.0, 0.0, 1.0, 0.0);  
        glRotatef(0.0, 0.0, 0.0, 1.0);  
        glutWireTeapot(1.5);  
        //rote += roate;  
        //glRotatef(angle, 0.0, 1.0, 0.0);  
        //angle += 1.0f;  
        glEnd();  
        glutSwapBuffers();  
    }  
      
    //画圆环:  
      
    void displayTorus()  
    {  
        // 设置背景为白色  
        glClearColor(1.0, 1.0, 1.0, 1.0);  
        glClear(GL_COLOR_BUFFER_BIT);  
        glColor3f(1.0, 0.0, 0.0); //画笔红色  
        glLoadIdentity();  //加载单位矩阵    
        //视角  
        gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);  
        glRotatef(angle, 0.0f, 1.0f, 0.0f);  
        glRotatef(0.0, 1.0, 0.0, 0.0);  
        glRotatef(0.0, 0.0, 1.0, 0.0);  
        glRotatef(0.0, 0.0, 0.0, 1.0);  
        glutWireTorus(0.2, 1.5, 20, 40);  
        glEnd();  
        glutSwapBuffers();  
    }  
      
    //画圆环和茶狐混合绕一个轴旋转  
    void displayTeapot_Torus()  
    {  
        // 设置背景为白色  
        glClearColor(1.0, 1.0, 1.0, 1.0);  
        glClear(GL_COLOR_BUFFER_BIT);  
        glColor3f(1.0, 0.0, 0.0); //画笔红色  
        glLoadIdentity();  //加载单位矩阵    
        //视角  
        gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);  
        glRotatef(angle, 0.0f, 1.0f, 0.0f);  
        glRotatef(0.0, 1.0, 0.0, 0.0);  
        glRotatef(0.0, 0.0, 1.0, 0.0);  
        glRotatef(0.0, 0.0, 0.0, 1.0);  
        glutWireTorus(0.2, 1.5, 20, 40);  
        glRotatef(90, 1, 0, 0);//旋转  
        glTranslatef(0, 0.9, 0);//平移  
        glutWireTeapot(1);  
        glEnd();  
        glutSwapBuffers();  
    }  
    // 绘制圆环  
    // 大半径Radius,小半径TubeRadius,边数Sides, 环数Rings  
      
      
      
    // 动画所需的定时器回调函数  
    // 有关定时器回调函数:https://blog.csdn.net/shimazhuge/article/details/17894883  
    void timer_function(GLint value)  
    {  
        // 旋转角度增加  
        angle += STEP;  
        // 若角度大于360转完一圈则清零  
        if (angle > 360.0) angle -= 360.0;  
        glutPostRedisplay();  
        glutTimerFunc(50, timer_function, value);  
    }  
      
    // 窗口大小自适应函数,使得窗口大小改变时仍保持图形的比例不变  
    // 有关窗口自适应函数:http://blog.sina.com.cn/s/blog_5497dc110102w8qh.html  
    //透视投影  
    void reshape(int w, int h)  
    {  
        glViewport(0, 0, (GLsizei)w, (GLsizei)h);  
        glMatrixMode(GL_PROJECTION);//投影矩阵  
        glLoadIdentity();  
        gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0);  
        glMatrixMode(GL_MODELVIEW);//切换回模型视图矩阵  
        //glLoadIdentity();  
        //gluLookAt(2, 2, 2, 0.0, 0.0, 0.0, -1, -1, 1);  
    }  
      
    //正交投影  
    void reshape_2(int w, int h)  
    {  
        glViewport(0, 0, (GLsizei)w, (GLsizei)h);  
        glMatrixMode(GL_PROJECTION);//投影矩阵  
        glLoadIdentity();  
      
        //使用正交投影  
        if (w <= h)  
            glOrtho(-2.0, 2.0, -2.0 * (GLfloat)h / (GLfloat)w,  
                2.0 * (GLfloat)h / (GLfloat)w, -10.0, 10.0);  
        else  
            glOrtho(-2.0 * (GLfloat)w / (GLfloat)h,  
                2.0 * (GLfloat)w / (GLfloat)h, -2.0, 2.0, -10.0, 10.0);  
      
        glMatrixMode(GL_MODELVIEW);  
    }  
      
      
    int main(int argc, char** argv)  
    {  
        glutInit(&argc, argv);  
        // 设置双缓冲和RGB颜色模式  
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);  
        // 设置窗口大小、位置和名称  
        glutInitWindowSize(500, 500);  
        glutInitWindowPosition(100, 100);  
        glutCreateWindow("实验九");  
        // 设置绘制函数、窗口大小自适应函数和定时器回调函数  
        glutDisplayFunc(displayTeapot_Torus);  
        glutReshapeFunc(reshape);  
        //glEnable(GL_DEPTH_TEST); //使用了深度缓存这行不能掉  
        glutTimerFunc(500, timer_function, 1);  
        // 进入主循环  
        glutMainLoop();  
        return 0;  
    } 

到了这里,关于实验九3D编程基础的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenGL实现3D立体显示

    立体显示是指通过使用透视和深度感知来模拟真实世界中的三维效果。在计算机图形学中,OpenGL是一种广泛使用的图形库,它提供了一系列功能强大的工具和函数来实现各种图形效果,包括3D立体显示。在本文中,我们将介绍如何使用OpenGL实现基本的3D立体显示效果,并提供相

    2024年02月04日
    浏览(34)
  • Android APP OpenGL ES应用(01)GLSurfaceView 2D/3D绘图基础

    OpenGL本身是开放图形库的一种标准,定义了一个跨语言、跨平台的编程规范,主要用于3D图形编程。OpenGLES是OpenGL的裁剪版本,主要是针对嵌入式设备/移动设备 (像手机、游戏机这种等等。。。) 进行裁剪后的库。对于Android设备来说主要是用OpenGL ES。从初学者角度来讲 Ope

    2023年04月20日
    浏览(49)
  • 三维引擎基础概述(Direct3D、OpenGL、UE、U3D、threejs等)

    一般而言,三维引擎是在三维底层图形技术的基础上,封装硬件操作与三维图形算法,形成普遍意义上的三维交互引擎,提供给开发者一个简单易用、功能丰富的三维图形环境,在此基础上进行虚拟现实、三维交互、可视化管理平台二次开发等,极大提高开发效率。 【底层图

    2024年02月11日
    浏览(47)
  • web3D三维引擎(Direct3D、OpenGL、UE、U3D、threejs)基础扫盲

    三维引擎是指用于创建和渲染三维图形的软件框架。它们通常提供了图形处理、物理模拟、光照、碰撞检测等功能,帮助开发者构建逼真的三维场景和交互体验。在这里,我将为您详细介绍一些常见的三维引擎,包括Direct3D、OpenGL、Unreal Engine、Unity3D和Three.js。 Direct3D是由微软

    2024年02月11日
    浏览(60)
  • Android OpenGL ES 学习(九) – 坐标系统和实现3D效果

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学习(三) – 绘制平面图形 Android OpenGL ES 学习(四) – 正交投影 Android OpenGL ES 学习(五) – 渐变色 Android OpenGL ES 学习(六) – 使用 VBO、VAO 和 EBO/IBO 优化程序 Android OpenG

    2024年01月25日
    浏览(46)
  • 使用Python和OpenGL渲染PS2存档3D图标

    经过前面一系列文章的铺垫,PS2存档3D图标的文件已经全部解析完毕。本篇开始将介绍使用如下工具将3D图标渲染出来,并尽可能接近PS2主机原生的效果。 Python3 PyGame Numpy ModernGL PyGLM 第一步先初始化 PyGame ,设置窗口大小为 640x480 , FPS 为 60 。开启 OpenGL 渲染模式, OpenGL 的版

    2024年02月03日
    浏览(47)
  • 学习编程的目的

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 一名广东专升本的学生,目前正在努力学习计算机相关知识,以前有学过一段时间的C语言,总是听别人说C很难很难让我也对这门编程语言充满了畏惧,直到升本的时候需要考C然后认真的去学习之后,发

    2024年02月08日
    浏览(29)
  • 大数据基础编程、实验和教程案例(实验六)

    本实验对应第 8 章的内容。 14.6.1 实验目的 (1)理解 Hive 作为数据仓库在 Hadoop 体系结构中的角色。 (2)熟练使用常用的 HiveQL。 14.6.2 实验平台 操作系统 Linux Hadoop 版本 3.1.3 Hive 版本 3.1.2 JDK 版本 1.8 14.6.3 数据集 由《Hive 编程指南》(O’Reilly 系列,人民邮电出版社)提供,下

    2024年02月05日
    浏览(33)
  • 大数据基础编程、实验和教程案例(实验二)

    本实验对应第 4 章的内容。 14.2.1 实验目的 (1)理解 HDFS 在 Hadoop 体系结构中的角色; (2)熟练使用 HDFS 操作常用的 Shell 命令; (3)熟悉 HDFS 操作常用的 Java API。 14.2.2 实验平台 操作系统 Linux Hadoop版本 3.1.3 JDK版本 1.8 Java IDE Eclipse 14.2.3 实验步骤 (一)编程实现以下功能,

    2024年02月05日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包