openGL基本绘图

OpenGL绘图基础 OpenGl绘图基础 阅读详情

OpenGl 是一套3D 绘图函数库, 在三维空间绘图是他的功能,可惜人和电脑的沟通方式还不够发达,不然是不是艺术家可以通过一些程序用意识凭空在空间里作画,是不是很酷(科幻电影看多了)而现在我们仍然只能通过传统的笛卡尔坐标系这种一板一眼的方式 将我的脑中的图形量化,和数字化。在这一点上OpenGl的对空间事物的体现方式无疑是完善的,在opengl中,也有一个内建的坐标系,就如我们的视野有限一样,opengl同样无法提供无限空间里的所有信息,但是我们可以把opengl提供的空间理解成一个盒子而我们正通过盒子唯一的开口向内观察,这一开口就是我们电脑屏幕,如果把这个盒子看成是一个 (-1,-1,-1),(1,1,1)的立方体的话,屏幕就是在z=-1 上从(1,1)到(-1,-1)的这片区域,事实上opengl也是这样做的 ,它在所提供的空间中圈定的也是这样一个坐标系 初始情况下在屏幕上 水平向左的为X轴正方向 竖直向上的为Y轴正方向 而Z轴则垂直于屏幕向外与屏幕平面的焦点为屏幕中心,坐标则为(0,0,-1). 而我们在屏幕上看到的图形是显示器上显示的就 是从z为负无穷处射来的平行光在Z = -1处的屏幕上所成的像。   

理解了OpenGL的这个坐标体系我们就可以开始里面作画了,在opengl中画点和线是由同一组函数完成的 基本结构是这样的

        glBegin(mode_parameter); 

                glColor3f(r,g,b); 
                glVertex2f(x1,y2); 
                glVertex3f(x2,y2,z2); 
                .

.

 

 

 glEnd();

    这段代码的作用是在空间中以模式mode_parameter 和颜色(r g b) 在坐标(x1,y1,0.0)和(x2,y2,z2)处画两个点,当然你最终看到的是不是点还要取决于你的mode_parameter。在glbegin()与glend()之间是通过glvertex的一系列函数来定义一组顶点然后根据mode_parameter将这些点连接画线,或是以孤立点的形式画出,mode_parameter有以下几种:

GL_POINTS ,GL_LINES ,GL_LINE_STRIP ,GL_LINE_LOOP ,GL_TRIANGLES ,GL_TRIANGLE_STRIP ,GL_TRIANGLE_FAN ,GL_QUADS ,GL_QUAD_STRIP,GL_POLYGON

比较常用的是 GL_POINTS  画点   也就是说程序中以glvertex定义的点将被画在屏幕上

            GL_LINES        画线     定义的每两个点将被连接起来变成一条直线,共N/2条

            GL_LINE_STRIP       将所有的点连接变成一条折线

            GL_LINE_LOOP        将GL_LINE_STRIP画成的折线头尾相连,形成闭合图形

            GL_TRIANGLES            定义的每三个点将被连接起来涂成一个三角形,共N/3个

            GL_QUADS                定义的每四个点将被连接起来涂成一个四边形,共N/4个

在这些模式中到底是哪几个点变成一组形成直线,或多边形取决于glvertex定义点的次序 

至此 我们已经能够画出绝大多数直线形,但是曲线呢,数学上曲线是被定义为 N个点连成的折线 当N趋向无穷大的情况。而在计算机中我们只要画出N足够大的折线就可以认为是曲线了

还记得小时候学logo是 要画一个园 不就是画一个正几百边形吗,这样我们就可以画出绝大多数简单的函数图形了,理论说完了来实践一下吧 :

void display()

{

        glClearColor(1,1,1,1);                     //设置刷新背景色

        glClear(GL_COLOR_BUFFER_BIT);              //刷新背景

 

 

                glBegin(GL_LINES);                //画个十字充当坐标系

                        glColor3f(0,0,0);          //设置当前颜色

                        glVertex3f(-1,0,0);

                        glVertex3f(1,0,0);

                        glVertex3f(0,-1,0);

                    glVertex3f(0,1,0);

                glEnd();

 

 

                glBegin(GL_LINE_STRIP);         //画个y=sin(4x) 的函数图像

                        glColor3f(1,0,0);

                        for (float x=-1.00;x<=1.00;x+=0.01)

                            glVertex2f(x,sin(x*4*pi));

                glEnd();

 

 

                glBegin(GL_LINE_LOOP);          //画个蓝色的单位圆 

                        glColor3f(0,0,1);

                        for (float x=-1.00;x<=1.00;x+=0.01)

                            glVertex2f(x,sqrt(1-x*x));

                        for (float x=1.00;x>=-1.00;x-=0.01)

                            glVertex2f(x,-sqrt(1-x*x));

                glEnd();

                           

        glFlush();          //更新窗口

}

