Locale Translation aus World Translation "raus" rechnen bzw abziehen?

  • Hi,
    ich habe ein kleines Problemchen. Ich mochte per Script eine Translation bzw Rotation setzen.
    Mein Objekt,welches ich setzen will, ist als Kind verbaut.
    Die eigentliche Translation bzw Rotation bekomme ich vom Parent. Das Problem hierbei ist nun, das mir der Parent immer nur die World Translation bzw World Rotation zurückgibt, dies kann ich auch nicht ändern, da es an der Engine liegt.
    Wenn ich mein Objekt nun mit setTranslation() bzw setRotation() neu setze, springt es mir quer über die Map, weil setTranslation und setRotation ja nur mein Object setzt, aber halt mit den vorher erhaltenen World Translations bzw World Rotations.


    Lösung wäre nun das Objekt einfach auf 0 0 0 zu setzen, was aber beim Einbau nicht immer geht, oder beachtet wird, gerade wenn es etwas verschachtelt aufgebaut ist. Zum Beispiel auch als kaufbares Object, dort kann man den Trigger nicht auf 0 0 0 setzen. Hier könnte man höchstens den Trigger auf die Position setzen wo er sein soll und dann diese Werte umkehren und in einer TG neu setzen, somit wäre man wieder bei 0 0 0, was aber wiederum den Nachteil hat, wenn man den Trigger etwas versetzt, dann muss man wieder neu anpassen.


    Jetzt meine eigentliche Frage, kann ich aus der World Translation bzw Rotation meine locale Translation rausrechnen? Oder besser gefragt wie mache ich das am besten?
    Ich habe dazu schon einige Versuche gestartet mit localToWorld(), worldToLocal(). Auch habe ich mir die WorldTranslation von meinem Objekt ausgeben lassen und hier versucht die andere WorldTranslation abzuziehen, aber leider klappte das irgendwie nicht.


    Hat da jemand einen Tip oder sogar einen passenden Code???

  • worldToLocal() wäre eigentlich schon das richtige..


    Und zwar folgendes:
    local x, y, z = worldToLocal(ID des Child das du bewegen willst,world x,world y,world z)


    worldToLocal rechnet die World Koordinaten um in lokale relativ zum angegebenen Objekt..
    localToWorld ist das selbe Prinzip nur eben anders herum...


    Sprich du hast beliebige Koordinaten (absolute, World) und willst wissen was diese Position lokal relativ zu Objekt X wäre.. worldToLocal.


    Ist doch das was du gesucht hast, oder? Deine Erklärung ist leider etwas schwierig nachzuvollziehen



    LG

  • Du hast das schon richtig verstanden und ich suche genau sowas. Wo ich absolute World Werte in lokale umwandele.


    Und ich habe es auch mit LocalToWorl probiert, aber da kommt nicht das bei raus was rauskommen soll.


    Mein Code sieht jetzt so aus:
    [lua] local x,y,z = getSplinePosition(splineId, splineTime);
    local rx, ry, rz = getSplineOrientation(splineId, splineTime, 0, -1, 0);

    setTranslation(meineChild_ID, worldToLocal(meineChild_ID,x,y,z));
    setRotation(meineChild_ID, worldDirectionToLocal(meineChild_ID,rx,ry,rz));
    [/lua]
    x,y,z bzw rx,ry,rz sind jeweils die absoluten World werte.


    Leider bewegt sich mein Objekt absolut nicht dahin wo es hin soll, es dreht mit großen Kreisen um die Achse und anstatt einen geraden Weg zu nehmen, bewegt es sich in einem ~45Grad Winkel weg vom eigentlichen weg.


    Dazu ein paar Bilder, der Weg sollte eigentlich auf der Spline entlang sein:


    Anfangen tun die Probleme schon damit das mein Objekt nicht längst sondern quer beim Start da steht. Auf den anderen Bildern sieht man mein Objekt nicht immer, da es sich irgendwie um eine Achse dreht.


    Ich habe jetzt zwar einen Weg gefunden, aber der gefällt mir nicht wirklich. Ich rechne jetzt etwas. Nehme mir die aktuelle Position auf der Spline, hole mir dann die nächste Position auf der Spline und ziehe dann aktuelle von der neuen ab und diese Differenz addiere ich zu meiner Aktuellen Objekt Translation hinzu.
    Zumindest funktioniert das so wie ich es eingebaut habe, ob das aber noch immer geht wenn ich die Spline in die entgegen gesetzte Richtung aufbaue, weiß ich aktuell noch nicht.

  • Ich denke du hast da eher ein Problem mit rotation und direction.. Aber das übersteigt auch mein Wissen. Ist auch nirgendwo erklärt z.b. anhand eines Beispiels, wo da die Unterschiede liegen..



    Hast du schon versucht die Rotation/Ausrichtung komplett weg zu lassen, und einfach nur die Position/Translation auf der Spline mit dem Objekt ab zu fahren, ob das fehlerfrei klappt?



    Und was für Rotationswerte sind das, die die getSplineOrientation Funktion her gibt? Auch absolute/World, oder relativ zur Spline..


    Wenn die getSplineOrientation Funktion tatsächlich Rotationswerte zurück.. Ist direction = rotation? Eigentlich ja nicht..



  • Du hast Recht, das drehen um die Achse ist ein Problem von Rotation und Direction.


    Die getSplineOrientation() gibt Rotationswerte zurück, denn in den Standartskripten (ship.lua, train.lua) wird danach mit den getSplineOrientation Werten die Rotation mit setRotation() gesetzt.
    Bei Giants ist aber halt die Spline entweder auf 0 0 0 bzw das Objekt dann genau unter der Map (in der Mitte) oder wird aus der XML geladen. Bei mir ist das Objekt selber halt in anderen TGs, womit ich dann das World Trans Problem bekomme.


    Wenn ich das setRotation auskommentiere, und nur setTranslation nutze, dann zittert mein Objekt vor und zurück während der Fahrt. Wenn ich die Werte mit localToWorld setze.


    Ich werde da einfach nochmal weiter testen, zur Not muss ich es einfach errechen. Wenn es denn dann auch geht wenn ich mein Objekt wo ganz anders platziere.


    Wenn das fehlschlägt dann muss ich meinen Aufbau einfach nochmal komplett überarbeiten und sehen das ich das Objekt direkt mit WorldTranslation bewegen kann, ohne irgendwas auszurechnen. Macht aber den Einbau etwas aufwendiger, auch für andere.

  • Hab eben mal ne teststrecke aufgebaut und sagen es läuft schön geschmeidig, aber die rotation stimmt noch nicht, der würfel wird gleich am anfang um 90° gedreht, das lässt sich aber bestimmt auch in den griff bekommen.


    edit:// in den griff bekommen:
    setRotation(self.cubeNode, rx, ry-math.rad(90), rz);


    edit2:// die richtung richtet sich nach dem blauen pivot pfeil, dieser zeigt in fahrtrichtung. stimmt der blaue pfeil nicht mit der fahrtrichtung des mesh (objekt) überein, kommt es zur ungewollten falschen ausrichtung und drehung.


    [lua]function Testspline:load(id)
    self.splineId = getChildAt(id, 0);
    self.cubeNode = getChildAt(id, 1);
    self.time = 0;

    local length = getSplineLength(self.splineId);
    self.timeScale = (Utils.getNoNil(getUserAttribute(id, "speed"), 5)/3.6);


    if length ~= 0 then
    self.timeScale = self.timeScale/length;
    end;
    end;


    function Testspline:update(dt)
    self.time = self.time + 0.001*dt*self.timeScale;
    local x,y,z = getSplinePosition(self.splineId, self.time);
    local rx,ry,rz = getSplineOrientation(self.splineId, self.time, 0, -1, 0);

    local wx, wy, wz = worldToLocal(getParent(self.cubeNode), x,y,z);

    setTranslation(self.cubeNode, wx, wy, wz);
    setRotation(self.cubeNode, rx, ry, rz);
    end;[/lua]

  • Funktioniert auf den ersten Blick sehr gut. Also lag mein Fehler lediglich im getParent() was bei mir fehlte.


    Habe das ganze jetzt so einfach mal gestest, das klappt soweit auch ganz gut. Einziges Problem was ich bei mir jetzt habe ist, das durch das -math.rad(90), an einem bestimmten Punkt (hinten in der Kurve), einmal das ganze model gedreht wird.
    Oder math.rad() habe ich das nicht, dann steht er nur verdreht da.
    Mein Aufbau ist allerdings etwas anders wie deiner. Mein Objekt befindet sich direkt in der Spline.


    Ich werde das ganze nochmal weiter testen, vielleicht reicht es auch einfach aus das ich die Spline um 90Grad drehe und neu setze, damit mein Objekt auch beim Start richtig dasteht.


    Danke jedenfalls für den entscheidenden Tip mit getParent()

  • Hm, bei mir sitzt er jetzt genau entgegen gesetzt.
    Spline läuft in die entgegen gesetzte Richtung des Roten Pivot Pfeils, das Objekt welches bewegt wird (ist bei mir eine TG mit den Teilen darin), ist auch entgegen dem blauen Pivot Pfeil platziert. Lediglich das Shape des Feeders (wird nicht direkt bewegt) blickt in Richtung blauer Pfeil.


    Es läuft jedenfalls exellent so... :thumbsup:

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!