看我为了水作业速通 opengl freeglut!

news2024/9/17 0:24:30

参考视频计算机图形学基础–OpenGL的实现_哔哩哔哩_bilibiliT

图形绘制

GL_POINTS

#define FREEGLUT_STATIC // Define a static library for calling functions
#include <GL/freeglut.h> // Include the header file

void myPoints() { //show three points in screen
	glClear(GL_COLOR_BUFFER_BIT);
	glPointSize(3);
	glBegin(GL_POINTS); //show what to draw,here we draw points
	glColor3f(1.0, 0.0, 0.0); //color:red
	glVertex2i(-3, 3);//coordinate
	glColor3f(0.0, 1.0, 0.0); //color:green
	glVertex2i(10, 20);//coordinate
	glColor3f(0.0, 0.0, 1.0); //color:blue
	glVertex2i(0, -15);//coordinate
	glEnd();
	glFlush(); //把绘制的缓存推送到屏幕上
}

void init() {
	glClearColor(1.0, 1.0, 1.0, 1.0); //black background
	glMatrixMode(GL_PROJECTION); 
	glLoadIdentity;
	gluOrtho2D(-100, 100, -100, 100); //可以显示的范围

}

int main(int argc, char* argv[]) {
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
	glutInitWindowPosition(200, 300); //在屏幕中的位置
	glutInitWindowSize(300, 300);
	glutCreateWindow("Display Points");

	init();
	glutDisplayFunc(myPoints); //回调函数
	glutMainLoop();
	return 0;
}

结果:

注意:颜色改一次换一次(废话),如果不改的话那就一直一个颜色

glFlush()很重要!是把图片推送到屏幕上!

线段 

GL_LINES

两个两个配对连线

void lines() {
	int p1[] = { 6,4 };
	int p2[] = { 1,1 };
	int p3[] = { 3,7 };
	int p4[] = { 5,1 };
	int p5[] = { 0,4 };
	glClear(GL_COLOR_BUFFER_BIT);//clear
	glColor3f(0.3, 0.1, 0.8); 
	glPointSize(3);
	glBegin(GL_LINES); //这个以及后面几个改的是这里
	glVertex2iv(p1);
	glVertex2iv(p2);
	glVertex2iv(p3);
	glVertex2iv(p4);
	glVertex2iv(p5); //绘制两个线段是因为P5没有匹配的
	glEnd();
	glFlush();
}

GL_LINE

GL_LINE_LOOP

多边形 POLYGON

GL_POLYGON

void polygonTraingle() {
	int p1[] = { 1,3 };
	int p2[] = { 3,0 };
	int p3[] = { 6,0 };
	int p4[] = { 7,3 };
	int p5[] = { 6,6 };
	int p6[] = { 3,6 };
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.6, 0.5, 0.2);
	glPointSize(3);
	glBegin(GL_POLYGON); //point first
	glVertex2iv(p1);
	glVertex2iv(p2);
	glVertex2iv(p3);
	glVertex2iv(p4);
	glVertex2iv(p5);
	glVertex2iv(p6);
	glEnd();
	glFlush();
}

结果

GL_TRIANGLES

GL_QUADS

键鼠交互

键盘 

glutKeyboardFunc()

 这里重点关注一下那个mykeyboard和mian中的glutkeyboardfuc()

#define FREEGLUT_STATIC // Define a static library for calling functions
#include <GL/freeglut.h> // Include the header file


int xd=0, yd = 0;

void myDisplay() {
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.8,0.5,0.6);
	glPointSize(5);
	glBegin(GL_POLYGON);
	glVertex2i(10 + xd,10 + yd);
	glVertex2i(20 + xd,10 + yd);
	glVertex2i(20 + xd,0 + yd);
	glVertex2i(10 + xd,0 + yd);
	glEnd();
	glFlush();
}

void myKeyBoard(unsigned char key, int x, int y) {
	switch (key) {
	case 'w':yd++; break;
	case 's':yd--; break;
	case 'a':xd--; break;
	case 'd':xd++; break;
	}
	glutPostRedisplay(); //要求重新绘制窗口的内容
}


void init() {
	glClearColor(1.0, 1.0, 1.0, 1.0); //black background
	glMatrixMode(GL_PROJECTION);

	glLoadIdentity;
	gluOrtho2D(-20, 30, -20, 30); //可以显示的范围
}


void main(int argc, char* argv[]) {
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
	glutInitWindowPosition(300, 100); //在屏幕中的位置
	glutInitWindowSize(600, 500);
	glutCreateWindow("Key interaction");

	init();
	glutDisplayFunc(myDisplay); //回调函数
	glutKeyboardFunc(myKeyBoard);
	glutMainLoop();
}

效果

可爱粉色方坨坨会随着你的wasd键上下左右移动

鼠标

glutMouseFunc

重点关注一下mouseMotion函数

