OpenGL的学习之路-3

news2024/11/16 19:41:25

前面1、2介绍的都是glut编程

下面就进行opengl正是部分啦。

1.绘制点

#include <iostream>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>


void myMainWinDraw();

int main(int argc,char** argv) {
    glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
	glutInitWindowSize(400, 400);
	glutInitWindowPosition(0, 0);

	glutCreateWindow("Hello");

	glutDisplayFunc(myMainWinDraw);

	glutMainLoop();
	return 0;
}

void myMainWinDraw(){
    glClearColor(0.0,0.0,0.0,0.0);//设置清除色
    glClear(GL_COLOR_BUFFER_BIT); //清除颜色缓冲区

    float a[2];
    glGetFloatv(GL_POINT_SIZE_RANGE,a);
    std::cout<<a[0]<<"---"<<a[1]<<"\n";   //输出的是,点大小的范围(不过没有这么严格)

    glPointSize(10);   //设置点的大小

    glBegin(GL_POINTS);

    #if 0
    (0.5f,0.4f);
    (-0.5f,0.4f,0.0f);
    (0.0f,-0.4f,0.0f);
    #else
    glColor3f(1.0f,0.0f,0.0f);  //为点设置颜色
    glVertex3f(0.5f,0.4f,0.0f); //该语句可绘制

    glColor3f(0.0f,0.0f,1.0f);
    glVertex3f(-0.5f,0.4f,0.0f);

    glColor3f(0.0f,1.0f,0.0f);
    glVertex3f(0.0f,-0.4f,0.0f);
    #endif // 0
    
    glEnd();

    glFlush();
}

这里留下小思考题:

掷骰子是随机事件,现在平面上有三个点A、B、C,还有一个点P,位置可随机。令点A代表骰子的点数为1、4,点B代表骰子的点数为2、5,点C代表骰子的点数为3、6。现在开始扔,如果扔的点数为1或者4,那么取AP的中点作为新的P;如果扔到2或者5,则取BP的中点作为新的P;如果扔到的点数为3,6,则同理取CP的中点作为新的P。同时,要把每次取得的新的P绘制出来,并保持与相应的A或B或C同色。前面一定次数(如前20次),我们先不画点(还未进入稳态),后面再开始绘制。看看最终得到的图形是什么样子。

结果很奇妙!

明明是随机的,却呈现了规律性。赞叹数学、赞叹科学?是的,但我也想赞叹让我知道这个的我的老师。

2.绘制线

#include <iostream>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

void myMainWinDraw();

int main(int argc,char** argv) {
    glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
	glutInitWindowSize(400, 400);
	glutInitWindowPosition(0, 0);

	glutCreateWindow("Hello");

	glutDisplayFunc(myMainWinDraw);

	glutMainLoop();
	return 0;
}

void myMainWinDraw(){
    glClearColor(0.0,0.0,0.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT);

    glLineWidth(2);

    glBegin(GL_LINES);

#if 0
    glVertex3f(0.5f,0.0f,0.0f);
    glVertex3f(0.5f,0.4f,0.0f);
    glVertex3f(0.0f,0.4f,0.0f);
    glVertex3f(0.0f,-0.4f,0.0f);
#else
    glColor3f(1.0f,0.0f,0.0f);
    glVertex3f(0.5f,0.0f,0.0f);

    glColor3f(0.0f,1.0f,0.0f);
    glVertex3f(0.5f,0.4f,0.0f);

    glColor3f(1.0f,0.0f,0.0f);
    glVertex3f(0.0f,0.4f,0.0f);

    glColor3f(0.0f,0.0f,1.0f);
    glVertex3f(0.0f,-0.4f,0.0f);

#endif

    glEnd();

    glFlush();

}

两点连成一条直线。点和点之间是配对的,如果给的点的个数是奇数,那么最后一个点没有找到和他配对的点,会不起作用。

关于颜色:

默认状态,是两边点颜色的线性插值,结果如下:

如果不想这样,就需要 glShadeModel(GL_FLAT) 变成:

glShadeModel(GL_SMOOTH) 和 glShadeModel(GL_FLAT) !!

联系:绘制环

glBegin(GL_LINES_LOOP) :给出的两个相邻的点首尾相连,最后一个点和第一个点相连,构成环。两种颜色模式下:

3.绘制三角形

#include <iostream>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

void myMainWinDraw();

