c语言glut打正方形,OpenGL绘制正方形并用键盘移动

准备工作:

在OpenGL中,基本图形元素如点、线、折线和多边形都是由一个或多个顶点所定义。OpenGL的7种基本图元:

e082ca9065f7

WeChat77732bbab74bef94d9f34e151bce8b6e.png

e082ca9065f7

WeChat26002917d9408c5eef2f9637246fd9a6.png

OpenGL绘制正方形与OpenGL绘制三角形类似,主要是setupRC方法中设置渲染环境时有区别, 在 triangleBatch.Begin(GL_TRIANGLE_FAN, 4)方法中设置绘制的图元样式,GL_TRIANGLE_FAN图元的枚举类型,4:顶点的个数。

void setupRC()

{

//设置清屏颜色(背景颜色)

glClearColor(0.98f, 0.40f, 0.7f, 1);

//没有着色器,在OpenGL 核心框架中是无法进行任何渲染的。初始化一个渲染管理器。

//在前面的课程,我们会采用固管线渲染,后面会学着用OpenGL着色语言来写着色器

shaderManager.InitializeStockShaders();

//修改为GL_TRIANGLE_FAN ,4个顶点

triangleBatch.Begin(GL_TRIANGLE_FAN, 4);

triangleBatch.CopyVertexData3f(vVerts);

triangleBatch.End();

}

正方形绘制过程中代码的执行流程图如下:

e082ca9065f7

3DE23B4E-1AF7-4A35-9E40-E6C41C28A0A4.png

想要通过键盘移动正方形,需要注册SpecialKeys()方法,在点击键盘方向键,系统会自动调用该方法,所以在该方法中通过参数key判断移动方向实现对应移动逻辑即可。通过键盘移动正方形有两种方式:

一、通过计算图形的顶点来移动

这种方式对于处理不规则图形会比较复杂

void SpecialKeys(int key, int x, int y){

GLfloat stepSize = 0.025f;

GLfloat blockX = vVerts[0];

GLfloat blockY = vVerts[10];

if (key == GLUT_KEY_UP) {

blockY += stepSize;

}

if (key == GLUT_KEY_DOWN) {

blockY -= stepSize;

}

if (key == GLUT_KEY_LEFT) {

blockX -= stepSize;

}

if (key == GLUT_KEY_RIGHT) {

blockX += stepSize;

}

//边界检测,根据顶点移动的位置,判断图形是否超出边界

//当正方形移动超过最左边的时候

if (blockX < -1.0f) {

blockX = -1.0f;

}

//当正方形移动到最右边时

//1.0 - blockSize * 2 = 总边长 - 正方形的边长 = 最左边点的位置

if (blockX > (1.0 - blockSize * 2)) {

blockX = 1.0f - blockSize * 2;

}

//-1.0 - blockSize * 2 = Y(负轴边界) - 正方形边长 = 最下面点的位置

if (blockY < -1.0f + blockSize * 2 ) {

blockY = -1.0f + blockSize * 2;

}

//当正方形移动到最上面时

if (blockY > 1.0f) {

blockY = 1.0f;

}

printf("blockX = %f\n",blockX);

printf("blockY = %f\n",blockY);

// Recalculate vertex positions

vVerts[0] = blockX;

vVerts[1] = blockY - blockSize*2;

printf("(%f,%f)\n",vVerts[0],vVerts[1]);

vVerts[3] = blockX + blockSize*2;

vVerts[4] = blockY - blockSize*2;

printf("(%f,%f)\n",vVerts[3],vVerts[4]);

vVerts[6] = blockX + blockSize*2;

vVerts[7] = blockY;

printf("(%f,%f)\n",vVerts[6],vVerts[7]);

vVerts[9] = blockX;

vVerts[10] = blockY;

printf("(%f,%f)\n",vVerts[9],vVerts[10]);

triangleBatch.CopyVertexData3f(vVerts);

//强制开启渲染刷新,调用RenderScene方法

glutPostRedisplay();

}

二、通过矩阵移动图形

其原理跟通过顶点移动相同,只是通过计算中心点的移动距离,通过矩阵函数整体计算。

同样的在SpecialKeys()方法中计算移动距离及做边界检测

void SpecialKeys(int key, int x, int y){

GLfloat stepSize = 0.025f;

if (key == GLUT_KEY_UP) {

yPos += stepSize;

}

if (key == GLUT_KEY_DOWN) {

yPos -= stepSize;

}

if (key == GLUT_KEY_LEFT) {

xPos -= stepSize;

}

if (key == GLUT_KEY_RIGHT) {

xPos += stepSize;

}

//碰撞检测

if (xPos < (-1.0f + blockSize)) {

xPos = -1.0f + blockSize;

}

if (xPos > (1.0f - blockSize)) {

xPos = 1.0f - blockSize;

}

if (yPos < (-1.0f + blockSize)) {

yPos = -1.0f + blockSize;

}

if (yPos > (1.0f - blockSize)) {

yPos = 1.0f - blockSize;

}

glutPostRedisplay();

}

