1. 程式人生 > >vins-mobile程式碼解析3:drawAR

vins-mobile程式碼解析3:drawAR

AR功能主要流程是:先檢測平面,然後計算AR物體(box)的各個頂點3d位置,然後寫程式把每個頂點投影到相平面,用cv的多邊形填充功能來繪製到照片上面。

  • 先求一個相機朝向的vector:w_cam_z
  • findGround

    • 輸入數當前滑窗中所有的3d點

    • 把所有點按照高度劃分為30層

    • 取出點最多的那一層作為平面

  • drawGround

    • 只有在平面中的點數大於28的時候才畫地面

    • 先把所有點投影到相平面

    • 用2d的Delaunay生成這些點的3角格子

    • 把每條邊都畫到照片上

  • drawBox

    • 把所有box手動投影到相平面,然後手動多邊形填充

    • Grounds其實是所有box的集合不是平面的

  • 相應對box的平移操作

    • 檢查locationX和locationX_p是否一樣

      • locationX在pan的回撥函式中會被修改

      • 不一樣說明使用者出發了平移box事件

    • 檢查點選的事哪個box

      • 把所有box的中心投影到相平面

      • 看相平面的中心和點選位置哪個最近

      • 通過螢幕上移動的距離計算對應的投影射線的旋轉夾角,最後計算3d空間中的移動距離

      • 移動選中的box

  • 處理抓取操作進行的縮放

  • 雙手指的旋轉

  • 點選的新增新的box,條件是平面點要大於28

    • 投影平面中心點到相平面

    • 看是否附近有box,沒有的話才進行下一步

    • 把box放到當前平面上

      • findPlane

        • 輸入平面的點

        • 輸出擬合的平面方程的4個係數

    • 盒子屬性

      • ori :盒子的一個角點

      • gp.cox,gp.coy,gp.coz :盒子三個方向的邊的另外一個端點的座標

      • lix,liy,liz:盒子三個軸的方向,代表盒子的朝向

  • 長按後標識被按住盒子