바둑판 식으로 배열 된 15f x 15f 3D 보드의 특정 좌표를 중심으로 확대/축소하려고합니다. 나는. 나는 원점을 확대하고 싶지 않습니다. 따라서 보드를 적절하게 팬해야합니다.핀치 확대 및 특정 화면 좌표로 이동
PerspectiveCamera
(near = 0.1f, far = 100f)을 사용하고 있습니다. 화면을 완벽하게 맞추기 위해 카메라는 확대하기 전에 approx.z=13.4
에 있습니다.
이제 (내 생각) 내가 원하는 것은에 무엇 : 각 핀치 줌 한번만 화면 좌표 (GestureDetector.pinch
방법) Unproject
: 각 줌 사이클 이제
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 인 이유는 0.1f 근처에서 (추측)입니다. 그러나 위에서 보았 듯이 (이상한?) 화면 좌표를 나타냅니다.
(2) 사용자가 두드린 확대 좌표에 타일 보드를 더 가깝게 옮기는 데 좋은 전략입니까?
이것을 제외 :이 코드에 과부하 사업자에 의존, 당신은 그 방법으로 벡터 사업자를 변경해야합니다 (addMe는, 빼기 등)
void zoomAt(float changeAmmount, Vector2D focus) {
float newZoom = thisZoom + changeAmmount;
offset = focus - ((focus - offset) * newZoom/thisZoom);
thisZoom = newZoom;
}
이 Zoom은 처음에는 0이 아닙니다. camera.z 값으로 설정 했습니까? – Henrik
thisZoom은 1에서 시작합니다. –