You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用FreeGLUT实现多点触控追踪?求示例与实现流程

在FreeGLUT中实现多点触控追踪

实现方法

FreeGLUT扩展了GLUT的输入处理能力,提供了专门的多输入回调函数来支持多点触控/多鼠标追踪,替代原有的单点鼠标函数:

  • glutMultiButtonFunc():处理多点的按下/释放事件,回调会传入设备ID用于区分不同触摸点
  • glutMultiMotionFunc():处理多点的移动事件
  • glutMultiEntryFunc():处理多点的进入/离开窗口事件

通过设备ID为每个触摸点维护独立的状态(位置、按压状态等),即可实现多点追踪。

示例代码与实现流程

实现流程

  1. 初始化FreeGLUT窗口后,注册上述多输入回调函数,替换原有的单点鼠标回调。
  2. 用哈希表或数组存储每个触摸点的状态,以设备ID作为标识键。
  3. 在渲染函数中,遍历存储的触摸点状态,绘制可视化标记展示当前所有活跃触摸点。

示例代码

#include <GL/freeglut.h>
#include <unordered_map>

// 存储触摸点状态:key为设备ID,value包含坐标与按压状态
struct TouchPoint {
    int x, y;
    bool isPressed;
};
std::unordered_map<int, TouchPoint> touchPoints;

// 多按钮回调:处理触摸按下/释放
void multiButtonCallback(int deviceID, int button, int state, int x, int y) {
    if (button == GLUT_LEFT_BUTTON) { // 映射触摸操作到左键事件
        touchPoints[deviceID].x = x;
        touchPoints[deviceID].y = y;
        touchPoints[deviceID].isPressed = (state == GLUT_DOWN);
        // 触摸释放时移除对应点记录
        if (state == GLUT_UP) {
            touchPoints.erase(deviceID);
        }
        glutPostRedisplay();
    }
}

// 多移动回调:处理触摸位置更新
void multiMotionCallback(int deviceID, int x, int y) {
    auto it = touchPoints.find(deviceID);
    if (it != touchPoints.end()) {
        it->second.x = x;
        it->second.y = y;
        glutPostRedisplay();
    }
}

// 渲染函数:绘制所有活跃触摸点
void display() {
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0f, 0.0f, 0.0f);
    glPointSize(20.0f);

    glBegin(GL_POINTS);
    for (const auto& pair : touchPoints) {
        const TouchPoint& tp = pair.second;
        // 转换窗口坐标为OpenGL坐标(窗口Y轴向上,OpenGL默认Y轴向下)
        glVertex2i(tp.x, glutGet(GLUT_WINDOW_HEIGHT) - tp.y);
    }
    glEnd();

    glutSwapBuffers();
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(800, 600);
    glutCreateWindow("FreeGLUT Multi-Touch Tracking");

    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, glutGet(GLUT_WINDOW_WIDTH), 0, glutGet(GLUT_WINDOW_HEIGHT));

    // 注册多输入回调函数
    glutMultiButtonFunc(multiButtonCallback);
    glutMultiMotionFunc(multiMotionCallback);
    glutDisplayFunc(display);

    glutMainLoop();
    return 0;
}

代码说明

  • touchPoints哈希表通过设备ID区分不同触摸点,存储每个点的实时状态。
  • 触摸按下时记录位置与状态,释放时移除对应记录,确保只保留活跃触摸点。
  • 渲染阶段将窗口坐标转换为OpenGL标准坐标,绘制红色大圆点直观展示触摸位置。

内容的提问来源于stack exchange,提问作者sac7160

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:15:47