2017-04-18 4 views
0

Ich habe eine Kamera, die das userInterface (Leinwand) -Objekt in der Vorderseite meiner Kamera zeigt. Ich aktualisiere nur meine Benutzerschnittstellenposition, wenn der Kamera Raycast nicht mein userInterface Objekt Collider trifft. so etwas wie diesObjektdrehung ist beim Drehen der Kamera nicht korrekt

public class UIPlacerAtCamFront : MonoBehaviour { 

    public GameObject userInterface; 
    public float placementDistance; 
    Vector3 uiPlacementPosition; 
    RaycastHit objectHit; 

    void Update() { 

     Vector3 fwd = this.transform.TransformDirection(Vector3.forward); 
     //Debug.DrawRay(this.transform.position, fwd * 50, Color.green); 

     if (Physics.Raycast(this.transform.position, fwd, out objectHit, 50)) 
     { 
      //raycast hitting the userInterface collider, so do nothing, userinterface is infornt of the camrea already 
     } 
     else 
     { 
      //raycast is not hitting userInterfae collider, so update UserInterface position accoding to the camera 
      uiPlacementPosition = this.transform.position + this.transform.forward * placementDistance; 
      userInterface.transform.position = uiPlacementPosition; 
     } 

     //Continuously update userInterface rotation according to camera 
     userInterface.transform.rotation = this.transform.rotation; 
    } 
} 

Das obige Skript mit meiner Kamera angebracht ist, zeigt es das Objekt richtig, aber, wie ich beginne meine Kamera meiner UI-Drehung Objekt sieht sehr seltsam zu drehen, wie unten Bild vorgeschlagen This is inital correct rotation

Wie i drehen, dieses Problem enter image description here

auftritt ich weiß, dass das Problem in Rotation, so dass ich müde meinen diese Drehung Code ändern

userInterface.transform.rotation = this.transform.rotation; 

dieser

userInterface.transform.localEulerAngles = new Vector3 (this.transform.localEulerAngles.x, 
      0, 
      this.transform.localEulerAngles.z); 

aber eine andere seltsame Rotation für mich bringen, wie weiter unten enter image description here

Ich möchte, dass meine userinteface Objekt meiner Kamera Correclty Gesicht, auch meine Kamera den Anfang oder das Ende beobachten meines Benutzeroberflächenobjekts. Wie kann ich meine Benutzeroberfläche entsprechend der Kameradrehung richtig drehen?

+0

würde ich empfehlen Modus 'Platz auf dem Bildschirm auf Leinwand Einstellung machen - Overlay'. – Iggy

+0

Ich bin unsicher, was das gewünschte Verhalten wäre (auf dem zweiten Bild). Würde es Ihnen etwas ausmachen, es ein wenig auszuarbeiten? Auch ... wenn Sie Probleme mit euler Winkeln haben versuchen Sie 'Quaternion.LookAt()', ich finde es intuitiver und kugelsicher. –

+0

@lggy ich kann es nicht Bildschirm Platz machen –

Antwort

0

Wenn ich es richtig verstehe. Sie möchten ein ähnliches Verhalten wie Google Maps gleiten. Nur dass sich die Kamera drehen muss und das Bild seine Position und Rotation für das Verhalten anpassen muss.

Der folgende Code sollte das tun:

void Update() { 
    userInterface.transform.rotation = this.transform.rotation; 

    // Project camera to canvas plane 
    Vector3 projection = Vector3.ProjectOnPlane(this.transform.position - userInterface.transform.position, userInterface.transform.forward) 
     + userInterface.transform.position; 

    // Get distance from camera to projected position (basically, distance from point to plane) 
    float curDistance = (this.transform.position - projection).magnitude; 

    // Correct that distance with desired distance 
    userInterface.transform.position += this.transform.forward * (placementDistance - curDistance); 
} 
+0

Ich möchte nur die Benutzerschnittstelle Position aktualisieren, wenn der Raycast nicht trifft die Benutzerschnittstelle. weil ich einige Auswahl von meiner Kamera auf Benutzerschnittstelle –

+0

Kamera mache, die einen Kindzeiger enthält, der verschiedene Objekte auf userinterface auswählt und es dreht, um Auswahl an der unterschiedlichen Position des Segeltuches zu tun. wenn ich die ganze Zeitposition aktualisiere, wie dein Code vorschlug, kann ich ihn –

+0

nicht auswählen Du könntest Drehungen anstelle von Positionen speichern. Oder Sie könnten eine zweite Kamera verwenden, die das ui oben mit einer planaren Logik rendert, aber ich sehe nicht, wie es möglich wäre, einen konstanten Mindestabstand zu einem rotierenden Objekt zu halten, ohne es ein wenig zu verschieben. –

Verwandte Themen