Jump to content
Unity Insider Forum

Camera nach "LookAT" durcheinander


Elowan

Recommended Posts

hallo,

 

wie "resette" ich eine Camera, die nachdem ich sie mittels "LookAt" auf ein GameObject ausgerichtet habe, damit die Achsen wieder wie vor dem "LookAt" sind?

 

Weil nach "LookAt" (so vermute ich mal) verstellen sich da die Achsen auf das lokale Objekt (target?) und reagieren seltsam....

Link zu diesem Kommentar
Auf anderen Seiten teilen

hallo,

 

wie "resette" ich eine Camera, die nachdem ich sie mittels "LookAt" auf ein GameObject ausgerichtet habe, damit die Achsen wieder wie vor dem "LookAt" sind?

 

Weil nach "LookAt" (so vermute ich mal) verstellen sich da die Achsen auf das lokale Objekt (target?) und reagieren seltsam....

 

hallo vielleicht könnte dir das hier ja ein wenig weiterhelfen:

 

http://forum.unity3d.com/threads/20351-Mouse-Look-Script-Reset

Link zu diesem Kommentar
Auf anderen Seiten teilen

puuuh, ich blicke das nicht so ganz.. was ich daraus erkenne, es geht in deinem Link darum, einem GameObject ein script anzuhängen, bzw. es zu zerstören.

 

Bei mir müsste ich es so umsetzen, dass sich das script "im script" erstmal zerstört, dann wieder anhängt. Glaube, das geht so leider nicht.

 

Trotzdem vielen Dank für die schnelle Antwort!

Link zu diesem Kommentar
Auf anderen Seiten teilen

puuuh, ich blicke das nicht so ganz.. was ich daraus erkenne, es geht in deinem Link darum, einem GameObject ein script anzuhängen, bzw. es zu zerstören.

 

Bei mir müsste ich es so umsetzen, dass sich das script "im script" erstmal zerstört, dann wieder anhängt. Glaube, das geht so leider nicht.

 

Trotzdem vielen Dank für die schnelle Antwort!

 

Genau das ist es ja worum es darin geht :)

 

Well, I figured it out. Thought I'd post the solution.

 

The trick was to make sure in the first script to Destroy the MouseLook script on the camera:

 

 

Code:


  1. Destroy(go.GetComponent("MouseLook"));

Then at the end of the second script, after aligning the camera to the new location, readd the MouseLook script:

 

Code:


  1. Maincamparent.AddComponent ("MouseLook");

There's a little pop, but it does the trick.

 

erst zerstören und dann wieder hinzufügen :) das ist es doch was ich dir geschickt habe

 

Destroy und AddComponent das sind die dinge die du brauchst

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mein ganzer Aufbau ist wie folgt:

 

Ein GO mit dem Script, was die Cam drehen und zoomen kann... Es regelt auch, dass wenn man ein GO anklickt, es 1. in der Bildmitte zentriert wird und 2. auf es gezoomt wird.

 

1. macht das mit einem lookAT Hit.point

2. macht das mit einem translate Hit.distance

 

Danach ist die Cam nicht mehr wirklich zu gebrauchen, bis ich mittels:

 

Unter dem GO kommt dann die Main Cam, sie hat ein mouse Pan Script, das sich der Bildausschnitt verschiebt, wenn man mit der Maus zu den Bildschirmrändern fährt.

 

Wenn ich jetzt wieder mittels diesem Pan Script den Bildausschnitt wieder weit Weg von dem angeklickten GO verschiebe, dann geht der Zoom wieder.

 

Ich habe versucht, in dem Script unter 1. das einzubauen, was du vorgeschlagen hast.

 

Zunächst, nach dem verschieben der Cam auf die koord des Hit.point ein Destroy this gemacht, um das mousscript zu zerstören.

 

Dann nach dem verschieben auf die Hit.distance versucht, mit Camera.main.GameObject.AddComponent ("Mousescript") es wieder anzuhängen.

 

So weit kommt es nicht, da direkt eine Fehkermeldung kommt, wenn ich es starten möchte.

 

Ist ja auch unlogisch, mitten im Script selbiges zu zerstören und es dann anhängen zu wollen, oder.!?

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

ich habe mir das mit dem Componenten-Zerstören jetzt nicht so genau durchgelesen...

 

Ich würde es einfach so machen:

