我想在平铺的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)这是一个很好的策略,可以让瓷砖板更接近用户捏合的坐标吗?
答案 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次尝试才完成它,当你把它画下来时它很简单,只有两个三角形。