OSG學習筆記17 正確設定物體的縮放矩陣

2021-07-27 19:32:08 字數 1286 閱讀 1415

問題:做了乙個觸控螢幕上的三維模型的縮放功能,發現在對模型進行縮放的時候模型的位置會有偏差。

解決方法:

問了王大大之後,再查了一下資料,記錄於此。

在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互動事件的適配介面。這一句話還不是很理解。原始碼文件裡對於這個類的定義是 事件類,儲存鍵盤 滑鼠和視窗事件。公有型別包括 這些型別都是列舉型別,每個型別...