Wenn die Kamera auf ein GameObject ausgerichtet wird, wird zuvor die Position und Rotation abgespeichert.

Wenn diese sich dann wieder zurückbewegen soll, einfach die Kamera-position/-rotation auf die zuvor abgespeicherten Werte zurücksetzten. (am besten per "Lerp"/"Slerp" ;) )

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kann es sein, dass du ein 2D Spiel machst?

Wenn ja, dann würde ich die Kamera nicht drehen bzw. lookat benutzen.

Dann einfach nur die 2D Achsen des Objektes abfragen und der Kamera übergeben, damit sie dahin fährt.

Danach kannst du super Zoomen und auch ran gezoomt dich schön bewegen.

 

Ist es doch 3D, dann speichere die Position und die Rotation der Kamera in zwei Vector3-Variablen ab, bevor du da hin guckst und ran zoomst. Willst du wieder zurück, dann kannst du die gespeicherten Variablen auslesen und nutzen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo und danke für die Rückmeldungen.

 

Ich bin dabei, die Kamera-Steuerung für ein 3D RTS zu entwickeln und mir fehlt quasi "nur" noch eine Lösung für o.g. Problem - dann ist die ganze Abteilung Kamera erledigt.

 

Zur Erklärung:

 

Meine Cam "erfindet" ein Target, falls kein konkretes vorhanden ist. Ich kann sie dann rotieren und rein/auszoomen, alles wunderbar.

 

So bald ich aber 2-3 mal mein "LookAt angeklicktes GO via hit.point" und "fahre Kamera zum angeklickten GO via hit.distance" auführe, sind die Rotationsachse und der Zoom "unbrauchbar".

 

Die Kamera auf die Werte von vor dem Zoom zurücksetzen wäre schon mal etwas - aber auch noch nicht 100%ig das, was ich suche ;)

 

Kennt ihr das RTS-Homeworld? Im Prinzip möchte ich genau das abbilden, was dort passiert, wenn man mit "ALT+Maustaste" ein Raumschiff anklickt: Die Kamera fährt nahe an das Raumschiff heran, welches unter dem Cursor war, als man den Alt-Klick gemacht hat.

 

Wenn man jetzt aber wieder hinaus-zoomt mit dem Wheel - dann geht der zoom genau so gut wie vorher (genau so weit raus und auch hinein)

 

Vielleicht muss ich hier noch irgendwie den "zoom-Wert" ändern/vorher speichern oder ganz anders handlen, als mit "hit.distance"???

 

Dazu muss ich noch die Achsen wieder "gerade" bekommen... habe etwas gelesen über einen "local - reset". Also zurücksetzen der lokalen Rotation und Position:

 

 #pragma strict
   var firstVector:Vector3;
   var finalVector:Vector3;
   var angleY = 0.0;
   var angleX = 0.0;
   function Start () {

   }

   function Update () {
   angleY+=Time.deltaTime*Input.GetAxis("Horizontal")*90;
   angleX+=Time.deltaTime*Input.GetAxis("Vertical")*90;
   transform.eulerAngles=Vector3(angleX,angleY,0.0);

   }

 

Meint ihr, so etwas wäre der richtige Ansatz? Allerdings müsste ich es dann noch in C# übersetzen, um es in das c-script einbauen zu können.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke, das tue ich sehr gerne... ist aber einiges!

 

Das hier ist das Script, es ist einem "leeren GameObjekt" zugeordnet:

 

//
// original: http://www.unifycommunity.com/wiki/index.php?title=MouseOrbitZoom
//
// --01-18-2010 - create temporary target, if none supplied at start
// --10/2013-- Modified by Elowan
using UnityEngine;
using System.Collections;
using RTS;
public class ZoomRotateCamera : MonoBehaviour
{
   public Transform target;
   public Vector3 targetOffset;
   public float distance = 5.0f;
   public float maxDistance = 20;
   public float minDistance = .6f;
   public float xSpeed = 200.0f;
   public float ySpeed = 200.0f;
   public int yMinLimit = -80;
   public int yMaxLimit = 80;
   public int zoomRate = 40;
   public float zoomDampening = 5.0f;

   private float xDeg = 0.0f;
   private float yDeg = 0.0f;
   private float currentDistance;
   private float desiredDistance;
   private Quaternion currentRotation;
   private Quaternion desiredRotation;
   private Quaternion rotation;
   private Vector3 position;

private RaycastHit hit;