这里glvertex2f(x,y) 等价与 glvertex3f(x,y,0)

用这个display函数替换原来我们用来换背景的那个会看到一个单位圆,一个坐标系,和sin(4x)的图像

 

 

四.坐标变换 平移,缩放与旋转

 

 

    前面我们知道OpenGL有内建的坐标系,事实上OpenGl有两套坐标系,一个坐标系被称为眼睛坐标(eye coordinate system) 简称ECS ,上章讲的就是这个坐标系。  OpenGL还有一套坐标,被称为(object coordinate system) 简称OCS ,而这个才是更为重要的,其实我们用来绘图的正是OCS。

两个坐标系中ECS 可以看成是一个现实存在的 基本不变的全局坐标系,而OCS则可以看成是用户自定义的坐标系,我们可以将这个坐标系任意的平移与缩放,在初始情况下他和ECS是重合的,也可以通过glLoadIdentity()强制复位,这样可以给我们的绘图带来极大的方便。这里有一点是要值得注意的是在使用一个函数时需要弄清它是使用什么坐标系的,刚刚我们用到的glVertex系列函数都是用的OCS

    下面是一个平移的例子:

    void makecross(float *color) //在当前OCS的中心画一个十字

{   

              glBegin(GL_LINES);

                        glColor3fv(color); //设置当前颜色

                        glVertex3f(-1,0,0);

                        glVertex3f(1,0,0);

                        glVertex3f(0,-1,0);

                       glVertex3f(0,1,0);

                           

              glEnd();

}

void display()

{

       

         float red[3]={1,0,0};

         float blue[3]={0,1,0};

         float green[3]={0,0,1};

         float yellow[3]={1,1,0};   

    

         glClearColor(1,1,1,1);

         glClear(GL_COLOR_BUFFER_BIT);

        

         glLoadIdentity();

         makecross(red);

         glTranslatef(-0.5,-0.5,0);

         makecross(blue);

         glTranslatef(1,0.25,0);

         makecross(green);

         glTranslatef(-0.75,0.75,0);

         glScalef(0.5,0.5,1); //在x,y 上缩小一半

         makecross(yellow);

             

        glFlush();          //更新窗口

}

 这两个函数中makecross的作用是在坐标中心画一个十字,前面我们知道glVertex使用的是OCS 所以makecross 的作用便是在当前OCS的中心画一个十字,以观察OCS的位置,

  glColor3fv(color)的功能于之前我们看到的glColor3f(r,g,b)是一样的,只不过一个是使用一个数组作为参数

 

 

void glLoadIdentity(void)

  在display中 glLoadIdentity 的作用是使OCS 与ECS 重合,在这里我们用来初始化OCS 

 

 

void glTranslate{fd}(TYPEx, TYPE y, TYPEz);

glTranslatef 是将OCS平移至x,y,z 出,也就是在(x,y,z)处建立新的OCS,这里要注意这里的参数X,Y,Z也是OCS坐标

 

 

void glScale{fd}(TYPEx, TYPE y, TYPEz);

  glScalef则是当前OCS的缩放,x,y,z 分别指在三个方向上的放大倍数

 

 

   说完了缩放和平移,我们来看看旋转,opengl 里的旋转是通过glrotate来实现的,他的本质是将当前矩阵在乘于旋转矩阵,就是将当前的OCS 旋转一个指定的角度

                    void glRotate{fd}(TYPE angle, TYPE x, TYPE y, TYPE z);

glrotate 是将当前OCS绕向量(x,y,z)逆时针旋转angle度 例如我们要讲上例中的图形旋转绕Z轴旋转45度则可以通过glrotatef(45,0,0,1)来实现。

OpenGL绘图基本矩阵运算讲解 平移缩放旋转矩阵一、平移矩阵二、缩放矩阵三、旋转矩阵四、透视矩阵五、剪切矩阵 一、平移矩阵 坐标平移(dx,dy,dz)(dx,dy,dz)(dx,dy,dz): [100dx010dy001dz0001] \begin{bmatrix} 1 &amp;amp; 0 &amp;amp; 0 &amp;amp; dx\\ 0 &amp;amp; 1 &amp;amp; 0 &amp;a... 阅读详情

相关推荐

Qt+OpenGL+VS2010写的输入点坐标,显示点和直线

新建一个空的Qt工程 把所给的文件添加进去即可 界面有两个部分 视图部分 点坐标输入部分 由于用的是QSpinBox类的 editingFinished 信号 所以每次输入顶点的时候不管原先那个点的值有没有变化 都要让光标在那个框中过一下 或者按个enter也行 总之要在那个框中过一下 ">新建一个空的Qt工程 把所给的文件添加进去即可 界面有两个部分 视图部分 点坐标输入部分 由于用的是QSpinBox类的 editingFinished 信号 所以每次输入顶点的时候不管原先那个点的值有没有变化 都要让光标在那个框中过 [更多]

