捏缩放并平移到特定的屏幕坐标

时间:2017-10-10 07:31:18

标签: android libgdx opengl-es-2.0

我想在平铺的15f x 15f 3D板上的特定坐标周围进行缩放。即我不想放大原点。因此,我需要相应地平衡董事会。

我使用PerspectiveCamera(近= 0.1f,远= 100f)。为了完美贴合屏幕,相机在变焦前位于approx.z=13.4

现在(我想)我想做的是:

为每次压缩缩放完成一次屏幕坐标(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.z并执行mCamera.update())时,我将该点投影回屏幕坐标:

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

然后相应地计算delta和pan:

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。即一个不小于cam.z的点。 (我得到13.30的原因是(我猜)因为接近= 0.1f。但如上所示,这导致(奇怪的?)屏幕坐标)。

(2)这是一个很好的策略,可以让瓷砖板更接近用户捏合的坐标吗?

1 个答案:

答案 0 :(得分:2)

为了保持焦点,我做了这段代码:

Obs:此代码依赖于重载运算符,您需要通过其方法更改向量运算符(addMe,subtract等)

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

其中

焦点=当前中心指向

offset =距离0,0

的距离

thisZoom =当前缩放ammount; (从1开始)

changeAmmount =值增加或减少缩放

我花了3次尝试才完成它,当你把它画下来时它很简单,只有两个三角形。