int main(int argc,char** argv) {
    glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
	glutInitWindowSize(400, 400);
	glutInitWindowPosition(0, 0);

	glutCreateWindow("Hello");

	glutDisplayFunc(myMainWinDraw);

	glutMainLoop();
	return 0;
}

void myMainWinDraw(){
    glClearColor(0.0,0.0,0.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT);

    //glShadeModel(GL_FLAT); //GL_SMOOTH

    glBegin(GL_TRIANGLES);

#if 0
    glVertex3f(0.5f,0.0f,0.0f);
    glVertex3f(0.5f,0.4f,0.0f);
    glVertex3f(0.0f,0.4f,0.0f);

    glVertex3f(0.0f,-0.4f,0.0f);
    glVertex3f(0.3f,-0.4f,0.0f);
    glVertex3f(0.0f,-0.2f,0.0f);
#else
    glColor3f(1.0f,0.0f,0.0f);
    glVertex3f(0.5f,0.0f,0.0f);

    glColor3f(0.0f,1.0f,0.0f);
    glVertex3f(0.5f,0.4f,0.0f);

    glColor3f(1.0f,0.0f,0.0f);
    glVertex3f(0.0f,0.4f,0.0f);

    glColor3f(0.0f,0.0f,1.0f);
    glVertex3f(0.0f,-0.4f,0.0f);

    glColor3f(1.0f,0.0f,1.0f);
    glVertex3f(0.3f,-0.4f,0.0f);

    glColor3f(0.0f,1.0f,1.0f);
    glVertex3f(0.0f,-0.2f,0.0f);

#endif

    glEnd();

    glFlush();

}

三个点一组,绘制一个三角形。

推广:

(后面几个平时用不太到) 

4.绘制的线型

#include <iostream>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

void myMainWinDraw();

int main(int argc,char** argv)
{
    glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
	glutInitWindowSize(400, 400);
	glutInitWindowPosition(0, 0);

	glutCreateWindow("Hello");

	glutDisplayFunc(myMainWinDraw);

	glutMainLoop();
	return 0;
}

void myMainWinDraw(){
    glClearColor(0.0,0.0,0.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT);

    glLineWidth(2);
    glEnable(GL_LINE_STIPPLE);

    glLineStipple(1,0xF0F0);  //第一个参数是重复度、第二个参数代表线型
    glBegin(GL_LINES);
    glVertex3f(0.5f, 0.4f ,0.0f);
    glVertex3f(-0.5f, 0.4f ,0.0f);
    glEnd();

    glLineWidth(10);
    glLineStipple(5,0xF0F0);
    glColor3f(1.0f,0.0f,0.0f);
    glBegin(GL_LINES);
    glVertex3f(0.5f, 0.0f, 0.0f);
    glVertex3f(-0.5f, 0.0f,0.0f);
    glEnd();

    glLineWidth(20);
    glLineStipple(3,0x7555);
    glColor3f(1.0f,1.0f,0.0f);
    glBegin(GL_LINES);
    glVertex3f(0.5f, -0.4f, 0.0f);
    glVertex3f(-0.5f, -0.8f,0.0f);
    glEnd();

    glLineWidth(5);
    glBegin(GL_LINE_LOOP);
    glVertex3f(-0.8f,  0.8f, 0.0f);
    glVertex3f(-0.8f, -0.8f, 0.0f);
    glVertex3f( 0.8f, -0.8f, 0.0f);
    glVertex3f( 0.8f,  0.8f, 0.0f);
    glEnd();

    glFlush();

}

新的知识点:

1. glEnable(GL_LINE_STIPPLE) :将开关打开

2. glLineStipple(1,0xF0F0):第一个参数是重复度,第二个参数是线型。这里是,1111000011110000。如果将第一个参数改为2,那么将变成1111111100000000...这个样子。

绘制结果:

5.多边形绘制的模式(填充/线框)

#include <iostream>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

void myMainWinDraw();

int main(int argc,char** argv)
{
    glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
	glutInitWindowSize(400, 400);
	glutInitWindowPosition(0, 0);

	glutCreateWindow("Hello");

	glutDisplayFunc(myMainWinDraw);

	glutMainLoop();
	return 0;
}

