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...