2017-10-10 5 views
0

Je souhaite pincer le zoom autour d'une coordonnée spécifique sur une carte 3D en mosaïque 15 x 15. C'est à dire. Je ne veux pas faire un zoom sur l'origine. J'ai donc besoin de paner le tableau en conséquence. J'utilise un PerspectiveCamera (proche = 0.1f, lointain = 100f). Pour un ajustement parfait de l'écran, la caméra est située au approx.z=13.4 avant de zoomer.Pincer le zoom et effectuer un panoramique à des coordonnées d'écran spécifiques

maintenant ce que (je pense) que je veux faire est de:

Unproject les coordonnées d'écran (méthode GestureDetector.pinch) fait une fois pour chaque pincée de zoom:

float icx = (initialPointer1.x + initialPointer2.x)/2; 
float icy = (initialPointer1.y + initialPointer2.y)/2; 
pointToMaintain = new Vector3(icx, icy, 0f); 
mCamera.unproject(pointToMaintain); 

maintenant pour chaque cycle de zoom (comme Je régler le mCamera.z en conséquence et faire mCamera.update()) Je projette le point de retour à l'écran les coordonnées:

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

calcule ensuite la delta et panoramique en conséquence:

int dX = (int) (pointNewPos.x - icx); 
int dY = (int) (pointNewPos.y - icy); 
pan(...); /* I.e. mCamera.translate(...) */ 

Mon problème est que le mCamera.z est initialement au-dessus pointToMaintain.z puis passe ci-dessous lorsque l'utilisateur déplace les doigts:

cam.z ptm.z dX dY 
0 13.40 
1 13.32 13.30 12 134 
2 13.24 13.30 12 -188 
... 

(0) est l'original valeur de mCamera.z avant le début du zoom. (1) n'est pas valide? Cependant (2) devrait être OK.

Mes questions sont les suivantes:

(1) Comment puis-je obtenir un "valide" pointToMaintain lorsque l'écran unprojecting coordonnées sur l'appareil photo. C'est à dire. un point qui n'est pas inférieur à cam.z. (La raison pour laquelle je reçois le point à 13.30 est (je suppose) parce que près = 0.1f Mais comme vu ci-dessus cela se traduit par (étranges?) Coordonnées de l'écran).

(2) Est-ce une bonne stratégie pour rapprocher le panneau de carreaux des coordonnées que l'utilisateur a pincées?

Répondre

2

Pour mantenir points de discussion, je l'ai fait ce code:

Obs: Ce code repose sur les opérateurs surchargées, vous devez changer les opérateurs de vecteurs par sa méthode (Addme, Soustraire, etc.)

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

point = point central actuel à mantenir

offset = Distance de 0,0

thisZoom = ammount du zoom actuel; (Commence à 1)

changeAmmount = valeur pour augmenter ou diminuer le zoom

Il m'a fallu 4 essais le long de 3 ans pour le rendre fait, et était assez facile quand vous attiré vers le bas, ses seulement deux triangles.

+0

thisZoom est initialement pas 0 droit? Vous le définissez à la valeur camera.z? – Henrik

+0

thisZoom commence à 1 –