2016-11-30 4 views
0

Ich habe einen Planeten und einen Mond. Der Mond wird einem Dummy-Objekt zugeordnet, das sich in der Mitte des Planeten befindet (im Wesentlichen 0,0,0). Der Mond kann sich frei um den Planeten drehen. Es sollte eine konstante Entfernung vom Planeten halten.Wie drehe ich ein Objekt an eine bestimmte Position um ein anderes Objekt herum? (Im Wesentlichen umkreisen bis zur angegebenen Position)

Ich habe einen bestimmten Punkt im Sinn, dass ich den Mond drehen möchte, obwohl er aufrecht bleiben muss. Das heißt, der Mond sollte beständig "aufwärts" relativ zur Oberfläche des Planeten zeigen. Grundsätzlich ist es wie ein "moveTo" -Skript, nur in meinem Fall sollte sich der Mond um den Planeten "drehen", bis er den Punkt erreicht, den ich suche.

Hier ist, was ich bisher habe, obwohl ich nicht die richtige Logik arbeiten können, zu verwenden:

Vector3 targetDir = moveToPos - moon.transform.position; 

float angle = Vector3.Angle(targetDir, moon.transform.up); 

dummy.transform.RotateAround (moveToPos, moon.transform.up, angle); 

Bin ich denke an das richtig? Sobald ich das funktioniere, möchte ich den Mond verschiedene Positionen einnehmen und den Mond auf der Oberfläche des Planeten drehen lassen. Ich habe nach etwas ähnlichem gesucht, kann aber nicht finden, wonach ich suche.

Der in diesem Screenshot angezeigt Marker „hier drehen“ sollte sagen, aber das ist im Wesentlichen, was meine Szene wie folgt aussieht:

Marker shows where the moon should be moved

enter image description here

+0

Können Sie einen Screenshot Ihrer Hierarchie zeigen, nur so ist es für Leser klar, was die Situation ist? Ich weiß vielleicht, wie man sich einer Lösung nähert, aber ich möchte nicht auf falschen Annahmen beruhen. – Serlite

+0

Danke, dass du Serlite hilfst, ich aktualisiere nur das OP mit Screenshot. – Valerie

+0

In Ordnung. Eine zusätzliche Klarstellung - wenn Sie sagen, dass der Mond immer nach oben gerichtet sein sollte, klingt es, als ob Sie "hoch" relativ zur Oberfläche des Planeten meinen. Ist das richtig? Oder meinst du "oben" im Weltraum? – Serlite

Antwort

2

Sie haben bereits viele Dinge leichter gemacht haben indem du deinen Mond in eine leere Transformation nestest. Wenn es richtig eingerichtet ist, bedeutet das, dass Sie die transform des Mondes nicht direkt manipulieren müssen - Sie müssen nur das Containerobjekt drehen, bis es auf die Zielposition zeigt.

* Hierdurch meine ich das Container-Objekt ist bei (0, 0, 0) in Bezug auf die Erde, und der Mond nur lokal entlang der z-Achse, so dass es eine Linie mit dem Behälter transform.forward Vektor übersetzt.

Das Problem ist einfacher zu nähern, wenn wir sie brechen in kleinere Stufen hinunter:

  • Bestimmung der Zielrichtung der Behälter stellen muss. Wir können dies erreichen, indem wir die Position des Containers von der Zielposition subtrahieren.
  • Berechnen der erforderlichen Drehung, damit der Container in die Zielrichtung zeigt. Dies ist ein guter Platz für Quaternion.LookRotation().
  • Drehen des Containers, bis seine Richtung der Zielrichtung entspricht.Quaternion.Lerp() kann verwendet werden, um dies zu erreichen.

Hier ist, wie Sie diese Schritte implementieren könnte:

Quaternion targetRotation; 
Quaternion startRotation; 
float progress = 1; 

void SetTargetPosition(Vector3 position) 
{ 
    // Calculating the target direction 
    Vector3 targetDir = position - dummy.transform.position; 

    // Calculating the target rotation for the container, based on the target direction 
    targetRotation = Quaternion.LookRotation(targetDir); 
    startRotation = dummy.transform.rotation; 

    // Signal the rotation to start 
    progress = 0; 
} 

void Update() 
{ 
    if (progress < 1) 
    { 
     // If a rotation is occurring, increment the progress according to time 
     progress += Time.deltaTime; 

     // Then, use the progress to determine the container's current rotation 
     dummy.transform.rotation = Quaternion.Lerp(startRotation, targetRotation, progress); 
    } 
} 

Hinweis: Wenn der Mond zu schnell dreht (es wird zur Zeit der Drehung in ~ 1 Sekunde vollständig), fügen Sie einfach weniger zu progress jedem Rahmen, z. Teile es durch einen Faktor.

Solange der Behälter im Planeten zentriert ist, sollte der Mond zu jeder Zeit in einem konstanten Abstand von der Oberfläche bleiben und durch diese Methode immer eine konsistente "Aufwärts" -Richtung relativ zur Planetenoberfläche behalten.

Hoffe, das hilft! Lass es mich wissen, wenn du irgendwelche Fragen hast.

+0

Danke Serlite, ich versuche es jetzt. Sieht nach einer eleganten Lösung aus und danke, dass du es gelöst hast. Es scheint zu funktionieren, sieht aber aus, als würde es in die entgegengesetzte Richtung gehen. Es ist wahrscheinlich etwas, was ich mache. Ich bin wieder da ... – Valerie

+0

@Valerie Hm, komisch. Stellen Sie sicher, dass der Mond entlang seiner lokalen z-Achse positiv übersetzt wird, nicht negativ - andernfalls wird er auf dieser anderen Seite des Planeten enden. – Serlite

+0

Danke, das ist, was ich denke. Ich bin aktualisiert das OP mit besseren Screenshot zeigt Hierarchie – Valerie

Verwandte Themen