OpenGL滑鼠滑動實現視角旋轉

2021-10-01 10:41:03 字數 2314 閱讀 4206

思路:攝像機圍繞著中心點,以固定的半徑做圓周運動。記錄滑鼠在螢幕上滑動的距離,縮小到適合的比例,然後計算出移動後的攝像機的x和z座標。從而達到攝像機旋轉,即視角旋轉的目的。

這裡最關鍵的地方在於lookat矩陣,lookat矩陣是一種特殊型別的view矩陣,通過直接賦值給view矩陣,然後把view傳遞到vertex shader中,從而把世界座標系轉換成用攝像機的視角所觀察到的座標系當中。下面**是乙個典型的lookat矩陣。

view.lookat(

qvector3d(x, y, z), // 攝像機位置

qvector3d(0.0f, 0.0f, 0.0f), // 物體位置

qvector3d(0.0f, 1.0f, 0.0f) // 世界座標系中的上向量

);

**實現

首先要過載qmouseevent的三個函式,mousepressevent(),mousereleaseevent()以及mousemoveevent(),mousepressevent()和mousereleaseevent()的作用是檢查滑鼠是否按下和釋放,當滑鼠按下時,mousepressevent()檢測到按下的動作,表示可以記錄滑鼠滑動了,當釋放滑鼠時,mousereleaseevent()檢測到滑鼠被釋放,表示可以停止記錄了。而mousemoveevent()則是記錄按下和釋放這之間滑鼠到底滑動了多遠的距離。

首先在標頭檔案中過載這三個函式

void mousemoveevent(qmouseevent *event) override;

void mousepressevent(qmouseevent *event) override;

void mousereleaseevent(qmouseevent *event) override;

接著再定義這個旋轉的攝像機的相關引數

glfloat radius = 3.0f;  // 攝像機的旋轉半徑

glfloat camx, camz, camy; // 攝像機的位置

glfloat lastx = width() / 2.0f; // 滑鼠上一幀的位置

glfloat lasty = height() / 2.0f;

glfloat xoffset; // 滑鼠x座標的偏移量

glfloat camrotdistance = 0.0f; // 攝像機旋轉的距離

glboolean isfirstmouse = gl_true;

glboolean isleftmousepress = gl_false;

給攝像機位置的三個引數設定初始值

// initial position of the camera

camx = sin(0.0f) * radius;

camz = cos(0.0f) * radius;

camy = 0.0f;

設定投影矩陣和觀察矩陣

projection.perspective(45.0f, (glfloat)width() / (glfloat)height(), 0.1f, 200.0f);

view.lookat(

qvector3d(camx, camy, camz), // camera position

qvector3d(0.0f, 0.0f, -0.252f), // object position

qvector3d(0.0f, 1.0f, 0.0f) // up vector in world coordinate

);

完成過載的三個函式

void oglmanager::mousepressevent(qmouseevent *event)

}

void oglmanager::mousereleaseevent(qmouseevent *event)

}

void oglmanager::mousemoveevent(qmouseevent *event)

xoffset = xpos - lastx; // distance of mouse sliding

lastx = xpos;

camx = sin(camrotdistance) * radius;

camz = cos(camrotdistance) * radius;

}}

mfc實現滑鼠滑動顯示提示資訊

1.在 dlg.h 檔案新增 滑鼠移動上方顯示資訊 ctooltipctrl m tip 2.在 dlg.cpp 檔案 新增 滑鼠移動上方顯示資訊 enabletooltips true m tip.create this m tip.activate true cwnd pw getdlgitem...

遙控器實現藍芽滑鼠滑動總結

需求 外設海外客戶需要用到瀏覽器,瀏覽器沒有焦點滑動功能,所以這就需要用到遙控器模擬滑鼠滑動功能.目前藍芽遙控器已經把遙控器模擬成了外設滑鼠,但是缺少滑動的功能.所以目前的解決方案就是將對應模擬乙個滑動的事件出來 當滑鼠移動到頂 底 端並且還有對應的y軸移動時,即可模擬乙個滑動的事件 framewo...

OpenGL實現3DS檔案中的模型自由旋轉

現在已經有很多 和書籍提到在opengl中實現讀入和顯示3ds檔案中的模型。但是在很多場合,僅讀入和顯示是不夠的。我們需要從各個角度觀察模型,以便更好地理解模型的形態,形成更為直觀的感性認識。例如,在醫學髁上骨折診斷中,如果把骨折後,斷骨錯位旋轉的情況用三維模型模擬出來,並僅用滑鼠的拖動就能實現從任...