首页
学习
活动
专区
工具
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模式将其绘制出来。

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

相关·内容

  • Qt编写地图综合应用7-百度离线地图

    离线地图的核心其实就是拿到这些瓦片地图文件,并不是离线地图的代码怎么写,其实离线地图的网页代码和在线地图的网页代码几乎一致的,主要就是将对应的依赖的js文件从在线的地址改成本地的地址,然后可能多几个特殊的js文件用来本地交互,离线地图完全具备在线地图的大部分功能,离线地图有个好处就是可以离线使用,根本不需要联网,而且也不需要什么秘钥,你只要搞到那些瓦片地图文件就随便你怎么摩擦了。其实在线地图也是通过读取服务器上的离线地图文件加载到网页中的,你在快速的缩放和拖动地图的时候可以看到缝隙和空白,估计此刻就是在从服务器拉取瓦片地图文件来加载,而且这个服务器上的瓦片地图永远是最新的最完整的。

    02

    Qt编写安防视频监控系统27-GPU显示

    之前用ffmpeg解码的时候,已经做了硬解码的处理,比如支持qsv、dxva2、d3d11va等方式进行硬解码处理,但是当时解码出来以后,还是重新转成了QImage来绘制,这样就大打折扣了,尽管可以看到GPU使用率有了,但是依然耗时的操作还是在CPU绘制显示,这就显得很尴尬了,Qt封装了大部分的opengl的操作,直接做成了QOPenGLWidget,既支持ffmpeg解码出来的yuyv格式的数据显示,还支持硬解码出来的nv12格式的数据显示,很好很强大,这样的话就大大减轻了CPU的压力,专门交给GPU绘制,经过这么一番彻底的改造,效率提升至少5倍,不要太牛逼!如果开启了opengl绘制,则对应内存会增加不少,可能opengl绘制需要开辟很多的内存来交换数据吧。

    00
    领券