   void Start() {Init(); }

void OnEnable() {Init(); }

public void Init()
    {
    //If there is no target, create a temporary target at 'distance' from the cameras current viewpoint
    if (!target)
    {
	    GameObject go = new GameObject("Cam Target");
	    go.transform.position = transform.position + (transform.forward * distance);
	    target = go.transform;
    }

    distance = Vector3.Distance(transform.position, target.position);
    currentDistance = distance;
    desiredDistance = distance;

    //be sure to grab the current rotations as starting points.
    position = transform.position;
    rotation = transform.rotation;
    currentRotation = transform.rotation;
    desiredRotation = transform.rotation;

    xDeg = Vector3.Angle(Vector3.right, transform.right );
    yDeg = Vector3.Angle(Vector3.up, transform.up );
   }

// Camera logic on LateUpdate to only update after all character movement logic has been handled.
  void Update()
   {
 // Wenn Alt+linke Maus, Zoom + zentriere auf GameObject (Cursor)
 if(Input.GetMouseButton(0)&& Input.GetKey(KeyCode.LeftAlt)){ 

  // Erzeuge Strahl (ray = enthält die MouseInputCoords)
  Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
  RaycastHit hit;

  if(Physics.Raycast(ray, out hit)){//wurde etwas getroffen? (=hit.point!)

  //Debug.Log("etwas getroffen "+hit.distance+" Meter");


 // Camera auf getroffenes GameObj, bzw. hit.point zentrieren
    Camera.main.transform.LookAt(hit.point);

 // Camera auf getroffenes GameObj, bzw. um hit.distance verschieben
 Camera.main.transform.Translate(Vector3.forward*(hit.distance-5F));

 // Camera-Achsen Rotation wieder entfernen ???
   }

else{
   return;  
}
}
 }
   void LateUpdate()
   {
	 // If right mouse ORBIT
	 if (Input.GetMouseButton(1))
    {
	    xDeg += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
	    yDeg -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;

	    ////////OrbitAngle

	    //Clamp the vertical axis for the orbit
	    yDeg = ClampAngle(yDeg, yMinLimit, yMaxLimit);
	    // set camera rotation
	    desiredRotation = Quaternion.Euler(yDeg, xDeg, 0);
	    currentRotation = transform.rotation;

	    rotation = Quaternion.Lerp(currentRotation, desiredRotation, Time.deltaTime * zoomDampening);
	    transform.rotation = rotation;
    }

    ////////Orbit Position

    // affect the desired Zoom distance if we roll the scrollwheel
    desiredDistance -= Input.GetAxis("Mouse ScrollWheel") * Time.deltaTime * zoomRate * Mathf.Abs(desiredDistance);
    //clamp the zoom min/max
    desiredDistance = Mathf.Clamp(desiredDistance, minDistance, maxDistance);
    // For smoothing of the zoom, lerp distance
    currentDistance = Mathf.Lerp(currentDistance, desiredDistance, Time.deltaTime * zoomDampening);

    // calculate position based on the new currentDistance
    position = target.position - (rotation * Vector3.forward * currentDistance + targetOffset);
    transform.position = position;
   }

   private static float ClampAngle(float angle, float min, float max)
   {
    if (angle < -360)
	    angle += 360;
    if (angle > 360)
	    angle -= 360;
    return Mathf.Clamp(angle, min, max);
   }
}

 

Es regelt Zoom, Rotate und soll bei ALT+Klick auch das "Zoom auf geklicktes GO" durchführen.

 

Das 2. Script ist der Main-Camera zugeordnet. Es regelt den pan, wenn der Cursor an die Bildschirmgrenzen fährt:

 

using UnityEngine;
using System.Collections;
using RTS;
public class NewMove : MonoBehaviour {

 private Player player;

