首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在openGL中用鼠标绘制

在OpenGL中,使用鼠标绘制可以通过以下步骤实现:

  1. 初始化OpenGL窗口和鼠标事件处理器。
  2. 在鼠标点击事件处理器中,记录鼠标点击的位置,并将其转换为OpenGL坐标系中的位置。
  3. 在鼠标移动事件处理器中,根据鼠标当前位置和上一个点击位置,计算出绘制的线段。
  4. 在绘制线段时,可以使用OpenGL中的GL_LINE_STRIP模式,将线段逐个顶点绘制出来。
  5. 在绘制完成后,可以将绘制的线段保存为一个图形对象,以便后续进行操作。

以下是一个简单的示例代码:

代码语言:c++
复制
#include <GL/glut.h>

// 记录鼠标点击的位置
int x1 = 0, y1 = 0;
int x2 = 0, y2 = 0;

// 鼠标点击事件处理器
void mouse(int button, int state, int x, int y) {
    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
        x1 = x;
        y1 = y;
    }
}

// 鼠标移动事件处理器
void motion(int x, int y) {
    x2 = x;
    y2 = y;
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_LINE_STRIP);
    glVertex2i(x1, y1);
    glVertex2i(x2, y2);
    glEnd();
    glFlush();
}

// 初始化OpenGL窗口和鼠标事件处理器
int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(800, 600);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("OpenGL绘图");
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0, 800, 0, 600);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
    return 0;
}

这个示例代码中,我们使用了GLUT库来创建OpenGL窗口和处理鼠标事件。在鼠标点击事件处理器中,我们记录了鼠标点击的位置。在鼠标移动事件处理器中,我们根据鼠标当前位置和上一个点击位置,计算出绘制的线段,并使用GL_LINE_STRIP模式将其绘制出来。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python中用matplotlib函数绘制股票趋势图

4 绘制股票趋势图 可以把时间作为横轴,每天的收盘价或处理后的收盘价作为纵轴绘制折线图,以此当成股票趋势图。...plt.plot表示绘制图形,以date的索引列为横轴,收盘价为纵轴绘制折线图。 plt.show表示在窗口打印这个图。 具体结果如下: ?...从上图可以看出,该股股价2011年到2016年呈波动下降的趋势。2017年到2020年的股价波动幅度相较之前会小一些。 而且,明显看到有些日期的收盘价为0,这是由于股票一般工作日开盘,周末休市。...所以绘图时有些日期的收盘价被填充为0。 为了图形能更好地反映股票的波动趋势,可以人为对收盘价进行处理,比如以前多少天的平均收盘价当成当天的收盘价,以此来避免0值问题。...至此,Python中绘制股票趋势图已介绍完毕,大家可以动手练习一下

4.4K20

OpenGL】十一、OpenGL 绘制多个点 ( 绘制单个点 | 绘制多个点 )

文章目录 一、绘制单个点 二、绘制多个点 三、相关资源 在上一篇博客 【OpenGL】十、OpenGL 绘制点 ( 初始化 OpenGL 矩阵 | 设置投影矩阵 | 设置模型视图矩阵 | 绘制点 | 清除缓冲区...| 设置当前颜色值 | 设置点大小 | 绘制点 ) 中 , 讲解了绘制单个点的操作 , 本篇博客简单介绍下绘制多个点 ; 一、绘制单个点 ---- 绘制点时, 会将从 glBegin 到 glEnd...之间的所有的点都绘制出来 , 可以调用 glVertex3f 方法设置点 ; 设置了几个点 , 就会绘制几个点 , 如下代码中设置了一个点 , 那么就只绘制这一个点 ; // 绘制点时,...; // 绘制点时, 会将从 glBegin 到 glEnd 之间的所有的点都绘制出来 // 可以调用 glVertex3f 方法设置多个点 // 绘制点开始...线段 , 三角形 , 等其它元素 , 也是按照上述方法设置 ; 三、相关资源 ---- GitHub 地址 : https://github.com/han1202012/OpenGL 博客源码快照

