2010-07-20 64 views
4

這是我的問題,我有一個縮放點,這是未投影的鼠標位置。我也有一個「照相機基本上通過轉換X和Y我想要做的所有對象的實現縮放到鼠標的位置放大鼠標,考慮相機翻譯? (OpenGL)

心中已經試過這樣:

1. Find the mouse's x and y coordinates 
    2. Translate by (x,y,0) to put the origin at those coordinates 
    3. Scale by your desired vector (i,j,k) 
    4. Translate by (-x,-y,0) to put the origin back at the top left 

但這並不因素翻譯的相機。

我怎樣才能正確地做到這一點。感謝

glTranslatef(controls.MainGlFrame.GetCameraX(), 
    controls.MainGlFrame.GetCameraY(),0); 
glTranslatef(current.ScalePoint.x,current.ScalePoint.y,0); 

glScalef(current.ScaleFactor,current.ScaleFactor,0); 
glTranslatef(-current.ScalePoint.x,-current.ScalePoint.y,0); 
+0

我可能會被理解/得到這個錯誤的,但,而不是通過縮放所需的矢量(I,J,K )如你所說你試過翻譯z軸放大? – 2010-07-20 03:01:56

+0

需要更多信息和清晰度。也許是源代碼? 「2.翻譯...」是指投影視圖矩陣轉換嗎?這是不是「影響相機翻譯的因素」?我猜這是二維正交視圖,是嗎? – Detmar 2010-07-20 03:09:08

+0

沒有工作 – jmasterx 2010-07-20 03:09:16

回答

3

而不是使用glTranslate移動的所有對象,你應該嘗試glOrtho。它將需要的左側座標,右側座標,底部座標,頂部座標和最小/最大深度作爲參數。例如,如果您調用glOrtho(-5,5,-2,2,...);例如,如果您調用glOrtho(-5,5,-2,2,...)你的屏幕將顯示所有的座標在從(-5,2)到(5,-2)的矩形內的點。優點是您可以輕鬆調整縮放級別。

如果你不乘以任何視圖/投影矩陣(我認爲是這種情況),默認屏幕座標範圍從(-1,1)到(1,-1)。

但是在您的項目中,控制相機可能非常有用。調用此您繪製的任何對象,而不是你的glTranslate之前:

float left = cameraX - zoomLevel * 2; 
float right = cameraX + zoomLevel * 2; 
float top = cameraY + zoomLevel * 2; 
float bottom = cameraY - zoomLevel * 2; 
glOrtho(left, right, bottom, top, -1.f, 1.f); 

注意cameraX和cameraY現在代表屏幕的中心。

現在,當你放大上的一個點,你只需要做這樣的事情:

cameraX += (cameraX - screenX) * 0.5f; 
cameraY += (cameraY - screenY) * 0.5f; 
zoomLevel += 0.5f; 
+1

glOrtho創建了一個正交投影 - 而不是一個透視圖。這在某些情況下(例如2D瓦片遊戲)是期望的並且在其他(例如FPS)中不希望。無論如何 - 移動相機而不是所有物體是正確的方式。 – 2010-07-20 06:24:27