Ausrichtung eines Fahrzeugs

Benutzeravatar
Jonny48
Beiträge: 16
Registriert: Di Nov 01, 2016 3:50 pm
Kontaktdaten:

Re: Ausrichtung eines Fahrzeugs

Beitragvon Jonny48 » Sa Nov 12, 2016 10:41 pm

Moin!
Hatte soeben einen Geistesblitz (keine sorge, dass kommt nicht so oft vor ;) )
man kann doch für die Rotationen einfach die Movingtools verwenden. Falls da rotMax und RotMin gefragt werden, kann man doch einfach immer 0 lassen, da durch dem Rest meines alignment scriptes der rigidbody type geändert wird und die kanone beim deaktivieren Dynamisch wird und auf den Boden fällt

Benutzeravatar
modelleicher
Schwabenleiter
Schwabenleiter
Beiträge: 2371
Registriert: Mo Jun 28, 2010 2:04 pm

Re: Ausrichtung eines Fahrzeugs

Beitragvon modelleicher » Sa Nov 12, 2016 11:50 pm

movingTools macht auch nichts anderes als setRotation ;)

Aber du kannst es ja mal ausprobieren :)


LG

Benutzeravatar
Jonny48
Beiträge: 16
Registriert: Di Nov 01, 2016 3:50 pm
Kontaktdaten:

Re: Ausrichtung eines Fahrzeugs

Beitragvon Jonny48 » Do Nov 17, 2016 5:13 pm

Ja aber die Movingtools verändern nur 1 achse die ich angebe. Unser Problem war es ja, dass eine aktuelle achse aus dem Spiel geladen werden sollte

Benutzeravatar
Jonny48
Beiträge: 16
Registriert: Di Nov 01, 2016 3:50 pm
Kontaktdaten:

Re: Ausrichtung eines Fahrzeugs

Beitragvon Jonny48 » Mo Dez 12, 2016 8:30 pm

Ok hab es mitlerweile mit modelleichers hilfe hinbekommen :D
Die Achsen im GE müssen eine ganz bestimmte richtung haben, damit setDirection funktioniert. Aber könnte mir einer setDirection noch mal genau erklären?. Das mit der Ausrichtung im GE hab ich nun verstanden, aber was genau verlangt setDirection und warum ist getWorldTranslation notwendig, damit sich die Kanone rotiert :?:
Ich danke vielmals um die Hilfe

Benutzeravatar
modelleicher
Schwabenleiter
Schwabenleiter
Beiträge: 2371
Registriert: Mo Jun 28, 2010 2:04 pm

Re: Ausrichtung eines Fahrzeugs

Beitragvon modelleicher » Mi Dez 14, 2016 11:31 am

Hi,

Super dass es geklappt hat :)

setDirection() erklären wird schwierig.. Wusste selbst lange Zeit nicht wie es genau funktioniert. Hatte es dann mal raus gefunden als ich im Sommer an der Seilwinde gebastelt hatte und mich mehr mit den ganzen Direction Zeugs beschäftigt hab. Aber hab seither die hälfte wieder vergessen.. :lol:
Kann also gut sein dass ich Mist erzähle... Aber ich versuche es mal.

setDirection(transformId, direction x, direction y, direction z, up vector x, up vector y, up vector z)

direction x, y, z ist die Richtung in die ausgerichtet werden soll. Der genaue Wert spielt keine Rolle, es wird einfach anhand der 3 Werte ausgerichtet. Das ganze ist im Grunde ein Vector.

Hier zur Verdeutlichung (Bild ist 2D also einfach noch ne Dimension dazu denken, und auch nicht im Maßstab.. )
Bild

Ob der direction Wert jetzt (0.5, 0.5) oder (1, 1) oder (0.1, 0.1) ist spielt keine Rolle. Die Richtung in die der Pfeil (bzw. das Objekt) zeigt ist immer die gleiche.
Im 3D Bereich wäre also (0.5, 0.5, 0.5) ein 45° Winkel in allen Achsen in positive Richtung von der 0 Position aus.


So, der upVector ist etwas schwieriger zu erklären. Im Grunde ist der UpVector die zusätzlichen 3 Dimensionen. Wenn du dich mit Joysticks auskennst sei es für Flugsimulator oder für LS etc..
X, Y, Z wären die direction Vectoren, Roll, Pitch und Yaw wären die up Vector Werte.

In einem 2D Bild ist das leider schlecht zu erklären.


Um deine Frage mit getWorldTranslation zurück zu kehren müssen wir wieder die Basics auspacken was World-Space und Local-Space angeht.

Wieder ein 2D Bild zu World Space vs. Local Space
Bild