1.1K00

OpenGL绘制地球

逛啊逛,让我找到了另一种方法,仅仅几行代码: // 画地球 void OpenGL::DrawEarth(void) ...{     GLUquadricObj *quadObj = gluNewQuadric...·gluQuadricDrawStyle函数指定二次对象的绘制方式。本例中圆柱体的绘制方式为GLU_FILL。含义为用多边形原绘制本二次对象,多边形的绘制方式为逆时针。...球体的绘制方式为GL_SILHOUETTE,即除边界外用一系列线来绘制二次对象。圆盘的绘制方式为GL_LINE,即用一系列线来绘制二次对象。...部分圆盘的绘制方式为GL_POINT,即用一系列点来绘制二次对象。   ·gluQuadricNormals,指定二次对象使用的法向量类型。   ...baseRadius圆柱体z=0时的半径。   topRadius圆柱体z=height时的半径。   height圆柱体的高。   slices围绕着z轴分片的个数。

2.8K100

OpenGL ES 绘制纹理

OpenGL ES中绘制一张图片需要使用到纹理(texture),绘制纹理步骤如下: 编写shader 绘制纹理的shader需要顶点数据、纹理顶点数据和纹理。...创建program并获取参数句柄 创建program的过程OpenGL ES for Android 环境搭建》中详细介绍,这里不在介绍,直接使用封装好的工具类,代码如下: private fun...ES的相关操作都要在GLThread线程中运行),Renderer的onSurfaceCreated回调中创建,代码如下: override fun onSurfaceCreated(p0: GL10...4个顶点的位置如下图: OpenGL ES中绘制任何形状都是通过绘制多个三角形而组成,所以我们将这4个点分为2个三角形,分布为(V1,V2,V3)和(V1,V3,V4),因此定义三角形索引数组代码如下:...表示绘制三角形。

1K20

OpenGL】九、OpenGL 绘制基础 ( OpenGL 状态机概念 | OpenGL 矩阵概念 )

绘制 3D 图形时 , 就会读取当前的状态机参数 , 利用这些状态机进行绘制 , 而我们就在绘制之前设置上述一系列的状态机 , 确保 OpenGL 绘制按照我们设想的进行 ; 在上一篇博客 【OpenGL..., 将当前的颜色值设为一个值 , 如 白色 , 开始绘制后 , 就会自动使用该颜色进行绘制 ; 稍后会使用 OpenGL 桌面窗口中绘制一个点 , 绘制前将当前颜色设置为白色 , 然后绘制的点的颜色就是白色...; 如果想要绘制不同颜色的点 , 就需要在每次绘制前 , 都修改当前颜色值 ; 整个 OpenGL 只有一个当前颜色值 ; 二、OpenGL 矩阵概念 ---- OpenGL 中的 矩阵 Matrix..., 包含了 投影 ( Projection ) 矩阵 , 模型 ( Model View ) 矩阵 , 绘制的 点 定义 世界坐标系 下 , 是一个三维的点 , 该三维的点需要将其显示到二维屏幕上..., 如果使摄像机默认位置时 , 需要将要绘制的模型放在 z 的负方向上 , 如下代码是绘制坐标点的代码 : // 设置绘制点的位置 glVertex3f(0.0f,

4K00

OpenGL 的 glDrawElements 绘制方法

之前的绘制中,我们都是通过 glDrawArrays 方法来实现的,它会按照我们传入的顶点顺序和指定的绘制方式进行绘制。...回顾一下之前提到的绘制类型: 绘制类型 绘制方式 GL_POINTS 将传入的顶点坐标作为单独的点绘制 GL_LINES 将传入的坐标作为单独线条绘制,ABCDEFG六个顶点,绘制AB、CD、EF三条线...然后再向渲染管线传递要绘制的顶点数据的索引,根据索引从顶点数据中取出对应的顶点,然后再按照指定的方式进行绘制。 如下图所示,图片截自《OpenGL ES 3.x 游戏开发上卷》: ?...20 // GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4) 函数原型中定义了要传入的参数,根据要绘制的方法和索引缓冲区,找到对应的点进行绘制...而且,定义一个顶点时,大都是 float 类型,它是四个字节,而对于绘制量比较小,顶点数量 byte 所能表达整数范围内,可以采用 byte 类型定义索引顺序,它只占一个字节,减少了内存的使用。

2.2K21

opengl-球体的绘制

球体 opengl-pbr 光照一讲里,以球体为案例进行说明。...球体的绘制第一次接触理解花了点时间 一、球体坐标分解 球体坐标分解 按照经纬度来理解,经度是y轴上的切面,维度是x-z 平面的弧度 经纬度 将y轴切分成64等分,x-z平面切分成64等分的扇形 y轴从上到下取值为...比较好理解,按照一个个三角形来绘制,每次给三个坐标。...GL_TRIANGLE_STRIP,起始三个点,后面没增加一个点就增加一个三角形 三角形绘制模式 为保证所有三角形绘制都遵循顺时针原则(剔除中用到),要求当前增加的点角标为奇数:绘制顺序T=[n-1,...n-2, n] 为偶数:绘制顺序T=[n-2, n-1, n] 参考下图,自己拿笔画一画就明白了 绘制顺序 绘制球体的其他代码就很好理解了不一一说明 unsigned int sphereVAO =

3.7K10

OpenGL 系列---基础绘制流程

Android 上使用的是 OpenGL ES,它是 OpenGL 的子集, OpenGL 的基础之上裁剪掉了一些非必要的部分,主要是针对手机、PAD 和游戏主机等嵌入式设备设计的。...OpenGL绘制流程 学习 OpenGL绘制,最好还是先从 2D 绘制开始,逐渐过渡到 3D 绘制。...Android 为 OpenGL绘制提供了一个特定的视图GLSurfaceView,就像 SurfaceView 一样,它渲染绘制也可以一个单独的线程中,而非主线程,毕竟 GLSurfaceView...onDrawFrame 每一帧绘制时被调用。 实现渲染器程序时,首先要考虑三个问题: 什么地方进行绘制绘制成什么形状? 用什么颜色来绘制?...由于我们要绘制的是一个点,坐标系中,一个坐标就可以代替一个点了。假设要绘制一个三角形,那么坐标系中就需要三个点才行了。 接下来就涉及到 OpenGL 如何把定义的点的数据绘制出来了。

1.7K40

OpenGl 实现鼠标分别移动多个物体

一.鼠标控制函数准备 我们需要对鼠标信息的获取,那么必然需要一个鼠标事件的响应函数来控制,很好opengl已经有内部的鼠标控制函数了,我们直接拿来使用就行了。...gult库没有定义,那么就是版本比较老的缘故,不想麻烦下新版本或者下了新版本还是没有解决的话就直接像这样定义文件头部: #define  GLUT_WHEEL_UP 3           //定义滚轮操作...然后将移动后改变的移动法向量,让程序调用窗口重新绘制一次即可。如果出现闪烁问题,可以使用双缓冲。...项目完整代码,配置好Opengl环境可以直接运行,更多项目分享以及学习教程,请关注在下!!!!...: #include #include // 绘制立方体 // 将立方体的八个顶点保存到一个数组里面 static GLfloat vertex_list

2.6K20

OpenGL】十八、OpenGL 绘制多边形 ( 绘制 GL_POLYGON 模式多边形 )

文章目录 一、绘制 GL_POLYGON 模式多边形 二、多边形绘制顺序分析 三、相关资源 一、绘制 GL_POLYGON 模式多边形 ---- 使用 glBegin(GL_POLYGON) 设置绘制多边形...(GL_POINTS); // 绘制点 //glBegin(GL_LINES); // 绘制线 //glBegin(GL_LINE_STRIP);// 绘制前后连接的点组成的线...//glBegin(GL_TRIANGLE_STRIP); // 绘制 GL_TRIANGLE_STRIP 三角形 //glBegin(GL_TRIANGLE_FAN); // 绘制三角形扇...glEnd(); // 将后缓冲区绘制到前台 SwapBuffers(dc); } 绘制效果 : 二、多边形绘制顺序分析 ---- glBegin 和 glEnd 之间设置了...glEnd(); 三、相关资源 ---- GitHub 地址 : https://github.com/han1202012/OpenGL ( GitHub 源码始终都会随着后续博客的进度更新覆盖

2.9K00

Shader 优化 | OpenGL 绘制网格效果

Shader 讲解 我的 Shader 代码中是这样绘制网格的: vec2 fragcoord = vec2(gl_FragCoord.xy / u_resolution); vec3...由于 fragcoord 归一化有了确定的值域范围,所以可以 for 循环中将它十等分。...总结对比 第二种绘制中,由于做了比例转换操作,所以绘制出来的网格大小都是一致的,且都是正方形。 而第一种没有比例切换操作,当宽高不同的情况下,同样进行十等分的话,画出来的网格是个长方形了。...但是,两种绘制的思路都是相同的,姑且称它为 接近法 吧,当绘制的像素接近等分线时,就显示不一样的颜色。 于是,等分线的操作思路就各有不同了。...前者是利用 for 循环来制造划分,后者则是利用当前像素的 x、y 值的特点来绘制的。 当然更推崇后者的绘制方式了,也是学到了新技巧~~~

1.6K30

IOS – OpenGL ES 绘制线条 GPUImageLineGenerator

: OpenGL (ES) 学习目录 >> OpenGL ES 转场 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 特效 零基础 OpenGL...ES 绘制线条 GPUImageLineGenerator //@Time:2022/04/18 07:30 //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累...{ gl_FragColor = vec4(lineColor, 1.0); } ); #endif 二.效果演示 使用GPUImageLineGenerator 通过 GL_LINES 绘制线条...GL_LINES:是将传入的顶点,依次两两配对组成线段进行绘制,若顶点数为奇数,则将最后一个给忽略掉....使用 GL_LINES 绘制三角形,效果图: 三.源码下载 OpenGL ES Demo 下载地址 : IOS – OpenGL ES 绘制线条 GPUImageLineGenerator

47740

OpenGL】十二、OpenGL 绘制线段 ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 )

) 六、绘制圈 GL_LINE_LOOP ( 奇数个点 ) 七、绘制彩色的线 八、相关资源 一、设置线宽度 ---- 线的绘制宽度是 OpenGL 状态机中的一个值 , 通过 glLineWidth..., 最后一个点会被舍弃 ; 三、绘制多条线段 GL_LINES ---- 绘制线段时 , glBegin(GL_LINES) 方法传入的参数是 GL_LINES ; glBegin(GL_LINES...) 和 glEnd() 之间设置的点 , 会被自动当做线的两个端点 , 如果设置 4 个点 , OpenGL 会按照顺序 , 从上到下 , 两两组合成一条线段 ; 如在上述 glBegin 和 glEnd...偶数个点 ) ---- 绘制圈时 , glBegin 中传入 GL_LINE_LOOP 参数 , 绘制时会将 glBegin 和 glEnd 之间的点连线 , 并且最后一个点会和第一个点连在一起 ,...绘制每个点之前 , 都设置当前的颜色值 , 即 OpenGL 状态机中的当前颜色值 , 第一个点 glVertex3f(0.0f, 0.0f, -10.0f) , 绘制前设置的是 白色 , 第二个点

