opengl下縮放與拖動的問題記錄

2021-07-03 16:58:17 字數 1549 閱讀 6502

1.在設計地圖的縮放與拖動時,發生了若縮放1/2

後,拖動地圖時,滑鼠移動的距離是實際移動的位移的

1/2。 究其原因,在於

gltranslate

函式的呼叫位置。

拖動的實現如下:將拖動前後滑鼠的螢幕座標轉換為世界座標,計算位移x

後,呼叫

gltranslate

函式移動

x位移。

先有如下討論(1):

又因為縮放與拖動操作的對應性:如果先縮放地圖,後拖動地圖。由於opengl

命令與實際操作反序,因此應該先執行拖動,後執行縮放。 但是因為縮放與拖動可在任意時間點觸發,因此無法知道地圖操作的具體順序。 因此採用在

modelview

矩陣的按相同的順序左乘操作命令即可(

opengl

命令與操作反序的原因是

opengl

是將當前矩陣右乘操作矩陣),且操

modelview

矩陣的當前矩陣僅僅為若干地圖操作的結果,不包含任何其他變化。(若有檢視矩陣變化部分,則將該變化放到投影矩陣裡吧。 

opengl

渲染的結果

=投影矩陣

*檢視模型矩陣

*座標點)。

根據討論(1)

,該解決方案在面對先縮放

1/2,再拖動地圖,處理流程相當於:

glunproject()

gltranslate()

glscale(

1/2);

model()

; //

在區域性座標系下,或者說經過變換前的世界座標系下繪製模型

出現問題的原因在於glunproject

。glunproject

返回的座標是

model

層次上的座標,即未經過任何變化的世界座標系。而拖動地圖時,拖動的是經過縮放的座標系。  這樣,利用縮放前的距離去拖動縮放後的地圖,就會導致本該移動

1m(縮放前的世界座標系下的

1m)最後成了縮放後移動

1m,即相當於縮放前

2m的距離。

將modelview

矩陣的結構改為:

[縮放n*縮放

n-1。。。*縮放

*縮放1]*當期矩陣*[

拖動m*

。。。拖動1]。

即 縮放與拖動分為兩部分乘,其中每個集合內部都是逆序的。

假設當前矩陣為a,當碰到縮放n操作時,將對應的操作矩陣sn*a即可 。然而,對於拖動矩陣,如果直接右乘,無法保證其逆序。因為你不知道拖動m何時出現。而opengl無法再上述結構中進行插入操作(事實上,新操作甚至只能插入上述操作序列的最右端)。幸好,由於拖動矩陣具有交換律。因此直接乘吧。。。。

最終解決方案:

將modelview

矩陣的結構改為:

[縮放n*縮放

n-1。。。*縮放

*縮放1]*當期矩陣*[

拖動1*

。。。拖動m]。

7-19:地圖的縮放應該在標準座標系下進行比較方便。 即對已經完成 模型檢視對映、投影對映、座標規範化後的資料進行操作

OpenGL與旋轉 縮放 平移

2018 05 09 旋轉看起來挺費勁的,其實非常簡單。我們只需要給shader傳入mvp矩陣即可。旋轉分為兩類 camera旋轉 物體旋轉。當指定mvp矩陣時,model矩陣是每個物體攜帶的資料,projection矩陣是由camera 的fov aspect near far距離決定的,對於ca...

flex元件的縮放和拖動

1 flex元件的縮放 為元件新增 mousewheel 事件,處理函式如下 滑動滾輪,改變畫布大小 public function changesize e mouseevent void else 2 flex組建的拖動 首先要為元件新增mousedown和mouseup事件 滑鼠按下事件 pu...

opengl紋理縮放的原理

用opengl處理3dlut對映的時候,lut濾鏡資料輸入到紋理後,不經過任何處理直接輸出,影象兩邊會有錯誤的畫素點出現,如下 更換了,以便驗證結果的一般性 在我的測試demo中有以下 設定紋理的屬性 當紋理座標超出範圍時,重複當前紋理 gltexparameteri gl texture 2d,g...