添加捕捉吸附标识(使用QT+OpenGL开发三维CAD)
捕捉吸附标识怎么画出来?在点吸附的时候能够展示吸附标识可以让用户更直观的看到当前捕捉点,从而更准确的进行设计和绘制。
效果视频见原文:添加捕捉吸附标识(使用QT+OpenGL开发三维CAD)
16.Add snap label
鼠标捕捉吸附标识
主要作用是提高用户在使用鼠标时的操作效率和准确性。当鼠标移动到某个特定区域时,捕捉吸附标识会触发鼠标的吸附功能,使得鼠标指针能够自动吸附到该区域,从而减少移动距离和操作时间,能够显著提升用户的操作体验和效率。
我们把此功能的实现归类到DrawingViewerElemHolder
中,我们来看下实现后其public函数的调用逻辑。

好像没有增加接口,没有看错?画错?设计错吧?是的,snapLabel
的配置、绘制过程放在了已有的setup
、drawViewElement
中,并没有对外新增接口,而内部的修改如下,
-
新增:
setupSnap
private函数,负责snapLabel
的配置,完成其数据到渲染桥梁的搭建; -
扩展:
drawViewElement
函数,使其能够兼容绘制没有纹理贴图的viewer元素,如snapLabel
; -
扩展:
ViewerCache
类,增加字段; -
扩展:在
GLView.paintGL
中调用绘制,代码如下;
// snap label
if (ViewerSetting::previewData.previewNextPt)
{QMatrix4x4 modelSnap;modelSnap.translate(m_modelMatrix * QVector3D(ViewerSetting::previewData.previewNextPt->X, ViewerSetting::previewData.previewNextPt->Y, ViewerSetting::previewData.previewNextPt->Z));//modelSnap = m_modelMatrix * modelSnap;m_lightShader.setUniformValue("model", modelSnap);m_model->DrawViewElement(m_lightShader, ViewerCache::snapLabel);
}
可以看到我们没有做太多的改动即实现了snapLabel
的绘制,也没有在DrawingViewerElemHolder
中新增字段,其构建好的绘制数据放在了已有的map<string, MeshInfo> mapName2VMesh
中;
尽管如此,我们还是做了关键的事情的,比如setupSnap
,构建了一个只有圆形边框的mesh,这个也就是显示出来的效果,详细请查看函数实现~
如果一切正常,或者遇到的问题被排查解决,那么鼠标捕捉吸附效果和下图很像。

专注于图形学(渲染和几何算法)、数据处理、并行计算相关研究和研发,欢迎交流~
学习!《从零开发一款三维CAD软件(OpenGL/QT/C++)》课程上线啦
系列课程已上线,详细的视频讲解,打下扎实的图形学基础,欢迎大家观看和支持~
往期文章:
-
学习!《从零开发一款三维CAD软件(OpenGL/QT/C++)》课程上线啦
-
OpenGL模板缓冲:实现亮显外轮廓效果
-
30.抗锯齿(anti aliasing):使用OpenGL+QT开发三维CAD
-
MSAA抗锯齿技术的不足和优化(PPAA)
-
相机:Camera原理讲解(使用OpenGL+QT开发三维CAD)
-
开发三维CAD:实现框选和反选功能
-
视图立方体:ViewCube的绘制(使用OpenGL+QT开发三维CAD)
-
相机:以鼠标点为中心缩放(使用OpenGL+QT开发三维CAD)
-
添加旋转中心标识(使用OpenGL+QT开发三维CAD)
-
构件选中效果:通过自定义帧缓冲实现(使用OpenGL+QT开发三维CAD)
-
通过交互绘制图片(使用OpenGL+QT开发三维CAD)
-
撤销和重做!支持数据驱动的事务机制啦(使用OpenGL+QT开发三维CAD)
-
实现复制和预览:(使用OpenGL+QT开发三维CAD)
-
支持编辑!让三维CAD内涵逐渐饱满,一起开发三维CAD