#define FREEGLUT_STATIC // Define a static library for calling functions
#include <GL/freeglut.h> // Include the header file


GLint xd=0, yd = 0; //GLint 主要用于在OpenGL中处理整数数据,用于配置和表示与图形渲染相关的各种参数和信息。
GLint w = 600, h = 500; 

void myDisplay() {
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.8, 0.5, 0.6);
	glPointSize(5);
	glBegin(GL_POLYGON);
	glVertex2i(10 + xd, 10 + yd);
	glVertex2i(20 + xd, 10 + yd);
	glVertex2i(20 + xd, 0 + yd);
	glVertex2i(10 + xd, 0 + yd);
	glEnd();
	glFlush();
}

void mouseMotion(GLint button,GLint state, GLint x,GLint y) { //鼠标的按钮,鼠标是按下还是弹起,x,y
	if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { //鼠标左键并按下
		xd = x;
		yd = h-y;
		glutPostRedisplay();
	}
}


void init() {
	glClearColor(1.0, 1.0, 1.0, 1.0); //black background
	glMatrixMode(GL_PROJECTION);

	glLoadIdentity;
	gluOrtho2D(0, w, 0, h); //可以显示的范围
}


void main(int argc, char* argv[]) {
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
	glutInitWindowPosition(300, 100); //在屏幕中的位置
	glutInitWindowSize(w, h);
	glutCreateWindow("Mouse Motion");

	init();
	glutDisplayFunc(myDisplay); //回调函数
	glutMouseFunc(mouseMotion);
	glutMainLoop();
}

结果

可爱粉色方坨坨会随着你的鼠标移动

二维图形变换

平移

x = x+tx

y = y+ty

这个挺简单的就不多写了

旋转

x,y

绕原点旋转θ 

x' = xcosθ - ysinθ

y' = xsinθ + ycosθ

绕 xr yr旋转θ 

x' = xr+ (x-xr)cosθ - (y-yr)sinθ

y' = yr + (x-xr)sinθ + (y-yr)cosθ

缩放

x'  =  x*Sx

y' =  y*Sy

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

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

相关文章

MySQL中大量数据优化方案

文章目录 1 大量数据优化1.1 引言1.2 评估表数据体量1.2.1 表容量1.2.2 磁盘空间1.2.3 实例容量 1.3 出现问题的原因1.4 解决问题1.4.1 数据表分区1.4.1.1 简介1.4.1.2 优缺点1.4.1.2 操作 1.4.2 数据库分表1.4.2.1 简介1.4.2.2 分库分表方案1.4.2.2.1 取模方案1.4.2.2.2 range…

JAVA毕业设计105—基于Java+Springboot+Vue的校园跑腿系统(源码+数据库)

基于JavaSpringbootVue的校园跑腿系统(源码数据库)105 一、系统介绍 本系统前后端分离 本系统分为管理员和用户两个角色 用户&#xff1a; 登录&#xff0c;注册&#xff0c;余额充值&#xff0c;密码修改&#xff0c;发布任务&#xff0c;接受任务&#xff0c;订单管理&…

(多线程)并发编程的三大基础应用——阻塞队列、定时器、线程池【手搓源码】

9.2 阻塞式队列 BlockingQueue<Integer> blockingQueue new LinkedBlockingQueue<Integer>();BlockingQueue<String> queue new LinkedBlockingQueue<>(); // 入队列 queue.put("abc"); // 出队列. 如果没有 put 直接 take, 就会阻塞. St…

IDEA 删除一次性删除所有断点

Ctrl Shift F8 &#xff08;打开“断点”对话框&#xff09; Ctrl A &#xff08;选择所有断点&#xff09; Alt Delete &#xff08;删除选定的断点&#xff09; Enter &#xff08;确认&#xff09;

数字孪生技术:工业数字化转型的引擎

数字孪生是一种将物理实体数字化为虚拟模型的技术&#xff0c;这些虚拟模型与其物理对应物相互关联。这种虚拟模型通常是在数字平台上创建的&#xff0c;它们复制了实际设备、工厂、甚至整个供应链的运作方式。这使工业企业能够实现以下益处&#xff1a; 1. 实时监测和分析 数…

(Java)中的数据类型和变量

文章目录 一、字面常量二、数据类型三、变量1.变量的概念2.语法的格式3.整型变量4.长整型变量5.短整型变量6.字节型变量 四、浮点型变量1.双精度浮点数2.单精度浮点数 五、字符型常量六、布尔型变量七、类型转换1.自动类型转换&#xff08;隐式&#xff09;2.强制类型转换(显式…

【数据结构】数组和字符串(四):特殊矩阵的压缩存储:稀疏矩阵——三元组表

文章目录 4.2.1 矩阵的数组表示4.2.2 特殊矩阵的压缩存储a. 对角矩阵的压缩存储b~c. 三角、对称矩阵的压缩存储d. 稀疏矩阵的压缩存储——三元组表结构体初始化元素设置打印矩阵主函数输出结果代码整合 4.2.1 矩阵的数组表示 【数据结构】数组和字符串&#xff08;一&#xff…