OpenGl 的基本绘图功能

文章转自:http://blog.donews.com/atombomb/archive/2005/11/16/628498.aspx OpenGl 是一套3D 绘图函数库, 在三维空间绘图是他的功能,可惜人和电脑的沟通方式还不够发达,不然是不是艺术家可以通过一些程序用意识凭空在空间里作画,是不是很酷(科幻电影看多了)而现在我们仍然只能通过传统的笛卡尔坐标系这种一板一眼的方式 将我的脑中的图

ColaWJY的专栏 409

opengl绘制坐标

C++用opengl绘制出的二维坐标,简单明了,很容易理解,并且各个部分均有注释

Qt学习:使用OpenGL绘制3D图形

OpenGL是一个跨平台的、用来渲染3D图形的标准API,Qt对OpenGL提供了强大的支持。Qt4时代的QtOpenGL模块在Qt5中已经不再建议使用,OpenGL相关的类被移到了QtGUI模块。QtWidgets模块中的QOpenGLWidget类提供了一个可以渲染OpenGL图形的部件,通过该部件可以轻松地将OpenGL图形整合到Qt应用程序中。

XCJandLL的博客 5149

STM32F103C8T6实战指南:从零搭建最小系统与GPIO控制

本文详细介绍了STM32F103C8T6微控制器的实战应用,从零开始讲解如何搭建最小系统并进行GPIO控制。内容涵盖电源电路设计、时钟配置、GPIO工作模式详解及实战项目开发,帮助初学者快速掌握这款ARM Cortex-M3内核微控制器的核心开发技能,适用于物联网设备和嵌入式系统开发。

lemon的博客 632

SigFit实战:从FEA到光学仿真的热力耦合分析全流程解析

在光机系统与芯片封装等精密工程领域,热与力的耦合效应是影响产品性能与可靠性的核心物理问题。有限元分析(FEA)是预测结构在热、力载荷下变形与应力的基础工具,但其结果通常无法直接用于评估光学性能。这需要一座桥梁,将物理场数据转化为光学设计语言。其核心原理在于数据映射与面形表征技术,例如通过泽尼克多项式拟合,将离散的节点位移分解为离焦、像散等标准光学像差。这项技术的工程价值在于,它实现了多物理场仿真的闭环,使工程师能在设计阶段精准预测热变形或应力对波前误差、调制传递函数等关键光学指标的影响。其典型应用场景包括高

weixin_28630185的博客 338

OpenGL绘图初识总结与简单操作——画线与设置透明度

OpenGL绘图初识总结与简单操作——画线与设置透明度

weixin_46568899的博客 3237

服务器AutoDL自己部署QWen3

说明:核心参数:30B 模型原精度权重文件约 60GB,单张 PRO 6000 拥有 48GB 显存,单卡塞不下原精度模型,2张 PRO 6000 = 96GB 总显存,这不仅能装下模型,还能留出约 30GB 显存给 KV Cache(上下文长度) 以及 Omni 多模态组件 处理图片/视频输入时的额外开销。1. 前提准备模型选择:直接下载到 AutoDL 服务器上=》原精度模型(BF16/FP16) 的 Qwen3-Omni-30B,选择的示例和环境如下。# 3. 正式执行模型下载。

xiaoxiao_00001的博客 414

新手在OpenGL项目里集成【imgui、implot】

背景:想在自己的cpp项目里添加ui界面,调研发现有一个平台无关的轻量级的图形界面库ImGUI。没有任何第三方依赖,可以将ImGUI的源码直接加到项目中使用。介绍不多说了,这里给一个无脑上手的流程。

Xixixihohoho的博客 2927

Arduino安装图文教程:小白也能轻松上手

手把手带你完成Arduino安装全过程,无论你是编程新手还是硬件小白,都能快速搭建开发环境。结合arduino安装教程与实操步骤,避开常见错误,让创作即刻启程。

weixin_35509395的博客 1107

动态掩码语言模型(MLM)优化策略:效率提升与最新技术实践

本文深入探讨了动态掩码语言模型(MLM)的优化策略与技术实践,涵盖核心原理、效率优化及2025年最新突破。重点解析了动态掩码在提升模型性能中的关键作用,包括工程实现、掩码策略演进及混合专家动态掩码等创新技术,为自然语言处理领域的研究与应用提供实用指南。

vscode5coder的博客 220

OpenGL基本概念入门2——使用OpenGL绘图

<br /><br />1 绘制之前的必要工作<br />1.1 设置窗体的视见区域 (View Port)<br />glViewPort(x:GLInt;y:GLInt;Width:GLSizei;Height:GLSizei);<br />    其中,参数X,Y指定了视见区域的左下角在窗口中的位置,一般情况下为(0,0),Width和Height指定了视见区域的宽度和高度。注意OpenGL使用的窗口坐标和WindowsGDI使用的窗口坐标是不一样的。<br /><br /><br />Windows

