Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
11.05.2002, 15:36
thinktank



So komisches Prob =) :

Ich will einen Vector machen, der mitten im Player liegt ( clientside). Dazu hab ich 1. v_right 2. v_forward benutzt. Nur bei v_forward würde sich dieser Vector ja verändern, wenn ich in die Luft ziele. Deshalb wollte ich in ihn 2d machen bzw. unäbhängig von der Z-Koordinate.
Quellcode:
AngleVectors(args->angles, forward, right, NULL);
    VectorCopy(args->origin, vecSrc);
    vecSrc = vecSrc + right * -20;
    vec3_t forward_2d = forward;
    forward_2d.z = 0;
    gEngfuncs.Con_Printf(" x : %f, y %f , z :%f\n", forward.x, forward.y, forward.z);
    vecSrc = vecSrc + forward_2d * -40;

Dabei hab ich bemerkt, dass sich forward.x und forward.y auch verändern,
wenn ich nach oben ziele. Hab ich jetzt die Sache mit den v_'s falsch verstanden ? Ich dachte das wären 1 Unit lange Vectoren , die senkrecht aufeinander sind und jeweils nach "rechts", "oben" und nach "vorne" zeigen.

--


Dieser Beitrag wurde am 11.05.2002 um 15:37 von thinktank bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
11.05.2002, 16:40
TheTinySteini



Zitat:
Ich dachte das wären 1 Unit lange Vectoren , die senkrecht aufeinander sind und jeweils nach "rechts", "oben" und nach "vorne" zeigen.

Ja, genau. Und nun überleg mal ganz scharf und zeichne dir's am besten mal auf Papier auf. Dann wirst du merken, x und y müssen sich sogar ändern, wenn du nach oben guckst!
Du kannst aber ohne weiteres die z-Komponente auf 0 setzen und dann den restlichen Vektor nochmal normalisieren.

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
002
11.05.2002, 18:24
thinktank



Stimmt. Von oben gesehen verkürzt er sich. Danke !

Hmm ich hab mir die Funktion von Normalize() angeschaut.
Ich verstehe nicht ganz, warum man x* 1/Len , y * 1/Len und z* 1/Len nehmen muss. Hängt das mit den trigonometrischen Funktionen zusammen oder mit dem Satz des Pythagoras ?

[edit]
Jetzt siehts so aus :
Quellcode:
int idx = args->entindex;
vec3_t vecSrc, right, forward;
AngleVectors(args->angles, forward, right, NULL);
VectorCopy(args->origin, vecSrc);
vecSrc = vecSrc + right * -20;
vec3_t forward_2d = forward;
forward_2d.z = 0;
forward_2d.Normalize();
gEngfuncs.Con_Printf(" x : %f, y %f , z :%f\n", forward_2d.x, forward_2d.y, forward_2d.z);
vecSrc = vecSrc + forward_2d * -40;

Jetzt ändern sich forward_2d.x und forward_2d.y immer noch, wenn ich nach oben schaue.
Hab ich jetzt wieder was falsch verstanden ( hab sogar Skizzen gemacht =) !) ?
[/edit]

--


Dieser Beitrag wurde am 11.05.2002 um 19:04 von thinktank bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
003
11.05.2002, 19:31
Archangel



falls ich dich richtig verstanden habe:
für das was du machen willst, brauchst du einfach nur den pitch (neigungs) wert auf 0 zu setzen, also:

vec3_t angles;

VectorCopy(args->angles, angles);
angles.x = 0.0f;

AngleVectors(angles, forward_2d, right, NULL);

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005


Dieser Beitrag wurde am 11.05.2002 um 19:31 von Archangel bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
004
11.05.2002, 19:53
thinktank



Hmmm es funzt, aber wo liegt der Unterschied zwischen meiner "Lösung" und deiner ?

--

zum Seitenanfang zum Seitenende Profil || Suche
005
11.05.2002, 19:57
Archangel



du brauchst den vektor nicht erneut zu normalisieren..

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005

zum Seitenanfang zum Seitenende Profil || Suche
006
11.05.2002, 22:01
TheTinySteini



Btw: Normalize bringt den Vektor einfach wieder auf Länge 1. Dazu berechnet man die Länge des Vektors (da muss man leider ne Wurzel ziehen -> langsam) und teilt dann den Vektor durch seine Länge.
Als Beispiel an ner Zahl (also nem 1-dimensionalen Vektor):
|2| = 2
2 / 2 = 1
Einfach, hä? =)

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
007
13.05.2002, 18:52
thinktank



@Archangel :

Komischerweise gings aber mit Normalisieren NICHT, also x und y haben sich immer noch geändert :/ . Das ist ja gerade das komische. Dass deine Lösung einfacher ist, hab ich sogar noch gecheckt :P.

@TTT :

1-dimensionale Vektoren sind ja einfach =). Dass man den Vektoren durch
Normalisieren auf die Länge 1 bringt war mir vorher auch schon klar ( und dass man dazu den Vektor mal seinen Kehrwert nehmen muss auch ... ). Aber warum x, y und z jeweils mit 1 / Length multiplizieren ? Wie hängt das zusammen ? Das hängt zwar mit meinem Problem überhaupt nicht zusammen, aber ich wills trotzdem wissen =).

Also hier nochmal beide Lösungen :

Diese funktioniert NICHT :

Quellcode:
VectorCopy(args->angles, angles);
AngleVectors(angles, forward, right, NULL);
forward_2d = forward;
forward_2d.z = 0;
forward_2d.Normalize();
vecSrc = vecSrc + forward_2d * -40;

