OpenGL放大縮小實現

2021-09-06 01:09:23 字數 1279 閱讀 9045

本文採用兩種方式,在opengl中實現放大縮小功能:

方式一. 改變「視點」與模型之間的距離【改變模型視點變換矩陣】

對於這種方式存在三個問題需要解決:

①    縮放過程過渡平滑

②    當模型放大或縮小到一定程度,減慢其縮放速度,以免視點很快地貼近模型或消失在場景中

③    防止視點進入模型內部

解決方案:

使用反正切函式:y=0.5*arctan(0.1*x)+0.25*pi,函式影象如下圖:

當模型放大時,x--,  y減小

當模型縮小時,x++, y增大

y減小時,即∠apm變小,視點a向m點移動(由於y>0,所以a永遠不會到達m點)

y增大時,即∠apm變大,視點a遠離m點

視點與物體中心的距離由三部分組成【am+mn+no】,這樣可以保證無論模型處於什麼姿態,都可以保證物體不會跨越近裁截面(問題③)

1

void

seteyeandradius()2

方式二. 改變投影變換的fovy夾角【改變投影變換矩陣】

fovy越小,模型越大;fovy越大,模型越小。

使用反正切函式:y=arctan(0.1*x)+0.5*pi,函式影象如下圖:

當模型放大時,x--,  y減小(fovy減少)

當模型縮小時,x++, y增大 (fovy增大)

1

void

setfovy()2

對於模型瀏覽而言,第二種方式更簡潔,也易於理解,不用考慮視點會進入模型的情況。

效果圖如下:

原圖:

放大:

縮小:

Qt實現視窗同比例放大 縮小

實現思路 qt中有resizeevent事件,該事件當視窗大小改變時便會產生響應,所以可利用此來實現視窗同比例縮放問題,但是由於resizeevent事件是隨著視窗大小改變不斷重新整理的,因此在重寫resizeevent時,直接改變視窗大小,會產生衝突,無法決斷該放大和縮小,因此為了判別resize...

放大縮小 去處寶山這個地方把世界放大又縮小

寶山智慧型灣,在這座由各種顏色的貨櫃設計改造而來的新型園區裡,隨處可見科技與藝術的融合,除了6月舉行的首屆智慧型灣夜生活節 9月新開的大陸首家星巴克貨櫃店 梅派青衣史依弘的劇場 家宋思衡的多 工作室,這裡還藏著乙個工業旅遊地標 首個中國3d列印文化博物館。彼時,這裡是上海第三毛紡織廠的倉庫用地,如今...

QT 放大與縮小按鈕

標頭檔案 painttest.h ifndef painttest h define painttest h include include class painttest public qwidget endif painttest hpainttest.cpp include painttest...