   const int MOUSE_MOVEMENT_DISTANCE_FROM_SCREEN_EDGE = 100; // Bigger number means screen will start moving faster
   const int MOUSE_MOVEMENT_MAX_SCROLL_SPEED = 50;//Increase this to increase max speed overall
   const int BASE_SCROLLSPEED_FACTOR = 10; //Increase this to increase the rate of speed gain - 5-10 is a good range
 void Start() {
 player = transform.root.GetComponent<Player>();
 }
   void Update ()
   {  if(player.human==false) return;
   float mousePosX = Input.mousePosition.x;
   float mousePosY = Input.mousePosition.y;
   int boundaryTrigger = MOUSE_MOVEMENT_DISTANCE_FROM_SCREEN_EDGE;
   int scrollSpeed = MOUSE_MOVEMENT_MAX_SCROLL_SPEED;

	   if(Input.GetMouseButton(1)==true)return;

   // Do nothing//

  else if(mousePosX < boundaryTrigger)
   {  
    scrollSpeed = (int)((BASE_SCROLLSPEED_FACTOR/mousePosX) * MOUSE_MOVEMENT_MAX_SCROLL_SPEED);
    if ((scrollSpeed > MOUSE_MOVEMENT_MAX_SCROLL_SPEED)||(scrollSpeed < 0)) {
		    scrollSpeed = MOUSE_MOVEMENT_MAX_SCROLL_SPEED;
	    }

    transform.Translate(Vector3.right* - scrollSpeed * Time.deltaTime);
   }

   if(mousePosX >= Screen.width- boundaryTrigger)
   {
    scrollSpeed = (int)((BASE_SCROLLSPEED_FACTOR/(Screen.width - mousePosX)) * MOUSE_MOVEMENT_MAX_SCROLL_SPEED);
    if ((scrollSpeed > MOUSE_MOVEMENT_MAX_SCROLL_SPEED)||(scrollSpeed < 0)) {
		    scrollSpeed = MOUSE_MOVEMENT_MAX_SCROLL_SPEED;
	    }

    transform.Translate (Vector3.right * scrollSpeed * Time.deltaTime);
   }

   if(mousePosY < boundaryTrigger)
   {
    scrollSpeed = (int)((BASE_SCROLLSPEED_FACTOR/mousePosY) * MOUSE_MOVEMENT_MAX_SCROLL_SPEED);
    if ((scrollSpeed > MOUSE_MOVEMENT_MAX_SCROLL_SPEED)||(scrollSpeed < 0)) {
		    scrollSpeed = MOUSE_MOVEMENT_MAX_SCROLL_SPEED;
	    }

    transform.Translate (Vector3.forward * - scrollSpeed *Time.deltaTime);
   }

   if(mousePosY >= Screen.height - boundaryTrigger)
   {
    scrollSpeed = (int)((BASE_SCROLLSPEED_FACTOR/(Screen.height - mousePosY)) * MOUSE_MOVEMENT_MAX_SCROLL_SPEED);
    if ((scrollSpeed > MOUSE_MOVEMENT_MAX_SCROLL_SPEED)||(scrollSpeed < 0)) {
		    scrollSpeed = MOUSE_MOVEMENT_MAX_SCROLL_SPEED;
	    }

    transform.Translate (Vector3.forward *scrollSpeed * Time.deltaTime);   
   }
}
   }

 

Beides sind angepasste scripte, die ich nicht selbst von Grund auf erstellt habe.

 

Das Problem ist, wenn du jetzt die Cam etwas rotierst, so dass du z.B: von schräg oben auf ein GO schaust, dann 2-3 mal "Alt+linke Maus" darauf machst, die Achsen "schief" und der Zoom nur noch in eine Richtung geht. So lange, bis man wieder mittels dem pan, weit weg fährt, dann geht der zoom zwar wieder in beide Richtungen - aber die Ansicht, bzw. Y-Achse der Cam ist weiterhin schief...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Habe mal ein Debug log mitlaufen lassen:

 

Ausgangsposition+Rotation des ganzen:

 

 

(0.0, 0.0, -28.0)Cam Pos alt

UnityEngine.Debug:Log(Object)

NewMove:Update() (at Assets/Scripts/NewMove.cs:132)

 

 

(0.0, 0.0, 0.0, 1.0)Cam Rota alt

UnityEngine.Debug:Log(Object)

NewMove:Update() (at Assets/Scripts/NewMove.cs:133)

 

 

(0.0, 0.0, 0.0)Cam Winkel alt

UnityEngine.Debug:Log(Object)

NewMove:Update() (at Assets/Scripts/NewMove.cs:134)

 

 

(0.0, 0.0, 0.0, 1.0)Cam local Rota alt

UnityEngine.Debug:Log(Object)

NewMove:Update() (at Assets/Scripts/NewMove.cs:135)

 

 

