2017-10-10 100 views
0

我想掐特定各地變焦協調瓷磚15F X 15F 3D板。即我不想放大原點。因此我需要相應地平移該板。捏縮放和平移,以特定的屏幕座標

我使用的是PerspectiveCamera(近= 0.1F,遠遠= 100F)。對於畫面的完美契合相機位於approx.z=13.4縮放前。

現在是什麼(我覺得)我想要做的是:

Unproject每個雙指縮放做一次屏幕座標(GestureDetector.pinch法):

float icx = (initialPointer1.x + initialPointer2.x)/2; 
float icy = (initialPointer1.y + initialPointer2.y)/2; 
pointToMaintain = new Vector3(icx, icy, 0f); 
mCamera.unproject(pointToMaintain); 

現在對於每個縮放週期(如我據此調整mCamera.zmCamera.update())一期項目點返回到畫面座標:

Vector3 pointNewPos = new Vector3(pointToMaintain); 
mCamera.project(pointNewPos); 

然後計算增量和平移相應:

int dX = (int) (pointNewPos.x - icx); 
int dY = (int) (pointNewPos.y - icy); 
pan(...); /* I.e. mCamera.translate(...) */ 

我的問題是,mCamera.z最初以上pointToMaintain.z然後低於當用戶移動手指:

cam.z ptm.z dX dY 
0 13.40 
1 13.32 13.30 12 134 
2 13.24 13.30 12 -188 
... 

(0)是原始在縮放開始之前,mCamera.z的值。 (1)無效?但是(2)應該沒問題。

我的問題是:

(1)我怎樣才能得到一個「有效」 pointToMaintain unprojecting屏幕座標時相機上。即一個點,不低於cam.z。 (我得到13.30點的原因是(我猜),因爲near = 0.1f。但是如上所示,這導致(奇怪的?)屏幕座標)。

(2)這是一個很好的戰略移動瓷磚板更接近用戶捏的放大座標?

回答

2

要十個分量焦點,我這樣做代碼:

觀測值:此代碼依賴於重載運營商,你需要它的方法來改變向量運算符(ADDME,減等)

void zoomAt(float changeAmmount, Vector2D focus) { 
    float newZoom = thisZoom + changeAmmount; 
    offset = focus - ((focus - offset) * newZoom/thisZoom); 
    thisZoom = newZoom; 
} 

聚焦=當前中心點到十個分量

偏移=從0,0

距離

thisZoom =當前縮放ammount; (從1開始)

changeAmmount =值增大或減小變焦

我花了一起3年時間,使它做4次嘗試,並且是很容易當你拉下來,它只是兩個三角形。

+0

thisZoom最初不爲0吧?你將它設置爲camera.z的值? – Henrik

+0

thisZoom從1開始 –