与通过计算顶点移动图形的方式相比,通过矩阵移动图形,需要在刷新方法RenderScene()中设置矩阵的计算方式

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);

GLfloat vRed[] = {1.0f,0.0f,0.0f,0.0f};

//生成平移矩阵、

M3DMatrix44f mTransfromMatrix;

m3dTranslationMatrix44(mTransfromMatrix, xPos, yPos, 0.0f);

//计算移动后的矩阵计算及过,放到平面着色器中绘制

shaderManager.UseStockShader(GLT_SHADER_FLAT,mFinalTransform,vRed);

triangleBatch.Draw();

//执行交换缓存区

glutSwapBuffers();

关于缓冲区的理解,在OpenGL专业名词解析13条中有详细介绍,同时涉及到图片撕裂,掉帧等现象的原因及解决办法。

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

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

相关文章

.NET或.NET Core Web APi基于tus协议实现断点续传

【导读】前两天我采用技巧式方案基本实现大文件分片上传&#xff0c;这里只是重点在于个人思路和亲身实践&#xff0c;若在实际生产环境要求比较高的话肯定不行&#xff0c;仍存在一些问题需要深入处理&#xff0c;本文继续在之前基础上给出基于tus协议的轮子方案&#xff0c;本…

省钱攻略送上!戴尔官网OptiPlex商用台式机到手仅需2279元!速速抢购!

如何用最少的钱磕到性价比超优的设备&#xff1f;两三千元左右的价格能买到狠货吗&#xff1f;来戴尔小企业官网&#xff0c;助力业务在线&#xff0c;Slay全场&#xff01;粉丝额外宠粉福利1.关注公众号 2.通过戴尔官网客服采购电脑产品3.发送订单截图至公众号后台就会有机会…

如何面对人生危机?

点击蓝字关注&#xff0c;回复“职场进阶”获取职场进阶精品资料一份一名读者提问&#xff1a;洋哥&#xff0c;我7年前从大厂出来&#xff0c;创业多年。连续失败&#xff0c;没买车也没房&#xff0c;女朋友也和我分手了&#xff0c;父母也对我失望至极。最近我开始焦虑、失眠…

不用虚机不用Docker使用Azure应用服务部署ASP.NET Core程序

一般我们写好了应用程序想要部署发布它&#xff0c;要么发布到物理机&#xff0c;要么发布到虚拟机&#xff0c;要么发布到容器来运行它。现在有了Azure应用服务&#xff0c;我们可以完全不用管这些东西&#xff0c;只管写好自己的代码&#xff0c;然后使用VisualStudio的发布功…

数码管显示1到8c语言,单片机控制八只数码管滚动显示1~8 附PROTEUS软件仿真图

数码管显示是每一个单片机初学者都必须学的&#xff0c;而单片机驱动数码管的数字循环显示实验&#xff0c;又是单片机基础中的基础&#xff0c;同时也是学好C语言编程的关键&#xff0c;此实验在硬件上可以弄清楚单片机驱动原理和数码管的显示原理&#xff0c;在软件上可以帮助…

.NET Core + Consul 服务注册与发现

在分布式架构中&#xff0c;服务治理是必须面对的问题&#xff0c;如果缺乏简单有效治理方案&#xff0c;各服务之间只能通过人肉配置的方式进行服务关系管理&#xff0c;当遇到服务关系变化时&#xff0c;就会变得极其麻烦且容易出错。Consul[1] 是一个用来实现分布式系统服务…

.NET Core + Spring Cloud:API 网关

API 网关是系统的唯一入口&#xff0c;调用任何服务的请求都需要经过网关层&#xff0c;最终才可能到达目标服务&#xff0c;既然是必经之路&#xff0c;那我们可以在网关层进行一些通用的操作&#xff0c;如&#xff1a;认证、鉴权、限流、智能路由、缓存、日志、监控、超时、…

VS Code 黑宝书背后的故事

自开售以来&#xff0c;《Visual Studio Code 权威指南》就受到了许多读者朋友的青睐。在京东和当当两大平台上&#xff0c;都分别取得了不错的绩&#xff1a;当当&#xff1a;计算机新书热卖榜第一名京东&#xff1a;科技IT新书榜第一名那么&#xff0c;热销背后&#xff0c;这…

ASP.net Core MVC项目给js文件添加版本号

