2017-10-10 136 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开始 –