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;本…

c语言 get网页,get c语言获取网页信息 - 下载 - 搜珍网

get.clinux_boa_cgic/linuxboacgic/boa移植/cgic详解.doclinux_boa_cgic/linuxboacgic/boa移植/etc/boa/boa.conflinux_boa_cgic/linuxboacgic/boa移植/etc/grouplinux_boa_cgic/linuxboacgic/boa移植/etc/passwdlinux_boa_cgic/linuxboacgic/boa移植/嵌入式boa服务器笔记.docl…

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

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

c语言关闭控制台窗口,怎样可以屏蔽控制台程序的关闭按钮

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼//以前发过&#xff0c;再贴一次//-----------------------------------------------------#include "windows.h"#pragma comment(lib,"user32.lib")LPCRITICAL_SECTION lpDllLockNULL;#define CODE_MOV_LEN 5…

如何面对人生危机?

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

考研961数据结构c语言版真题,严蔚敏数据结构C语言版考研真题库

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼严蔚敏《数据结构》(C语言版)配套题库【考研真题精选(部分视频讲解)&#xff0b;章节题库】下载来源&#xff1a;http://fangcai.100xuexi.com/Ebook/993213.html第一部分 考研真题精选(部分视频讲解)一、单项选择题1若元素a&…

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

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

DEV-C上的报错 Process exited after 4.03 seconds with return value 3221225725

一&#xff1a;问题描述 还未进行任何输入&#xff0c;就直接输出 Process exited after 4.03 seconds with return value 3221225725 二&#xff1a;问题解决 问题代码&#xff1a; #include <iostream> using namespace std;int main(){int m[1000][1000];int N;ci…

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

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

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

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

c语言删除最小的j个元素,最小-最大堆的插入和删除

一、定义最小-最大堆&#xff1a;各层交替为最小层和最大层的堆。最大层&#xff1a;该层上的节点大于等于以其为根节点的子树上的所有节点。最小层&#xff1a;该层上的节点小于等于以其为根节点的子树上的所有节点。本文中&#xff0c;我们令堆的层数从1开始&#xff0c;节点…

.NET Core + Spring Cloud:API 网关

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

单片机C语言中空语句,单片机C语言中的空语句.doc

头文件如&#xff1a;//#include //包含库函数............//............_nop_(); //引用库函数敬礼。我一直都是借助仿真软件编。一点一点试时间。C语言最大的缺点就是实时性差,我在网上到看了一些关于延时的讨论,其中有篇文章51单片机 Keil C 延时程序的简单研究,…

VS Code 黑宝书背后的故事

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

c语言迪思卡尔算法,【论文】数字化的意匠_数字化设计与造型的认知学反思_谭峥.pdf...

D IG ITA L B UILD ING 数字建筑数字化的意匠—数字化设计与造型的认知学反思谭峥摘要/ 通过论述数字化设计的构成要件与理论界的思考&#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)工作单元…

android 那几种动画,Android 动画实现几种方案

Android 动画实现几种方案在 Android 的 FrameWork 中&#xff0c;为我们提供三种动画的实现方式&#xff1a;逐帧(Frame)动画、视图/补间动画(View Animation)和属性动画(Property Animation)。由于&#xff0c;这三种动画的实现方式和针对面不一样&#xff0c;应用的范围也有…

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

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