對動漫角色進行建模,姿態定製或動畫製作需要都要從不同角度去觀察角色,並進行修改或製作,一般的
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...