Diese funktioniert :

Quellcode:
VectorCopy(args->angles, angles);
angles.x = 0.0f;
AngleVectors(angles, forward_2d, right, NULL);
vecSrc = vecSrc + forward_2d * -40;

Warum funktioniert also die eine, aber die andere nicht ?

--


Dieser Beitrag wurde am 13.05.2002 um 18:52 von thinktank bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
008
13.05.2002, 20:59
TheTinySteini



Zitat:
( und dass man dazu den Vektor mal seinen Kehrwert nehmen muss auch ... ). Aber warum x, y und z jeweils mit 1 / Length multiplizieren ? Wie hängt das zusammen ?

Tja, Vektorrechnung. Nimm a als einen Vektor und r als eine reelle Zahl, ja? Dann ist das Produkt aus a und r so definiert (o_O, ASCII ART!):

Quellcode:          / a1 \   / r * a1 \
r*[u]a[/u] = r * | a2 | = | r * a2 |
          \ a3 /   \ r * a3 /

Jetzt klar, warum man die einzelnen Koordinaten durch die Länge teilt, wenn man den gesamten Vektor durch die Länge teilt?

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
009
13.05.2002, 23:00
Another1



bei deiner ersten möglichkeit veränderst du den vorwärtsvector, indem du ihm seine Z komponente klaust, der zeigt von daher nun nichmehr 'vorwärts' sondern irgendwohin (so ziemlich). Bei der 2. variante machst du es richtig. angles is nämlich !kein! vector im mathematischen sinne, sondern nur eine sammlung von 3 winkeln, gespeichert in einer vektorstruktur (X = PITCH(hoch runter) Y=YAW(links,rechts) Z=ROLL(nach links/rechts kippen)). Du setzt pitch auf null, wodurch der aus dem angle resultierende vektor nich mehr nach oben/unten wegschaut, sondern genau 'am boden entlang' (den vektor kriegst du da über AngleVectors)

--

Another1

...relaxing..atm =)
... und Schweiz suckt!

zum Seitenanfang zum Seitenende Profil || Suche
010
14.05.2002, 15:01
thinktank



@TTT :
Sorry, leider hast du mich immer noch nicht verstanden =(.
[edit]
Sorry , ich hab was falsches gesagt =( :

Zitat:

[Ich weiß,]dass man dazu den Vektor mal seinen Kehrwert nehmen muss auch

[/edit]
Ich weiß, wie man einen Vektor mit einer Zahl multipliziert. Aber warum muss man x, y und z mit 1/ Länge multiplizieren ?

Ich versuchs zu erklären :
( Ich gehe hier von einem 2d-Vektor aus )

L = Länge

dann ist :

L² = x² + y² bzw.
L = sqrt(x² + y²)
L = sqrt((x/L)² + (y/L)²) | ^
L² = (x/L)² + (y/L)²
L² = x²/L² + y²/L² | * L²
L^4 = x² + y² // Wie gehts weiter ?

Hier sollte doch eigentlich 1 rauskommen , oder :/ ?

@Another1 :

Achso, ich dachte der v_forward wäre relativ zum Player. Danke !

--


Dieser Beitrag wurde am 14.05.2002 um 15:05 von thinktank bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
011
14.05.2002, 15:21
TheTinySteini



Zitat:
Achso, ich dachte der v_forward wäre relativ zum Player. Danke !

Hmja, ist er eigentlich auch... Hab auch net gerafft, warum das nicht klappt. Aber egal, die Lösung mit den Winkeln is sowieso schöner.

Zitat:
L² = x² + y² bzw.
L = sqrt(x² + y²)
L = sqrt((x/L)² + (y/L)²) | ^
L² = (x/L)² + (y/L)²
L² = x²/L² + y²/L² | * L²
L^4 = x² + y² // Wie gehts weiter ?

Da ist ein Denkfehler drin, ind er dritten Zeile. Du hast dort nur einen Buchstaben für L, aber es sind zwei verschiedene Ls! Das eine L links vom Gleichheitszeichen ist die Länge des normalisierten Vektors, das andere ist die Länge des nicht normalisierten Vektors.
Lies am besten mal hier unter "Vektoren im 3-dimensionalen Raum".

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
012
14.05.2002, 17:22
Another1



er ist relativ zum player, trotzdem kannst du nich einfach z auf null setzen. Dann stimmt nämlich, wenn du danach normalisierst, das verhältnis x:y nich mehr und der vector hat seine richtung geändert, kapiche?

--

Another1

...relaxing..atm =)
... und Schweiz suckt!

zum Seitenanfang zum Seitenende Profil || Suche
013
14.05.2002, 18:00
thinktank



@ TTT

Jetzt versteh ich gar nichts mehr :\

Ich dachte, wenn ich diese Gleichung gescheit auflöse kommt immer
1 auf der anderen Seite raus. Naja da bleibt mir nur eine Lösung übrig :
Mathe-Lehrer fragen =).

@A1
Leider nein =( . x und y werden doch immer mit dem gleichen Faktor multipliziert ( 1 / Länge ). Wie kann sich da das Verhältnis ändern ?

--

zum Seitenanfang zum Seitenende Profil || Suche
014
17.05.2002, 13:16
thinktank



@TTT :

Die Frage ist geklärt. Mein Lehrer konnte es mir erklären =).
Um sich das vorzustellen, barucht man nämlich nichts anderes als
den Strahlensatz !

@A1

Die Frage bleibt offen =(.

--

zum Seitenanfang zum Seitenende Profil || Suche