(0.0, 0.0, 0.5)Cam local Pos alt

UnityEngine.Debug:Log(Object)

NewMove:Update() (at Assets/Scripts/NewMove.cs:136)

 

 

Nach ein-5 Alt+klick / klicks:

 

 

(1.7, 2.7, 9.4)Cam Pos neu

UnityEngine.Debug:Log(Object)

NewMove:Update() (at Assets/Scripts/NewMove.cs:142)

 

 

(0.0, 1.0, -0.1, -0.1)Cam Rota neu

UnityEngine.Debug:Log(Object)

NewMove:Update() (at Assets/Scripts/NewMove.cs:143)

 

 

(354.9, 9.7, 0.0)Cam Winkel neu

UnityEngine.Debug:Log(Object)

NewMove:Update() (at Assets/Scripts/NewMove.cs:145)

 

 

 

(-0.3, 0.2, 0.0, 0.9)Cam local Rota neu

UnityEngine.Debug:Log(Object)

NewMove:Update() (at Assets/Scripts/NewMove.cs:148)

 

 

(-0.3, -0.7, -2.5)Cam local Pos neu

UnityEngine.Debug:Log(Object)

NewMove:Update() (at Assets/Scripts/NewMove.cs:149)

 

 

Warum gibt es bei einer Rotation 4 Werte?

Die Werte in fett sind meiner Meinung nach "schuld", das die Achsen schief sind, oder?!

Wie setze ich die wieder auf "0" oder setze die fest, dass sie sich erst gar nicht verändern können?

 

Bringt es was, die "locale Position und Rotation" wieder zu löschen? Wenn ja, wie sieht das als C# in etwas aus?

 

Eine Methode, einen rigbody zu erzeugen und dort die Rotation x y z zu freezen funktionert leider nicht...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hui,

das ist ja ein ganzer Haufen Code...

aber eigentlich ganz simpel aufgebaut ;)

 

Erstmal:

Das mit der Rotation würde mich auch interessieren ^_^

(dieses "float w" ist irgendwie seltsam und in der Dokumentation steht nur, dass man die Finger davon lassen soll^^)

 

Dummerweise hat mir der Code nicht verraten, was du mit

 

[...]das die Achsen schief sind[...]

 

meinst.

 

Wenn du die Kamera rotiert wird sind die Achsen "schräg"?? :wacko:

Kannst du diesbezüglich vieleicht eine kleine Skizze etc. anfertigen, oder kann mich jemand aufklären?

 

Aber wenn dir die Rotation der Kamera nicht passt, wieso setzt du sie dann nicht einfach richtig?

Das geht doch mit:

 

Camera.main.transform.rotation = new Quaternion.Euler(x,y,z);

 

oder halt:

 

Camera.main.transform.position = new Vector3(x,y,z);

 

(nur Lerp/Slerp nicht vergessen... das steht ja eh im Code ;) )

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, ich versuche es mal anhand von Bildern, ist nicht ganz so easy zu verstehen, hast recht - und danke übrigens, dass du dir diese Mühe überhaupt machst ! :)

 

 

Here we go:

 

1_Achse_ok... das ist der Ausgangszustand, quasi wenn ich es starte und noch keinen Alt+Klick gemacht habe.

 

2_Rotate-schräg... wenn ich die Cam rotiere, so dass ich z.B. von schräg oben schaue, geht auch noch alles so weit, aber...

 

3_neue_Achse-schräg... so bald ich dann mit Alt+linke Maus auf ein GO klicke, ändert sich die Achse (die Raumstation steht schief und bleibt es auch)

 

Schwenke ich die Cam hoch/runter, dann dreht sich quasi die Station um eine völlig "falsche" Achse, bzw. wird um eine Achse rotiert - sollte aber weiterhin "senkrecht" sein, so wie auf dem 1. Bild ;)

 

Oder anders: Wenn ich die Cam "rauf/runter" schwenken will, dreht sich das Bild dabei aber zusätzlich noch nach links/rechts um den Bildmittelpunkt herum...

 

Links-Rechts-schwenken geht nach wie vor so, wie es sein soll... Nur "rauf/runter" eben nicht mehr. Die Cam fährt dann quasi nicht mehr auf einer senkrechten Achse, sondern "im Bogen" rauf und runter, dabei "dreht" sich dann das Bild mit.

 

