在上一章節c# 使用sharpgl-perspective和lookat中講到了幾何變換,包括:translate平移、rotate旋轉、scale縮放,想到了在cad中經常用到的滑鼠滾輪按鍵平移操作,就想用translate+滑鼠事件做個簡單的測試應用。(先挖乙個坑,後續再新增滑鼠拖動旋轉和滑鼠滾輪縮放應用。)
為了確保滑鼠在平移時,滑鼠位置與圖形位置保持對應一致,需要知道螢幕畫素與opengl世界座標系對應關係,確保滑鼠移動多少,圖形在世界座標系移動多少。
注意:牽涉的投影矩陣不同,計算畫素與單位長度的運算關係不太一樣,下面分別說明。
一、正交投影,平移操作
1、螢幕畫素與opengl視野座標對應關係
先回顧一下正交投影的模型:
正交投影相對簡單直觀一些,視野大小就是(right-left,top-bottom),跟螢幕畫素長寬剛好對應。可以得到:
水平方向螢幕畫素與單位長度對應比=(right-left)/width。
垂直方向螢幕畫素與單位長度對應比=(top-bottom)/height。
其中width、height是視野視窗螢幕大小。
為了簡單直**出測試效果,程式在xy平面進行操作,相機視角為:
private
void
openglcontrol1_resized
(object sender,
eventargs e)
2、滑鼠滾輪事件
滑鼠事件主要是mousedown、mouseup、mousemove三個事件,用於計算滑鼠中鍵按下時滑鼠起始座標,滑鼠移動時滑鼠座標與起始座標移動量
private
void
openglcontrol1_mousedown
(object sender,
mouseeventargs e)
private
void
openglcontrol1_mouseup
(object sender,
mouseeventargs e)
}private
void
openglcontrol1_mousemove
(object sender,
mouseeventargs e)
}
3、opengldraw函式
想實現平移操作,可以對模型檢視矩陣操作,也可以對投影矩陣操作,實現的效果一樣。
對模型檢視矩陣操作:
private
void
openglcontrol1_opengldraw
(object sender,
rendereventargs args)
對投影矩陣操作:
private
void
openglcontrol1_opengldraw
(object sender,
rendereventargs args)
二、透視投影,平移操作
先上一張投影矩陣的模型圖:
其中特殊說明一下,視角aspect:是指垂直方向的視野夾角,水平方向的視野夾角可以根據垂直方向的視野夾角和縱橫比acpect計算得到。
由於投影矩陣的檢視,是乙個錐形檢視,距離相機越近,佔據的視野越大,距離相機越遠,佔據的視野越小,同樣尺寸大小的圖形會指出來,離相機越近越大,離相機越遠越小。直接上**看效果:
private
void
openglcontrol1_opengldraw
(object sender,
rendereventargs args)
執行效果如下:可以明顯看出紅色正方形要比藍色正方形大,這就是透視矩陣曾現出來的檢視效果。
1、螢幕畫素與opengl視野座標對應關係:
透視投影在螢幕畫素的單位距離對應關係,是跟離相機的距離有直接關係的,如下:
進而可以得到:
垂直方向螢幕畫素與單位長度對應比=2ltan(α)/height
根據縱橫比aspect,可以得到:
水平方向螢幕畫素與單位長度對應比=2ltan(α)*aspect/width
由於透視投影效果跟離相機的距離關係比較大,為了能夠直**出效果,測試在z=0平面進行操作,相機引數在(0,0,20)位置,垂直看向z=0平面:
private
void
openglcontrol1_opengldraw
(object sender,
rendereventargs args)
滑鼠滾輪按鍵平移操作效果如下:
測試程式在這裡:sharpgl測試範例
使用arduino 連線滑鼠滾輪編碼器
滑鼠滾輪的機械式編碼器跟一般的增量編碼器還有點不一樣,這裡是他的ab相時序解釋 實驗電路,非常簡單,gnd接編碼器的地,編碼器其他兩個線接數字輸入2.3 注意數字輸入01腳跟串列埠是復用的,如果用了串列埠功能就沒法用gpio了,我一開始沒留意這問題搞得沒法燒程式了 為了訊號穩定,設定23腳接內部上拉...
HTML5是如何使用滑鼠滾輪事件的
你我都知道在html5網頁中新增滑鼠滾輪事件能夠更好的讓使用者與網頁進行互動操作。而在html5中,滑鼠滾輪並不僅僅就只能上下滑動網頁,實際上你還可以依靠這個完成更多的功能,比如視野平面的放大與縮小。大部分瀏覽器都是支援滑鼠滾輪事件的,所以你可以先訂閱滑鼠滾輪事件的方法,每當事件被觸發時,你能獲取乙...
C 窗體(二) 滑鼠長時間按下事件
建立vs窗體應用程式具體 如下 using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.linq usi...