void myMainWinDraw(){
    glClearColor(0.0,0.0,0.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT);

    glDisable(GL_LIGHTING);

    glPolygonMode(GL_FRONT,GL_FILL);
    glPolygonMode(GL_BACK,GL_LINE);
    glBegin(GL_TRIANGLES);
    glVertex2f(-1.0f, 0.0f);
    glVertex2f( 0.0f, 0.0f);
    glVertex2f( 0.0f, 1.0f);
    glEnd();

    glPolygonMode(GL_FRONT,GL_LINE);
    glBegin(GL_TRIANGLES);
    glVertex2f( 1.0f, 0.0f);
    glVertex2f( 0.0f, 1.0f);
    glVertex2f( 0.0f, 1.0f);
    glEnd();


    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
    glBegin(GL_TRIANGLES);
    glVertex2f(  0.0f, 0.0f);
    glVertex2f( -1.0f, 0.0f);
    glVertex2f(  0.0f,-1.0f);
    glEnd();

    glFrontFace(GL_CW);
    glPolygonMode(GL_BACK,GL_FILL);
    glPolygonMode(GL_FRONT,GL_LINE);
    glBegin(GL_TRIANGLES);
    glVertex2f(  0.0f, 0.0f);
    glVertex2f(  0.0f,-1.0f);
    glVertex2f(  1.0f, 0.0f);
    glEnd();

    glFlush();
}

新的知识点:

1. glPolygonMode(GL_FRONT,GL_FILL):设置正面或者背面的填充方式为GL_FILL或者GL_LINE模式。

2. glFrontFace(GL_CW):初始状态将CCW方向(点的顺序)视为正面,该语句将CW方向转为正面。

6.多边形填充的效果

填充图形的定义:

 下面就是glBegin()和glEnd() 了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1205626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

字符设备驱动基础框架

一、总体框架 1.Linux字符设备驱动工作原理图 2.驱动使用端 3.驱动实现端 二、各部分详解 1.VFS层 1) inode结构体 在Unix/Linux操作系统中&#xff0c;每个文件都由一个inode&#xff08;索引节点&#xff09;来索引。inode是特殊的磁盘块&#xff0c;它们在文件系统创建时…

【SQLite】环境安装

SQLite - C/C SQLite简介 SQLite 是一种轻量级的嵌入式数据库引擎&#xff0c;它在程序中直接访问数据库文件而不需要独立的数据库服务器。以下是一些关于 SQLite 的简介信息&#xff1a; 嵌入式数据库引擎&#xff1a; SQLite 是一种嵌入式数据库引擎&#xff0c;这意味着它…

Windows系统下使用docker部署redis

使用虚拟机部署redis&#xff0c;虚拟机很占用电脑资源&#xff0c;所以选择使用docker对redis进行部署。 一、安装docker 安装链接&#xff1a;https://docker.p2hp.com/ 二、配置redis.conf文件 下载配置文件&#xff1a;https://download.redis.io/redis-stable/redis.con…

时间序列预测实战(十五)PyTorch实现GRU模型长期预测并可视化结果

往期回顾&#xff1a;时间序列预测专栏——包含上百种时间序列模型带你从入门到精通时间序列预测 一、本文介绍 本文讲解的实战内容是GRU(门控循环单元)&#xff0c;本文的实战内容通过时间序列领域最经典的数据集——电力负荷数据集为例&#xff0c;深入的了解GRU的基本原理和…

信驰达科技加入车联网联盟(CCC),推进数字钥匙发展与应用

CCC)的会员。 图 1 深圳信驰达正式成为车联网联盟(CCC)会员 车联网联盟(CCC)是一个跨行业组织&#xff0c;致力于推动智能手机与汽车连接解决方案的技术发展。CCC涵盖了全球汽车和智能手机行业的大部分企业&#xff0c;拥有150多家成员公司。CCC成员公司包括智能手机和汽车制造…

Elasticsearch docker-compose 使用 Logstash 从 JSON 文件中预加载数据

在我们创建 Elasticsearch 进行开发时&#xff0c;最简单的办法就是在本地使用 docker-compose 来一键部署一个 Elasticsearch 集群。有时&#xff0c;特别是在准备测试环境时&#xff0c;开发人员希望从一开始就创建包含一些测试数据的数据库容器。我们可以使用 Logstash 来很…

nodejs+vue+python+PHP+微信小程序-安卓-房产中介管理信息系统的设计与实现-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

Day29力扣打卡

打卡记录 美丽塔 II&#xff08;前后缀分解 单调栈&#xff09; 链接 大佬的题解 class Solution:def maximumSumOfHeights(self, a: List[int]) -> int:n len(a)suf [0] * (n 1)st [n] # 哨兵s 0for i in range(n - 1, -1, -1):x a[i]while len(st) > 1 and …

OSG查看版本信息和32or64位