4.3K00

如何绘制完美的鼠标轨迹

动机 公司的某次周会上,我吐槽了某产品中一个显示鼠标轨迹的效果实现得比较抽象: 可以看到它的实现方式是将 mousemove 事件触发时的坐标,用长宽不一的矩形连接起来,所以连接处出现了明显的“断裂...问题 所谓「并没有想象的那么简单」主要是要解决这几个问题: 通过 mousemove 事件获取的鼠标轨迹是离散的坐标点,而不是真实的轨迹曲线,如何通过离散坐标绘制平滑曲线?...鼠标轨迹的粗细也应该是渐变的,web canvas 上的单一 path 也没有提供画笔粗细渐变的接口,这个效果又如何实现? 方案 如何通过离散坐标绘制平滑曲线?...如下图,鼠标经过 A、B、C 三点,此时 B 点和他的两个控制点 C1 和 C2 同一直线上,整个曲线 B 点处就是平滑的。...也就是说,如果有一段曲线绘制时需要将画笔透明图从 1 变为 0,我们就把这条曲线分割成 100 个曲线片段依次绘制,并且绘制这些片段时所用的透明度逐渐变化,这样就可以视觉上实现透明度渐变的效果了。

1.8K10

OpenGL ES for Android 绘制旋转的地球

No 图 No Code,上面旋转的地球是不是很酷炫,下面就让我们开始说说如何绘制旋转地球吧?绘制旋转地球需要3个步骤: 计算球体顶点数据。 地球纹理贴图。 通过MVP矩阵旋转地球。...计算球体顶点数据 我们知道OpenGL中最基本的图元是三角形,任何复杂的图形都可以分解为一个个的三角形,球体也不例外,假设球体上有“经纬度”,通过“经纬度”将球体分割为一个个的四边形,如下图: ?...把这些四边形分割为2个三角形,所以绘制球体的关键是计算“经纬度”相交的点的坐标。...最难的顶点坐标和纹理坐标已经获取,下面开始介绍如何绘制地球。...R.drawable.earth) textureId = GLTools.loadTexture(bitmap) } GLTools.loadTexture为封装的工具类方法,OpenGL

