OpenGL實現平滑的球面相機旋轉

2021-04-30 05:31:04 字數 1686 閱讀 6050

對動漫角色進行建模,姿態定製或動畫製作需要都要從不同角度去觀察角色,並進行修改或製作,一般的

3d建模工具都會提供側,正,上方向和斜上方向的視角來幫助建模,而我們在這裡則提供一種可以快速地任意旋轉模型,並可以從任意角度修改模型的

opengl

實現方法。

要從任意角度觀察模型,只需把視點放在以所觀察物體中心為圓心,以視點與物體中心距離為半徑的乙個球面上。如圖

2所示。這裡的平滑球面旋轉指的是無論相機處於什麼位置,都可以根據滑鼠的位移而平滑地改變角色模型的觀察角度,不會出現因為相機處於特殊位置(如上下兩極)而出現的奇異的觀察角度旋轉。

,接著呼叫

glloadidentity

初始化矩陣,在此基礎上呼叫

gltranslatef(0

,1,0

)並用glmultmatrixf

函式乘上

,再提取所得變換矩陣的

m[12],m[13],m[14]

,組成(

m[12],m[13],m[14]

)即可得到新相機的上座標;同樣,初 始化矩陣的基礎上 上呼叫

gltranslatef(0

,0,length

),用 glmultmatrixf

函式乘上

,再提取變換矩陣的

m[12],m[13],m[14]

,組成(

m[12],m[13],m[14]

)即可得到新相機的位置。有了新相機的位置和上方向,就是可以通過呼叫

glulookat

重新設定

modelview

變換矩陣,即可從新的角度觀察並修改動漫模型。

**如下:

/*mpoint表示相機位置,upv表示相機的正方向,m是乙個4*4的矩陣*/

float dx,dy;//滑鼠位移

dx=point.x-mlastpoint.x;

dy=mlastpoint.y-point.y;

glpushmatrix();

glloadidentity();//初始化變換矩陣

float m[16];

float length=vectorlength(&mpoint);

change_zy_axis(&mpoint,&upv,m);//根據當前相機的位置和正方向,進行座標變換:把相機變換到z軸上,正方向為y方向,最後把變換矩陣儲存到m

glloadmatrixf(m);//載入變換矩陣

glrotatef((sqrt(dx*dx+dy*dy)/10),-dy,dx,0);//旋轉相機

glgetfloatv(gl_modelview_matrix,m);//獲取最終變換矩陣

vector3 tempz,tempy;

tempz.x=0;

tempz.y=0;

tempz.z=length;

tempy.x=0;

tempy.y=1;

tempy.z=0;

multvectorbymatrix(m,&tempz,&mpoint);//計算相機的新位置

multvectorbymatrix(m,&tempy,&upv);//計算相機的新正方向

glpopmatrix();

mlastpoint.x=point.x;

mlastpoint.y=point.y;

平滑搖桿的實現

很久不寫關於遊戲邏輯的文章了,略顯生疏了,最近公司的專案需要用到平滑支援360度各角度搖動的搖桿,就隨手寫了乙個,並非是區域判定的方法,那種方法很難達到使用者的舒適度,體驗感會下降得比較明顯。通過滑動的前後2個point來判斷角度,為了舒適的平滑必須在手指離開螢幕的同時釋放初始點,即如果手指沒有離開...

計算城市間的球面距離(C 實現)

include include include include using namespace std struct city 城市結構體 const double pi 3.1415926 const double r 6371.0 地球半徑 int iputn input number輸入城市數...

nginx 平滑重啟的實現方法

一 背景 在伺服器開發過程中,難免需要重啟服務載入新的 或配置,如果能夠保證server重啟的過程中服務不間斷,那重啟對於業務的影響可以降為0。最近調研了一下nginx平滑重啟,覺得很有意思,記錄下來供有興趣的同學查閱。二 重啟流程 三 nginx實現 為了驗證nginx平滑重啟,筆者首先嘗試ngi...