捕捉吸附標識怎么畫出來?在點吸附的時候能夠展示吸附標識可以讓用戶更直觀的看到當前捕捉點,從而更準確的進行設計和繪制。
效果視頻見原文:添加捕捉吸附標識(使用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