一篇教你学会Ansible

前言 Ansible首次发布于2012年&#xff0c;是一款基于Python开发的自动化运维工具&#xff0c;核心是通过ssh将命令发送执行&#xff0c;它可以帮助管理员在多服务器上进行配置管理和部署。它的工作形式依托模块实现&#xff0c;自己没有批量部署的能力。真正具备批量部署的是…

生产管理中,如何做好生产进度控制?

在生产管理中&#xff0c;我们常常会遇到以下问题&#xff1a; 由于计划不清或者无计划&#xff0c;导致物料进度无法保障&#xff0c;经常出现停工待料的情况。 停工待料导致了生产时间不足&#xff0c;为了赶交货期&#xff0c;只能加班加点。 生产计划并未发挥实际作用&am…

14、Python -- 列表推导式(for表达式)与控制循环

目录 for表达式&#xff08;列表推导式&#xff09;列表推导式的说明使用break跳出循环使用continue忽略本次循环使用return结束函数 列表推导式 使用break跳出循环 使用continue忽略本次循环 for表达式&#xff08;列表推导式&#xff09; for表达式用于利用其他区间、元组、…

哪些车企是前向雷达大客户?国产突围/4D升级进展如何

可穿透尘雾、雨雪、不受恶劣天气影响&#xff0c;唯一能够“全天候全天时”工作&#xff0c;同时在中远距离的物体识别能力&#xff0c;毫米波雷达成为二十几年前豪华车ACC功能的必备传感器。 此后&#xff0c;随着视觉感知技术的不断成熟&#xff0c;尤其是Mobileye、特斯拉等…

强化学习代码实战(3) --- 寻找真我

前言 本文内容来自于南京大学郭宪老师在博文视点学院录制的视频&#xff0c;课程仅9元地址&#xff0c;配套书籍为深入浅出强化学习 编程实战 郭宪地址。 正文 我们发现多臂赌博机执行一个动作之后&#xff0c;无论是选择摇臂1&#xff0c;摇臂2&#xff0c;还是摇臂3之后都会返…

MySQL Join 类型

文章目录 1 Join 类型有哪些2 Inner Join3 Left Join4 Right Join5 Full Join 1 Join 类型有哪些 SQL Join 类型的区别 Inner Join: 左,右表都有的数据Left Join: 左表返回所有的行, 右表没有的补充为 NULLRight Loin: 右表返回所有的行, 左表没有的补充为 NULLFull Outer J…

【会员管理系统】篇二之项目搭建、初始化、安装第三方库

一、项目搭建 1.全局安装vue-cli npm install -g vue/cli查看版本信息 vue -V 2.创建项目 vue create 项目名称 回车 回车 剩余选择如下 之后等待项目创建 最后npm run serve 二、初始化配置 1.更改标题 打开public下的index&#xff0c;将title标签里的改成想要设置的…

【模式识别】贝叶斯决策模型理论总结

贝叶斯决策模型理论 一、引言二、贝叶斯定理三、先验概率和后验概率3.1 先验概率3.2 后验概率 四、最大后验准则五、最小错误率六、最小化风险七、最小最大决策八、贝叶斯决策建模参考 一、引言 在概率计算中&#xff0c;我们常常遇到这样的一类问题&#xff0c;某事件的发生可…

【Redis】redis 十大数据类型 概述

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ redis十大数据类型 一、redis字符串&#xff0…

【Elasticsearch】es脚本编程使用详解

目录 一、es脚本语言介绍 1.1 什么是es脚本 1.2 es脚本支持的语言 1.3 es脚本语言特点 1.4 es脚本使用场景 二、环境准备 2.1 docker搭建es过程 2.1.1 拉取es镜像 2.1.2 启动容器 2.1.3 配置es参数 2.1.4 重启es容器并访问 2.2 docker搭建kibana过程 2.2.1 拉取ki…

crossover23.6闪亮登场发布啦,2023最新功能解析

CrossOver刚刚更新了23.6版本&#xff0c;新增了多款游戏的支持&#xff0c;快来看看你想玩的游戏在不在里面吧。点击这里立即下载最新版CrossOver。 软件介绍 CrossOver 23.6 让Mac可以运行Windows程序的工具 已通过小编安装运行测试 100%可以使用。 CrossOver for Mac 23.…

手把手教你玩转单目摄像头(OpenCv+Python)

目录 ​编辑 一&#xff0c;单目应用前景 二&#xff0c;打开摄像头 三&#xff0c;设置分辨率 四&#xff0c;摄像头拍照 五&#xff0c;录制视频 六&#xff0c;单目结合OpenCV的实际应用 一&#xff0c;单目应用前景 单目视觉&#xff08;monocular vision&#xff0…