2017-03-23 6 views
0

Ich entwickle derzeit eine Augmented Reality-Anwendung und muss die Größe meiner Objekte mithilfe des Pinch-Zooms ändern. Fand den Code unten im Internet, aber es funktioniert nicht. Nach dem Hinzufügen des Skripts verschwand mein Objekt und wenn ich es kneife, erscheint es einfach und dann verschwindet es wieder. Und es ist sehr klein wie nur ein Punkt auf dem Bildschirm. Was ist der mögliche Grund? Vielen Dank!So skalieren Sie Objekte in Unity3D1

public static GameObject selectedObject;  
//public GameObject gameobject; 
// Update is called once per frame 
void Update() { 

    if (Input.touchCount == 0) 
    { 
     Touch touch = Input.touches[0]; 
     Ray ray = Camera.main.ScreenPointToRay(touch.position); 
     RaycastHit hit; 

     if (Physics.Raycast(ray, out hit, 100f)) 
     { 
      selectedObject = hit.collider.gameObject; 
     } 
    } 
    if (Input.touchCount == 2) 
    { 
     // Store both touches. 
     Touch touchZero = Input.GetTouch(0); 
     Touch touchOne = Input.GetTouch(1); 

     // Find the position in the previous frame of each touch. 
     Vector2 touchZeroPrevPos = touchZero.position - touchZero.deltaPosition; 
     Vector2 touchOnePrevPos = touchOne.position - touchOne.deltaPosition; 

     // Find the magnitude of the vector (the distance) between the touches in each frame. 
     float prevTouchDeltaMag = (touchZeroPrevPos - touchOnePrevPos).magnitude; 
     float touchDeltaMag = (touchZero.position - touchOne.position).magnitude; 

     // Find the difference in the distances between each frame. 
     float deltaMagnitudeDiff = prevTouchDeltaMag - touchDeltaMag; 

     selectedObject.transform.localScale = new Vector3(deltaMagnitudeDiff , deltaMagnitudeDiff , deltaMagnitudeDiff); 

    } 
} 
+0

Haben Sie versucht, die Stärke der Prise dämpfen, indem man zB eine kleine Zahl wie 0,01f mit touchDeltaMag multipliziert? –

+0

uhm, sorry aber wo soll ich es im Code multiplizieren? – Sarah

+0

Nevermind - meine obigen Kommentar war falsch, ich habe ein Code-Beispiel für das, was ich glaube, das eigentliche Problem ist. –

Antwort

1

Das Problem mit lokaler Ebene die Einrichtung eines Delta ist, dass Sie nicht den Maßstab des Objekts in der Art und Weise ändern Sie glauben, Sie sind. Sie setzen die Skalierung auf das Delta in jeder Achse, was eine sehr kleine Zahl sein kann.

Der Grund, warum Ihr Objekt verschwinden würde, wenn der Benutzer das Objekt nicht skalierte, war, dass der Wert deltaMagnitudeDiff 0 war. Sie haben also Ihre Box um den Faktor 0 in jede Richtung skaliert (was sie verkleinert) zu einem einzigen Punkt, seine Position). Wenn ein Benutzer die Box skalieren würde, wäre die Box nur so groß wie deltaMagnitudeDiff. Wenn Sie also Ihre Finger schneller bewegen, würde die Box wahrscheinlich größer erscheinen, als wenn Sie Ihre Tasten langsam bewegen. Sobald der Benutzer die Skalierung beendet hat, wäre deltaMagnitudeDiff wieder 0, da die Position der Finger des Benutzers nicht skaliert wurde.

Sie sollten Ihre deltaMagnitudeDiff der aktuellen lokalen Skalierung des Objekts hinzufügen.

Hier ist eine Modifikation der letzten beiden Zeilen Ihrer Update() Methode, einschließlich der Kommentar direkt über die vorletzte Zeile:

// Find the difference in distances between each frame. 
float deltaMagnitudeDiff = prevTouchDeltaMag - touchDeltaMag; 

Vector3 newScale = selectedObject.transform.localScale - new Vector3(deltaMagnitudeDiff, deltaMagnitudeDiff, deltaMagnitudeDiff); 
selectedObject.transform.localScale = newScale; 

Abschluss Skript:

public static GameObject selectedObject; 
//public GameObject gameobject; 
// Update is called once per frame 
void Update() { 

    if (Input.touchCount == 0) 
    { 
     Touch touch = Input.touches[0]; 
     Ray ray = Camera.main.ScreenPointToRay(touch.position); 
     RaycastHit hit; 

     if (Physics.Raycast(ray, out hit, 100f)) 
     { 
      selectedObject = hit.collider.gameObject; 
     } 
    } 
    if (Input.touchCount == 2) 
    { 
     // Store both touches. 
     Touch touchZero = Input.GetTouch(0); 
     Touch touchOne = Input.GetTouch(1); 

     // Find the position in the previous frame of each touch. 
     Vector2 touchZeroPrevPos = touchZero.position - touchZero.deltaPosition; 
     Vector2 touchOnePrevPos = touchOne.position - touchOne.deltaPosition; 

     // Find the magnitude of the vector (the distance) between the touches in each frame. 
     float prevTouchDeltaMag = (touchZeroPrevPos - touchOnePrevPos).magnitude; 
     float touchDeltaMag = (touchZero.position - touchOne.position).magnitude; 

     // Find the difference in distances between each frame. 
     float deltaMagnitudeDiff = prevTouchDeltaMag - touchDeltaMag; 

     Vector3 newScale = selectedObject.transform.localScale - new Vector3(deltaMagnitudeDiff, deltaMagnitudeDiff, deltaMagnitudeDiff); 
     selectedObject.transform.localScale = newScale; 

    } 
} 
+1

Haben Sie einen Beispielcode dafür? – Sarah

+0

Ich habe daran gearbeitet, haha, ich wollte etwas schnell raus, es sei denn, dass dein Problem nur durch Epiphanie gelöst wurde, während ich an einem Codebeispiel arbeitete. –

+0

sollte ich den Code von vor der Einstellung der neuen Skala nach if (Input.touchCount == 2) ?? – Sarah

Verwandte Themen