2017-10-10 8 views
0

바둑판 식으로 배열 된 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; 
} 

답변

2

초점 포인트를 mantain하려면이 코드를했다

초점 = 현재 중심점 0,0

에서

오프셋 = 거리를 mantain하는

thisZoom = 현재 확대 축소 량입니다. 당신은 그 두 삼각형을 아래로 그릴 때 그것은 나에게 그것을 수행하기 위해 삼년의 함께 4 개 시도했다, 꽤 쉬웠다 줌을

을 증가 또는 감소

changeAmmount = 값 (1에서 시작).

+0

이 Zoom은 처음에는 0이 아닙니다. camera.z 값으로 설정 했습니까? – Henrik

+0

thisZoom은 1에서 시작합니다. –