C 使用SharpGL 滑鼠滾輪按鍵平移操作

2021-10-07 17:22:52 字數 2790 閱讀 1350

在上一章節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...