問題:做了乙個觸控螢幕上的三維模型的縮放功能,發現在對模型進行縮放的時候模型的位置會有偏差。
解決方法:
問了王大大之後,再查了一下資料,記錄於此。
在osg中進行變換容易出現問題的原因
1、基本變換是預設以世界座標為變換中心的
2、我們所期望的變換是以物體為變換中心
因此,每次變換時,需要將變換中心和物體中心重合,這樣才能得到我們想要的結果。
變換前先將物體平移至世界座標的原點,實施變換之後再將物體進行反平移。
picked->setmatrix(originpos* osg::matrix::translate(-center)//先將物體中心平移到世界座標的原點
*osg::matrix::scale(0.95, 0.95, 0.95)//縮放
*osg::matrix::translate(center));//變換後再將物體移回
// last_distance = distance;
originpos = picked->getmatrix();
center = picked->getbound().center();
step1:獲取變換物體表面頂點矩陣
originpos = picked -> getmatrix();
step2 獲得變換物體的包圍盒,從而獲得物體的中心
center = picked->getbound().center();
step3:將物體中心平移到世界座標原點
這裡定義的平移矩陣就是osg::matrix::translate(-center)
originpos* osg::matrix::translate(-center)
step4:進行變換級聯
這裡我只做了縮放也就是scale,設定縮放矩陣。如果要同時進行平移旋轉縮放操作的話,注意按照先縮放後旋轉再平移的順序。
originpos* osg::matrix::translate(-center)*osg::matrix::scale(0.95, 0.95, 0.95)
step5 :變換後再將物體移回
這裡定義的平移矩陣就是osg::matrix::translate(center)
originpos* osg::matrix::translate(-center)*osg::matrix::scale(0.95, 0.95, 0.95)*osg::matrix::translate(center)
這樣子物體的變換就沒有什麼毛病了。
OSG學習筆記19 再看pick點選物體
之前一直使用的pick方法就是將第乙個點選到的節點儲存下來,如果場景中只有乙個物體,當然是沒有問題的。當場景中出現多個物體,並且每個物體設定了標籤,是可以被修改還是不能被修改,當兩個物體重合的時候就不能得到正確的結果。正確的做法是 用迭代器遍歷所有獲取到的節點並再遍歷nodepath,找到需要的節點...
OpenCV學習筆記 物體追蹤
讀取影象,獲得bgr格式的畫素值,然後轉換成hsv格式,再利用inrange函式進行顏色分離,標記出來 hsv的色彩取值範圍 h hue通道,色調,顏色種類 s saturation 飽和度,顏色濃淡 v value 明度,顏色明亮度 inrange函式 inrange src,lowerb,upp...
OSG學習筆記15 OSG中對事件的處理
看了王銳大大的書,我感覺osg中對事件的處理主要是由以下幾塊組成的 1 事件介面卡 guieventadapter 這個類是作為系統互動事件和osg互動事件的適配介面。這一句話還不是很理解。原始碼文件裡對於這個類的定義是 事件類,儲存鍵盤 滑鼠和視窗事件。公有型別包括 這些型別都是列舉型別,每個型別...