[QOpenGLWidget+QMouseEvent]实时绘制长方形

复现moho-打卡第1天 - 20240402

1.1--QOpenGLWidget中显示长方形

实现方法:顶点着色器中给定长方形的四个顶点数据,代码如下:

复制代码
// 顶点位置
GLfloat vertics[1][4][3] = {
{{mousePressPosX,mousePressPosY,0.0},{mousePressPosX,mouseMovePosY,0.0},{mouseMovePosX,mouseMovePosY,0.0},{mouseMovePosX,mousePressPosY,0.0}},
};

1.2--实时绘制长方形

实现方法:通过QMouseEvent事件中的mouseMoveEvent实时更新长方形的四个顶点数据,代码如下:

复制代码
void YOpenGLWidget::mouseMoveEvent(QMouseEvent *event)
{
    update();
    mouseMovePosX = event->x();mouseMovePosY = event->y();
    QOpenGLWidget::mouseMoveEvent(event);
}

1.3--长方形贴图

实现方法:通过QOpenGLTexture设置图片,并绑定至长方形上,代码如下:

复制代码
// 绘制形状
for(int i = 0; i<2; i++)
{
    texture[i]->bind();
    glDrawArrays(GL_TRIANGLE_FAN,i*4,4);
}

综上,绘制效果如下:

Q1--QOpenGLWidget的QMouseEvent的event->pos()为平面坐标,不是openGL中的空间坐标,导致绘制的长方形与鼠标实际勾画的长方形不一致,如何解决?

① 是否与平面坐标和空间坐标的映射有关?

② 是否与相机空间、透视关系有关?

今日分析得到该问题解决要点:

① 从绘制定义上,顶点逆时针绘制为正面;

② 相机原始方向为朝向z轴负方向;

③ OpenGL采用右手坐标系;

④ QWidget中x轴正向朝右,y轴正向朝下;

⑤ 空间点转换至相机空间需要进行2步变换:1)平移负的相机位移;2)旋转负的相机欧拉角;

待解决:

① 平面坐标转换至空间坐标。

相关推荐
大白的编程日记.1 小时前
【计算机基础理论知识】C++篇(二)
开发语言·c++·学习
C语言小火车1 小时前
野指针:C/C++内存管理的“幽灵陷阱”与系统化规避策略
c语言·c++·学习·指针
凤年徐1 小时前
【数据结构】时间复杂度和空间复杂度
c语言·数据结构·c++·笔记·算法
TechNomad1 小时前
Qt开发:QtConcurrent介绍和使用
qt
踏莎行hyx2 小时前
使用langchain连接llama.cpp部署的本地deepseek大模型开发简单的LLM应用
c++·ai·langchain·大模型·llama.cpp·deepseek
山河木马2 小时前
前端学C++可太简单了:双冒号 :: 操作符
前端·javascript·c++
乌萨奇也要立志学C++2 小时前
【C++详解】STL-list模拟实现(深度剖析list迭代器,类模板未实例化取嵌套类型问题)
c++·list
闻缺陷则喜何志丹3 小时前
【前缀和 BFS 并集查找】P3127 [USACO15OPEN] Trapped in the Haybales G|省选-
数据结构·c++·前缀和·宽度优先·洛谷·并集查找
序属秋秋秋4 小时前
《C++初阶之内存管理》【内存分布 + operator new/delete + 定位new】
开发语言·c++·笔记·学习
十秒耿直拆包选手12 小时前
Qt:主窗体(QMainwindow)初始化注意事项
c++·qt