Vielleicht baust du dir eine Szene nach und nimmst meinen Code dafür?

Erzeuge dir einfach einen Cube als GO, ein leeres GO, dem du dann die MainCam unterordnest.

Dann noch einen groooßen Cube, muss keinen Colider haben, nur damit du quasi etwas richtig ausgerichtetes in der Szene hast.

 

Dann starten und bissi rotieren (z.B. eine Ansicht von schräg oben oder schräg unten auf deinen cube), etwas rauszoomen und mit ALT+linke Maus den Cube ein paar mal anklicken... Dann schaue mal rauf/runter ;)

 

Bei dem Vorschlag: "Camera.main.transform.rotation = new Quaternion.Euler(x,y,z);"

 

 

Bekomme ich die Meldung:

Assets/Scripts/ZoomRotateCamera.cs(90,73): error CS0426: The nested type `Euler' does not exist in the type `UnityEngine.Quaternion'

 

post-3633-0-58351300-1381268918_thumb.png

post-3633-0-99941900-1381268933_thumb.png

post-3633-0-85452200-1381270440_thumb.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hmmm, das mit "new" kann sein...

Das ganze war aus dem Stehgreif aufgeschrieben ;)

Müsste aber eigentlich funktionieren.

Hast du darauf geachtet, dass die neue Rotation nicht irgendwo im Laufe des Skripts geändert wird?

 

Zudem ich habe jetzt mal nur das Skript 1 (!) einem GameObject zugewiesen aber schräg wird da nichts ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, habe die Zeile eingefügt, nachdem auf die neue Position verschoben wurde (also nach dem Transform auf die Hit.distance)

 

Probiere mal bitte folgendes:

 

Rotiere die Cam mal so, dass du von schräg oben auf dein GO schaust. Dann klicke ein Paar mal mit Alt+Linke Maus dein GO an (es muss auch einen colider haben, logo) und dann schwenke die Cam mal rauf und runter - eigentlich solltest du dann den Effekt haben, der mich langsam verzweifeln lässt.

 

Danke Dur schon mal sehr für deine Mühe und Hilfe bei der Lösung :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also:

Wenn du LookAt anwendest, wird die Kamera gedreht und schaut auf das Ziel. Soweit so gut.

Wenn du jetzt ran zoomst, Bewegst du die Kamera in Richtung Ziel. Auch gut.

Aber wie du irgendwo geschrieben hast, ist die Kamera ein Unterobjekt von einem Anderen!

Ich habe den Code nicht bis ins kleinste durchforstet. Fand dort aber MouseOrbit! Orbit gleich drumherum fahren!

Dann sehe ich nirgends wo du die "Lokale"Position der Kamera veränderst. Das ist wohl immer Global. Also immer hoch, runter, links, rechts auf die Weltachsen bezogen.

Die Kamera ist aber doch ein Unterobjekt und hat eine Drehung vom Überobjekt bekommen.

 

Kurzum, du drehst das Überobjekt und fährst auch mit ihm zum Ziel. Aber die Bewegungen machst du nur mit der Kamera. Das Überobjekt ist immer noch am selben Punkt wie vor der Fahrt. Das kann so nicht funktionieren.

Schau die mal die Positionen des Überobjektes und der Kamera an, wenn du das durchspielst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für den Hinweis! Was du da schreibst klingt erstmal logisch.

 

Noch einmal zur Erläuterung/Ergänzung:

 

Das Oberobjekt ist ein Gameobjekt mit dem Orbit und zoom Script. Dessen Unterobjekt ist die MainCamera mit dem Pan Script.

Ich kann also die Cam aus dem GO ausklappen.

 

Ich müsste also das Oberobjekt ebenfalls verschieben? Dachte, es verschiebt sich mit, scheint aber nicht so zu sein.

 

 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn ein Child bewegt wird, hat das keinen Einfluss auf den Parent.

Anders herum schon, was ja auch klar ist, da das Child in der Hierachie vom Parent liegt.

Verschiebst du also ein Child dann entfernt es sich vom Parent, liegt also nicht mehr auf dem Achsenmittelpunkt . Wenn jetzt der Parent gedreht oder bewegt wird, dann ist das Child wie eine Gondel im Karussell.