使用osgversiond命令&#xff1b; -h&#xff0c;显示帮助&#xff1b; osg使用了OpenThreads库&#xff0c;也可以查看OpenThreads的版本号&#xff1b; -r 或 -read&#xff0c;读取贡献者名单文件&#xff1b;没看到啥&#xff1b; 然后进入VS开发人员命令提示&#xff1b;…

一行JavaScrip可以做什么?

说在前面 JavaScript 提供了许多方便的方法和操作符来简化常见的任务&#xff0c;使得编程变得更加高效和便捷。无论是数学计算、字符串处理还是数据操作&#xff0c;JavaScript 都能帮助我们以简洁的方式实现所需功能。 代码 1、生成指定范围内的随机整数 const randomInt …

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline

模型简介 本基线模型共分为三个部分&#xff1a; 基于CNN的判断每张人脸是否是说话人的模型&#xff1b;基于Transformer-Encoder的判断同一段对话中不同轮次的说话人关系的模型&#xff1b;和使用上述两个预测结果求解二次型优化问题的说话人识别求解器。 基于CNN的判断每…

OpenAI调查ChatGPT故障;向量搜索的优势与局限

&#x1f989; AI新闻 &#x1f680; OpenAI调查ChatGPT故障&#xff0c;发布新AI产品GPTs和GPT-4 Turbo 摘要&#xff1a;OpenAI的ChatGPT和其他服务出现故障&#xff0c;经过调查后发现是由于DDoS攻击导致的异常流量模式。OpenAI在首届开发者大会上发布了新的AI产品GPTs&am…

Seaborn数据可视化综合应用Basemap和Seaborn在线闯关_头歌实践教学平台

Seaborn数据可视化综合应用Basemap和Seaborn 第1关 Seaborn第2关 Seaborn图形介绍第3关 Basemap 第1关 Seaborn 任务描述 本关任务&#xff1a;编写一个绘制每个月销售总额的折线图。 编程要求 本关的编程任务是补全右侧上部代码编辑区内的相应代码&#xff0c;根据输入文件路…

Maven 插件统一修改聚合工程项目版本号

目录 引言直接修改 pom.xml 的版本号的问题Maven 插件修改版本号开源项目微服务商城项目前后端分离项目 引言 在Maven项目中&#xff0c;我们通常有两种常见的方式来修改版本号&#xff1a;直接在pom.xml文件中手动编辑和利用Maven插件进行版本号调整。 本文将比较这两种修改…

如何用Python实现图像拼接画(把一堆小图拼成大图)

诸神缄默不语-个人CSDN博文目录 在这里的图像拼接画指的是一张大图由很多小图组成&#xff0c;效果就像这样&#xff1a; 原理&#xff1a;将大图拆成很多小块&#xff0c;每一块计算平均颜色&#xff0c;用平均颜色最相近的小图来替代&#xff0c;就可以。 直接遍历就可以&…

No198.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

雷达波形及MATLAB仿真

文章目录 前言一、雷达波形二、Matlab 仿真1、SFW 的距离分辨率和距离模糊①、MATLAB 源码②、仿真结果 三、资源自取 前言 本文对雷达波形的内容以思维导图的形式呈现&#xff0c;有关仿真部分进行了讲解实现。 一、雷达波形 思维导图如下图所示&#xff0c;如有需求请到文章…

C#中.NET 6.0控制台应用通过EF访问已建数据库

目录 一、新建.NET 6.0控制台应用并建立数据库连接 二、下载并安装EF程序包 三、自动生成EF模型和上下文 1.Blog类模型 2.Post类模型 3.数据库上下文 四、设计自己的应用 VS2022的.NET6.0、.NET7.0框架下默认支持EF7&#xff08;版本号7.0.13&#xff09;&#xff0c;除…

《QT从基础到进阶·二十五》界面假死处理

假如有这样一种情况&#xff0c;我们在主线程写了一个死循环&#xff0c;当程序运行到主线程的死循环代码后界面便卡死点了没有反应&#xff0c;这里提供几种方法处理界面假死的情况&#xff0c;保证比如主线程在执行死循环没有退出的时候点击界面不会卡死能继续执行其他功能。…

【c++】——类和对象(中)——实现完整的日期类

作者:chlorine 专栏:c专栏 我的花一定会开。 【学习目标】 拷贝复制——赋值运算符重载 目录 &#x1f393;运算符重载(-><...) &#x1f393;日期&天数 &#x1f393;前置和后置重载 我们完成了赋值运算符重载章节的学习&#xff0c;对operator关键字的使用有…