需求&#xff1a;使用ASP.net Core Mvc开发公司内部web系统&#xff0c;给视图中js(css,image也可以)文件添加版本号避免缓存问题。解决方法&#xff1a;利用Taghelper提供的标签&#xff08;asp-append-version&#xff09;可以实现<script src"~/Scripts/Biz/Village…

c语言网格搜索,基于C

引言教室作为学生长期使用的建筑类型&#xff0c;对光环境舒适度的需求尤为明显。相关研究表明&#xff0c;不仅照明会影响学习效率[1]&#xff0c;而且不当照明会引起使用者不适甚至损害视力[2]。随着多媒体教学设施的普及&#xff0c;幻灯片投影教学现已成为教师授课的主要形…

初识ABP vNext(1):开篇计划基础知识

点击上方蓝字"小黑在哪里"关注我吧审计(Audit)本地化(Localization)事件总线(Event Bus)多租户(multi-tenancy technology)DDD分层实体(Entity)值对象(Value Object)聚合根(Aggregate Root)仓储(Repository)应用服务(Application Services)数据传输对象(DTO)工作单元…

[开源] .Net ORM FreeSql 1.8.0-preview 最新动态播报

FreeSql 是 .NET 开源生态下的 ORM 轮子&#xff0c;在一些人眼里属于重复造轮子&#xff1a;不看也罢。就像昨天有位朋友截图某培训直播发给我看&#xff0c;内容为&#xff1a;“FreeSQL&#xff08;个人产品&#xff09;&#xff0c;自己玩可以&#xff0c;不要商用。ORM框架…

懂程序员的产品经理是什么样子?

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「155」篇原创敬上大家好&#xff0c;我是Z哥。在互联网行业&#xff0c;产品经理和程序员之间的关系很微妙。表面看上去水火不容&#xff0c;在一方的眼里看另外一…

初识ABP vNext(2):ABP启动模板

点击上方蓝字"小黑在哪里"关注我吧AbpHelper模块安装前言上一篇介绍了ABP的一些基础知识&#xff0c;本篇继续介绍ABP的启动模板。使用ABP CLI命令就可以得到这个启动模板&#xff0c;其中包含了一些基础功能模块&#xff0c;你可以基于这个模板来快速开发。开始首先…

关于Dapper实现读写分离的个人思考

概念相关为了确保多线上环境数据库的稳定性和可用性&#xff0c;大部分情况下都使用了双机热备的技术。一般是一个主库一个从库或者多个从库的结构&#xff0c;从库的数据来自于主库的同步。在此基础上我们可以通过数据库反向代理工具或者使用程序的方式实现读写分离&#xff0…

135. 分发糖果002(贪心算法+思路+详解)

一&#xff1a;题目 老师想给孩子们分发糖果&#xff0c;有 N 个孩子站成了一条直线&#xff0c;老师会根据每个孩子的表现&#xff0c;预先给他们评分。 你需要按照以下要求&#xff0c;帮助老师给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。 评分更高的孩…

Enumerable 下又有新的扩展方法啦,快来一睹为快吧

一&#xff1a;背景1. 讲故事前段时间将公司的一个项目从 4.5 升级到了 framework 4.8 &#xff0c;编码的时候发现 Enumerable 中多了三个扩展方法&#xff1a; Append, Prepend, ToHashSet&#xff0c;想必玩过jquery的朋友一眼就能看出这三个方法的用途&#xff0c;这篇就和…

Jdbc创建表 利用循环添加数据 ,更新数据

一&#xff1a;上码 1.有的已经实现的就注释了 2.配置文件信息 package com.wyjedu.jdbc.PreparedStatement;import java.io.FileInputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet;…

荣耀智慧屏功能曝光 首发华为鸿蒙OS,荣耀智慧屏功能曝光:首发华为鸿蒙OS,全场景智慧体验...

IT之家8月9日消息 今日&#xff0c;华为开发者大会于东莞松山湖正式拉开帷幕。今天下午的焦点毫无疑问是鸿蒙OS与EMUI10。明日下午14:00&#xff0c;华为的另一个重磅产品荣耀智慧屏也将正式发布。7月中旬&#xff0c;荣耀总裁赵明正式宣布了荣耀智慧屏&#xff0c;这也意味着华…

旧 WCF 项目迁移到 asp.net core + gRPC 的尝试

一个月前&#xff0c;公司的运行WCF的windows服务器down掉了&#xff0c;由于 AWS 没有通知&#xff0c;没有能第一时间发现问题。所以&#xff0c;客户提出将WCF服务由C#改为JAVA&#xff0c;在Linux上面运行&#xff1b;一方面&#xff0c;AWS对Linux有较多的监控措施&#x…