捏缩放和平移,以特定的屏幕坐标
问题描述:
我想掐特定各地变焦协调瓷砖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.z
做mCamera.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)这是一个很好的战略移动瓷砖板更接近用户捏的放大坐标?
答
要十个分量焦点,我这样做代码:
观测值:此代码依赖于重载运营商,你需要它的方法来改变向量运算符(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次尝试,并且是很容易当你拉下来,它只是两个三角形。
thisZoom最初不为0吧?你将它设置为camera.z的值? – Henrik
thisZoom从1开始 –