因为了解所以无知 2007

unitree-G1外接 USB 麦克风完整配置指南

首先,将type-c麦克风插入G1机器人的USB口后,记录下USB麦克风的卡号(card)和设备号(device),通常显示为 card 1: Device [USB Audio Device]

m0_47999117的博客 598

Cocos2dx下 基本的OpenGL ES 绘图

void GLFirstLayer::draw() { // CCLayer::draw(); //顶点数据 static GLfloat vertex[] = { 0,0,0, 200,0,0, 0,200,0, 200,200,0 }; //纹理坐标 st

ym19860303的专栏 7962

Xilinx FPGA平台DDR3设计保姆式教程(3)MIG IP核使用教程及DDR读写时序

干货来了,用DDR搬砖,只需要会用IP就好,Xilinx官方YYDS! ----------------------------------------------------------------------------------------------------------------- 汇总篇: Xilinx平台DDR3设计保姆式教程(汇总篇)——看这一篇就够了 ----------------------------------------------------------...

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 2万+

环保 HJ212协议解析

由于是做环保相关的,有时需要对212协议进行拆包和解包。HJ212协议是一种字符串协议,数据传输通讯包主要由包头、数据段长度、数据段、CRC校验、包尾组成,其中“数据段”内容包括请求编码、系统编码、命令编码、密码、设备唯一标识、总包数、包号、指令参数。请求编码为请求的时间戳,系统编码ST统一规定为22,命令编码CN为该数据包的时间类型,访问密码、设备唯一标识在对接时由平台提供,指令参数为数据内容。通讯协议的数据结构如图4所示。 图4 通讯协议的数据结构 6.1.1通讯包结构组成 名称 类型 长度

ccf19881030的专栏 2万+

opengl基本绘图绘制

<br /><br />1.点绘制<br />OpenGL提供了一系列函数。它们都以glVertex开头,后面跟一个数字和1~2个字母。例如:<br />glVertex2d(x,y)<br />glVertex2f(x,y)<br />glVertex3f(x,y,z)<br />glVertex3fv(GLfloat *p)<br />数字表示参数的个数:<br />2表示有两个参数,3表示三个;<br />字母表示参数的类型:<br />i表示32位整数(OpenGL中将这个类型定义为GLint和GL

dqmengxiang的专栏 1298

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

计算机图形学——实验一 VS+OpenGL绘图环境及基本图形绘制

VS+OpenGL绘图环境及基本图形绘制 1、 熟悉OpenGL的主要功能; 2、 掌握OpenGL的绘图流程和原理; 3、 掌握OpenGL核心函数的使用; 4、 熟悉OpenGL基本图形元素的绘制函数。 二. 实验内容 1、 如预备知识所述,创建一个OpenGL工程,修改第一个程序中的Display()函数,如下: 该程序是在窗口中画两条线,分别用黄色和红色绘制。如上所述,OpenGL是一个状态机,glBegin(UINT State)可以设定如下状态: GL_POINTS 画点 GL_LINES 画线

加载中....... 6021

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Android OpenGL ES 简明开发教程三 3D绘图基本概念

Android OpenGL ES 简明开发教程三 3D绘图基本概念

qq_43685118的博客 439

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Android OpenGL ES 简明开发教程三:3D绘图基本概念

前面介绍了使用Android 编写OpenGL ES应用的程序框架,本篇介绍3D绘图的一些基本构成要素,最终将实现一个多边形的绘制。 一个3D图形通常是由一些小的基本元素(顶点,边,面,多边形)构成,每个基本元素都可以单独来操作。 Vertex (顶点) 顶点是3D建模时用到的最小构成元素,顶点定义为两条或是多条边交会的地方。在3D模型中一个顶点可以为多条边,面或是多边形所共享。一个顶点也可...

Red风信子的博客 313

Android OpenGL ES 绘图基本概念

3D 绘图基本概念

风狂的猴子的博客 437

OpenGL ES: (3) EGL、EGL绘图的基本步骤、EGLSurface、ANativeWindow

1. EGL概述 EGL 是 OpenGL ES 渲染 API 和本地窗口系统(native platform window system)之间的一个中间接口层,它主要由系统制造商实现。 EGL提供如下机制: 与设备的原生窗口系统通信 查询绘图表面的可用类型和配置 创建绘图表面 在OpenGL ES 和其他图形渲染API之间同步渲染 管理纹理贴图等渲染资源 为了让...

weixin_30501857的博客 1152
上一篇: Linux下openGL编程
下一篇: 第一个opengl程序
Aiden@semidrive
博客等级 码龄14年 110粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值