目前我使用glOrtho進行縮放和平移二維圖我繪製鼠標位置。縮放使用glOrtho
我已經安裝了視口的標準寬度和高度。然後我設置了glOrtho,這樣我的frustrum使屏幕座標匹配世界座標。
////////////////////////////////////////////// //////////////////////
glViewport(0, 0, window_width,window_height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, window_width,window_height,0 , 100, -100);
///////////////////// //////////////////////////////////////////////
當我做我的縮放功能,在我的鼠標回調,我通過縮放因子乘以截邊....
glOrtho(0 * zoomOut,
window_width * zoomOut,
window_height * zoomOut,
0 * zoomOut,
100, -100);
我的問題是....我怎麼變焦使用爲中心,鼠標的位置?
我已經試過這...(其中mouseStoreX和mouseStoreY存儲在第一次點擊的位置)
glOrtho((0 -mouseStoreX)* zoomOut + mouseStoreX,
(window_width - mouseStoreX) * zoomOut + mouseStoreX,
(window_height - mouseStoreY) * zoomOut + mouseStoreY,
(0 - mouseStoreY) * zoomOut + mouseStoreY,
100, -100);
看來工作,但是當我做了新的點擊截跳動。我認爲在做鼠標位置存儲時,我沒有考慮到zoomOut因素。
編輯* * ** * ** * ****這裏是我的最新的代碼,我還在掙扎......
void ZoomOrtho(){ //ON MOUSE CLICK.....
if (zooming == false){
keyStore.LMx = keyStore.Mx; //store mouse pos for next comparison
keyStore.LMy = keyStore.My;
//get mouse pos
mouseStoreX = keyStore.Mx;//mouse pos at this moment
mouseStoreY = keyStore.My;
//get current projection matrices
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
glGetIntegerv(GL_VIEWPORT, viewport);
//flip Y for opengl reasons
winY = (float)viewport[3] - winY;
//get world mouse coordinate
gluUnProject(mouseStoreX, mouseStoreY , 0.0, modelview, projection, viewport, &posX_,&posY_, &posZ_);
// calc difference between mouse world pos and centre of 'camera'
dx = posX_ - FS.centerX;
dy = posY_ - FS.centerY;
}
//ON DRAG......
zooming = true;
//do mouse movement detection and increment zoomOut
//#################################################
int xDiff = keyStore.Mx - keyStore.LMx; //mouse drag difference in screen space just for incrementing zoom
int yDiff = keyStore.My - keyStore.LMy; //
if (xDiff > 0 && (zoomFactor >= 0.5)) {
zoomFactor -= zoomInc;
if (zoomFactor < 0.5) {zoomFactor = 0.5;}
}
else if (xDiff < 0 && (zoomFactor <= 2.0)) {
zoomFactor += zoomInc;
if (zoomFactor > 2.0){zoomFactor = 2.0;}
}
//#################################################
//fill structure with clipping plane values. zooms ortho projection and keeps mouse pos anchored.
FS.left = ((FS.centerX - dx - (window_width/2.0))*zoomFactor) +dx;
FS.right = ((FS.centerX -dx + (window_width/2.0))*zoomFactor)+dx ;
FS.bottom = ((FS.centerY -dy + (window_width/2.0))*zoomFactor)+dy;
FS.top = ((FS.centerY -dy - (window_width/2.0))*zoomFactor) +dy;
// store last mouse pos for next comparison.
keyStore.LMx = keyStore.Mx;
keyStore.LMy = keyStore.My;
}
void zoomRelease(){
cout << " releasing" << std::endl;
//set zoom to false so we know we are not draggin mouse anymore.
zooming = false;
keyStore.LMx = 0;
keyStore.LMy = 0;
// recenter by taking midpoint between new left and right clipping planes so dx has a reference point
FS.centreX = (FS.right-FS.left)/2.0;
}
void DrawGui(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(FS.left, FS.right,FS.bottom, FS.top, 1, -1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//do drawing
}
是的,我知道這件事情。我現在試圖跟蹤偏移量,但目前無法確切得到它。感謝您的幫助。 – user2089130 2013-02-22 05:57:56
我有同樣的問題 - 這意味着什麼增量? – paulm 2014-02-03 08:59:41