1.5K20

OpenGL 学习系列---基本形状的绘制

之前的一篇博客中,讲述了 OpenGL 基础绘制流程 及相关的代码,其中关于 OpenGL 程序编译部分都是可以在其他项目中接着复用的,接下来会讲到如何去绘制其他的基本图元。...那么问题来了,OpenGL 到底为我们提供哪些绘制方式呢?如下表所示: ? 绘制圆形 现在我们要绘制一个圆形,显然 OpenGL 是没有提供圆形的绘制类型的,这就要用到上面提供的绘制方式了。...圆形的顶点数据也分为了三部分了,以原心作为我们的中心点,中间的 360 个点用来绘制三角形,最后一个点使得我们的图形闭合。 绘制时依旧使用三角形扇的形式来绘制。...这样就完成一个圆形的绘制。 正多边形的绘制 绘制圆形的基础上,我们还可以进行拓展一下。...展示一些绘制图如下: 正五边形: ? 正六边形: ? 正七边形: ? 小结 到此,基本讲述了 OpenGL绘制流程以及基本图形的绘制

1.8K40

OpenGLOpenGL移动端的应用

OpenGL移动端的表现形式为OpenGLES,OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计...接下来我们从openGL移动端的应用为入口,探一探它的奥秘。(以iOS平台为例) 一.用openGLES绘制图形的基本流程 1.UIView,要展示图形,还是需要基本的承载视图,UIView ?...,EAGLContext对象是管理OpenGL ES渲染上下文,若想使用OpenGL ES 进行绘制工作,则必须一个上下文对象....二.坐标系统 开始绘制图形之前,我们必须先给OpenGL输入一些顶点数据。OpenGL是一个3D图形库,所以我们OpenGL中指定的所有坐标都是3D坐标(x、y和z)。...五.绘制 OpenGL ES可绘制的基本图元是点、线和三角形,如下我们分析一段绘制的代码(代码已经过处理): -(void)render { [EAGLContext setCurrentContext

2.6K30
领券