Wie du siehst der blaue Punkt ist ein Child Objekt des orangenen Punkts. Die lokalen Koordinaten des blauen Punkts sind also immer relativ zum orangenen Punkt. (Koordinatensystem des orangenen Punkts, 0 ist Position des orangenen Punkts)
Während der orangene und der grüne Punkt Child Objekte von World sind, also keine weiteren Parent-Objekte haben ist bei den Objekten world Position und local Position die selbe. Da der blaue Punkt ein Parent-Objekt hat das nicht World ist sind bei ihm die world Position und die local Position unterschiedlich.

Die ganze Sache mit getWorldTranslation und worldToLocal und localToWorld usw. ist wie bei den Brüchen.. Auf den gemeinsamen Nenner bringen bevor man damit rechnet. Oder in dem Fall, schauen wie man am effizientesten/mit den wenigsten Aufrufen auf ein gemeinsames Koordinatensystem kommt.
Ebenfalls sind die meisten funktionen wie setDirection(), setRotation(), setTranslation() usw. lokal..


Wieder zurück zum Beispiel. Der Vektor für setDirection() wird anhand der Positionswerte berechnet.
Bild

Wenn wir jetzt nicht mit getWorldTranslation() die World Position auslesen, sondern nur mit getTranslation() die lokale Position.
Dann wäre die Position des grünen Punkts immer noch 0.75, 0.75 aber die Position des blauen Punkts 0.2 0.12
Das ergibt dann eine Direction von:
(0.75 - 0.2, 0.75 - 0.12) = (0.55, 0.63)
Wie du siehst würde das einen ganz anderen Direction Vector ergeben.

Daher wird zuerst in World Space gerechnet und am Ende wieder in local umgerechnet.


LG

Benutzeravatar
Jonny48
Beiträge: 16
Registriert: Di Nov 01, 2016 3:50 pm
Kontaktdaten:

Re: Ausrichtung eines Fahrzeugs

Beitragvon Jonny48 » Mi Dez 14, 2016 7:20 pm

Vielen Dank für die ausfürliche Beschreibung.
Aber ich versteh dennoch 2 was nicht ;)
Zum einen sagtest du ja, insofern ich es richtig verstanden habe, dass sich setDirection die Rotationswerte aus der Position des Objectes im lokalem Koordinatensystem nimmt.

Code: Alles auswählen

bx, by, bz = getWorldTranslation(self.alignmentNodes[id].nodeRO);

mit der Anweisung ermittelt das Spiel die Globale Position des Objectes in der Welt.
Nehmen wir mal an, dass diese 13 14 15 sind.
Also werden diese jetzt umgerechnet

Code: Alles auswählen

0, -100, 0 = worldDirectionToLocal(getParent(self.alignmentNodes[id].nodeRO), 13-13, 14-(14+100), 15-15);

Da die y achse, welche laut Rechnung immer -100 beträgt, die höhe verstellt, müsste doch, da ich jetzt mal davon ausgehen muss, setDirection doch gleich die -100 ins Spiel übernehmen. Also würde die Kanone entweder in der Luft oder im Boden sein. Theoretisch.
Damit das nicht passiert, muss worldDirectionToLocal doch die werte so umwandeln, dass aus der -100 genau die gleiche höhe wie bei der aktuellen Position in der Welt rauskommen. Sonst würde ja auch der Quellcode einfach lauten:

Code: Alles auswählen

x, y, z = bx-bx, by-(by+100), bz-bz;

Daher ist meine Frage, wie die Funktion die immer gleiche -100 in einen verwendbaren wert umwandelt. Oder ist mit -100 die Differenz zwischen dem Lokalen und dem Globalen koordinatensystem gemeint?

Und 2. sind die Up Vectors die einzelnen Achsen, welche man mit 1 oder 0 auswählt?

Sorry, aber setDirection ist mir leider noch fremd. :P

Benutzeravatar
modelleicher
Schwabenleiter
Schwabenleiter
Beiträge: 2371
Registriert: Mo Jun 28, 2010 2:04 pm

Re: Ausrichtung eines Fahrzeugs

Beitragvon modelleicher » Fr Dez 16, 2016 10:42 am

Moin..

Öhm.. Mhh :D

setDirection() ist nicht setTranslation() die Position des Objektes wird nicht beeinflusst. Lediglich die Richtung. Die Richtung wird über das ändern der Rotationswerte beeinflusst, die Funktion ist also dichter an setRotation() als an setTranslation().

In sofern spielen die -100 auch keine Rolle.
Globale Y -100 wären immer exakt senkrecht nach unten im Verhältnis zur Welt, zur absoluten "Ebene".
Lokale Y -100 wären immer exakt senkrecht nach unten im Verhältnis zum Objekt selbst. Sprich wenn du im GE ein Objekt um 90° drehst und dann in der Y Achse um 2m verschiebst dann schiebt es sich nach links/rechts oder vor/zurück je nach dem welche Achse du gedreht hast, nicht nach unten wie wenn es auf 0 0 0 rotiert ist.
EDIT: Ob -100 oder -1 sollte keine Solle spielen so lange die anderen beiden Werte des Vectors 0 sind. Die Richtung wird ja aus den 3 Werten errechnet und so lange alle drei die selbe Skalierung haben spielt die Höhe bzw. der Wertebereich keine Rolle.