Also einfach alle Bewegungsscripte auf den Parent legen und schon isses gut.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hui, das klingt nach einem "ganz einfachen" Fehler, bzw. nach einer dummen Anfänger-Frage/Problem, mit dem ich euch jetzt hier belästigt habe. Ich werde heute abend probieren, ob es denn so ist.

 

Gleichzeitig habe ich gesehen, dass man die Sache auch mittels "renderer.bounds" umsetzen könnte.

Hätte das Vorteile gegenüber der jetzigen Methode?

 

Ich denke dabei an folgendes: (ohne es bisher ausprobiert zu haben)

 

Meine Objekte sind von stark unterschiedlicher Größe.

 

Wenn ich nun in dem Script für die Cam fest um eine "hit.distance-10" verschiebe, dann könnte (nehme ich einfach mal an) der Fall eintreten, dass es bei sehr großen Objekten "zu nahe" ist und sie nicht ganz im Bild sind. Recht kleine Objekte könnten "zu weit weg" sein. Es kann also sein, dass die hit.distance je nach Größe des Objektes angepasst werden muss.

 

Falls es wirklich so sein wird, könnte ich es damit lösen, in dem ich jedem Objekt das Script anhänge (mit speziel "zugeschnittener" hit.distance-N), bzw. den Teil des Scriptes, wo ich mit Alt+Maustaste die Verschiebung mache? Also diesen Teil nicht in dem Cam-Script lasse, sondern auf die GOs "auslagere" / ihnen zuordne ? Oder macht das wenig Sinn und es gibt viel elegantere Wege?

 

Ich weiß, ich müsste es ja erstmal ausprobieren - aber leider geht das erst heute abend und mir brennt es einfach unter den Nägeln ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn ein Child bewegt wird, hat das keinen Einfluss auf den Parent.

Anders herum schon, was ja auch klar ist, da das Child in der Hierachie vom Parent liegt.

Verschiebst du also ein Child dann entfernt es sich vom Parent, liegt also nicht mehr auf dem Achsenmittelpunkt . Wenn jetzt der Parent gedreht oder bewegt wird, dann ist das Child wie eine Gondel im Karussell.

Also einfach alle Bewegungsscripte auf den Parent legen und schon isses gut.

 

Leider funktioniert es so nicht mehr mit dem Pan-Script. Rotieren und Zoomen ja, aber das andere Script macht nix und es gibt auch keinen Fehler aus... Habe nun beide Scripte einfach ohne child/parents direkt an die MainCam angehangen... aber es funktioniert immer nur eines von beiden - entweder das zoom/rotate script aber dann nicht das pan-script oder wenn beide aktiv gesetzt werden, funktioniert das zoom/rotate, aber wie gesagt das Pan nicht.

 

Pan geht nur, wenn zoom/rotate deaktiviert ist....

 

Und ALT+Linke Maus geht auch nicht mehr so recht.. Bild zuckt zwar, aber wird nicht mehr zentriert oder verschoben.... och mensch... ;(

 

Beide irgendwie zusammengeklöppelt habe ich auch durch mittlerweile... dann geht beides, aber.. wie soll ich das beschreiben... so bald ich einmal rotiere, vertauschen sich die Achsen beim Pan script - rechts wird oben, links zu unten usw. - je nach dem, wie man halt rotiert... aber eigentlich sollen die "Raumbezugsachsen?!" sich nicht verändern, egal wie ich rotiert habe. Oben soll oben bleiben und nicht zu rechts oder links werden....

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also das Pan script funktioniert schon - nur läuft die Cam nicht mit, weil es einem "leeren GO" zugeordnet ist, welches das Parent der MainCamera ist...

 

und "Camera.main.transform.parent" funzt net: Assets/Scripts/NewMove.cs(47,20): error CS1955: The member `UnityEngine.Transform.parent' cannot be used as method or delegate

 

 

boah, ich krisch de Motten hier... so ziemlich alles und jedes script habe ich nach etwas probieren in den Griff bekommen... nur Unity scheint mich einfach nicht zu mögen....

 

nur zur Sicherheit: Die MainCam ist jetzt child des GO´s - oder muss ich noch etwas im script reinschreiben?! post-3633-0-22467500-1381429040_thumb.png

 

 

ich mag nimmer... echt mal

 

irgendwie geht es jetzt - wenn ich den Mouse WHeel Zoom weglasse.... ich weiß auch nicht

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...