Du kannst folgendes eigentlich auch abkürzen:
local bx, by, bz = getWorldTranslation(self.alignmentNodes[id].nodeRO);
local x, y, z = worldDirectionToLocal(getParent(self.alignmentNodes[id].nodeRO), bx-bx, by-(by+100), bz-bz);

so:
local x, y, z = worldDirectionToLocal(getParent(self.alignmentNodes[id].nodeRO), 0, 100, 0);

Das erstere bräuchte man nur wenn man auf den anderen Achsen noch eine lokale Position mit einfließen lassen würde. Das hab ich bei meinem ersten Post dazu nicht beachtet :oops:
Funktionieren tun natürlich beide Varianten da bx-bx automatisch 0 ist..

worldDirectionToLocal() brauchst du allerdings, da wie in meinem Beispiel im letzten Post ein Unterschied zwischen lokaler und globaler Richtung ist. (Und wie man in meinem 90° Beispiel hier sehen kann)

Würdest du einfach nur setDirection(transform, 0, 100, 0, 0, 0, 1) machen würde das Teil sich relativ zum lokalen Koordinatensystem des Parent-Objekts ausrichten. Wenn das Parent-Objekt dann nicht auf 0 0 0 rotiert ist dann würde sich das Objekt eben nicht senkrecht nach oben ausrichten. Daher das ganze mit world space to local space..


Und 2. sind die Up Vectors die einzelnen Achsen, welche man mit 1 oder 0 auswählt?

Mhh.. ja und nein. Auch das ist wieder ein Vector d.h. die Richtung wird anhand der 3 Werte bestimmt. Theoretisch kannst du aber nur die Z Achse auswählen (Oder Z und X?) weil die anderen Achsen ja von der direction beeinflusst werden. Auch hier bin ich etwas überfragt da seither einfach immer die Z Achse genutzt.
Wenn du z.b. den upVector auf -1 machst müsste sich das Objekt um 180° drehen und dabei immer noch mit der positiven Z Achse ausgerichtet sein.
Wenn du ne Kamera nimmst und die auf z.b. ein Auto ausrichtest.. Dann die Camera seitlich um 90° drehst sodass das Bild hochkant wird aber du immer noch das Auto siehst.. Diese Drehung wird vom upVector beeinflusst. 180° dann ist das Bild auf dem Kopf usw..
Weiß nicht wie ich es anders erklären soll ;)


LG

Benutzeravatar
Jonny48
Beiträge: 16
Registriert: Di Nov 01, 2016 3:50 pm
Kontaktdaten:

Re: Ausrichtung eines Fahrzeugs

Beitragvon Jonny48 » Fr Jan 20, 2017 10:21 pm

Hey,
erstmal an alle ein gesundes Neues :D
Neues Jahr neues Glück.
Also das mit der ausrichtung hat nun Funktioniert. Allerdings schob sich ein Problem wieder ein, welches wir vorher nicht beachtet haben... das collisionObject.
Und zwar basiert die Rotation ja auf einer Untergruppe des eigentlichen collisionObjects. Wenn ich das Fahrzeug nun ausrichte, wird dies zwar senkrecht dargestellt, aber das CollisionObject bleibt am Boden. Wenn ich die Aurichtung nun deaktiviere bleibt das Fahrzeug auf dem fleck wo es steht -> aufgrund des collisionObjects, welches nun die Position bestimmt.
Nachdem ich jetzt viele Rechnungen durchgeführt habe, um im lokalem Koordinatensystem gegenzuwirken, wäre es doch aber eigentlich sinvoller, dass das collisionObject gleichzeitig das rotObject ist.
Da der SRS die Fahrzeuge ja mit einer neutralen 0 0 0 stellung läd, würde das Fahrzeug umgedreht auf der Map erscheinen, da dieses ja im GE aufgrund von setDirection um 90 Grad gedreht werden musste.
Nun ist meine Frage. Könnte man nicht ein Mapscript Programmieren, welches das Fahrzeug erkennt und sobalt es gekauft worden ist und dies noch um die 90 Grad dreht?
Vorteil des Ganzen: Das objekt wird in dem Koordinatensystem gedreht, wo auch setDirection wirkt und man kann sich lästige Gruppierungen im GE sparn.
Sollte dies aber auch mit einer ähnlichen setDirection funktion funktionieren, dann ziehen wir diese, je nach aufwand, jedoch vor ;)


Zurück zu „Fragen und Probleme rund ums Modding“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast