punkt rotieren (zentrum abh.)

Neue Frage »

jLn Auf diesen Beitrag antworten »
punkt rotieren (zentrum abh.)
hi! ich bin zum glück durch zufall auf dieses board gekommen und hoffe sehr, dass man mir hier helfen kann! smile

ich programmiere gerade einen radar für ein spiel, aber leider keinen normalen radialen radar, sondern einen, der das terrain von oben zeigt und sich immer mit den viewangles (yaw) des spielers dreht. ohne rotation des karten-radars habe ich alles funktionsfaehig: alle punkte werden erfolgreich von 3d nach 2d konvertiert und richtig auf der karte angezeigt.
das rotieren der karte selber ist auch ueberhaupt kein problem, aber leider funktioniert die methode, mit der ich die punkte rotieren lassen moechte nicht so ganz wie ich will!

ich werde einfach mal in pseudo code meine rechnung kommentiert darstellen smile

1. der winkel wird um 90 grad gedreht und dann ins bogenmass uebersetzt:
alpha = (sichtwinkel[YAW] + 90.0f) * PI / 180;

2. der mittelpunkt der karte wird berechnet:
MittelpunktX = RadarX + RadarBreite/2
MittelPunktY = RadarY + RadarHoehe/2

3. die distanz zwischen dem mittelpunkt und dem alten, noch nicht rotierten punkt wird berechnet um diese spaeter als radius zu nutzen:
Radius = wurzel((MittelPunktX - altX)^2 + (MittelPunktY - altY))

4. ein neuer punkt wird mit hilfe des radius, des winkels und cos/sin erstellt:
neuX = Radius * cos(alpha)
neuY = Radius * sin(alpha)

5. der neue punkt wird mit dem mittelpunkt in verbinnung gebracht um einen endgueltigen punkt zu erhalten (achtung ich vermute den fehler hier verwirrt ):
endeX = neuX + MittelPunktX
endeY = neuY + MittelPunktY

fuer diejenigen unter euch, die der programmiersprache c++ maechtig sind ist hier der link zu dem code snippet: ->link <-

ich hoffe dass mir jemand helfen kann und dass ich nicht zu viele umstaende gemacht habe, weil ich nur pseudo code benutzt habe und nicht dieses latex!

dnake im vorraus, jLn
jLn Auf diesen Beitrag antworten »

sorry fuer diesen doppelpost, aber ich bin noch nicht registriert und kann deshalb nichts editieren!

der fehler in
"
3. die distanz zwischen dem mittelpunkt und dem alten, noch nicht rotierten punkt wird berechnet um diese spaeter als radius zu nutzen:
Radius = wurzel((MittelPunktX - altX)^2 + (MittelPunktY - altY))
"
war nur ein tippfehler, es muss natuerlich richtig so sein:
Radius = wurzel((MittelPunktX - altX)^2 + (MittelPunktY - altY)^2)
jLn Auf diesen Beitrag antworten »

Gott bitte, bitte, ich brauche unbedignt hilfe dieser fehler stockt schon wochen lang den fotschritt meines games unglücklich

die punkte drehen sich zwar mit der karte,a ber leider an falschen stellen :|
Poff Auf diesen Beitrag antworten »

Ohne eine gute Skizze ((oder ausführlicherer Erklärung)) ist da nicht
richtig durchzusteigen wie das nun wirklich gemeint ist, bzw abläuft.
Ich kann mir darunter nur wenig vorstellen ...
Das dürfte auch der Grund sein warum nichts kommt.
etzwane Auf diesen Beitrag antworten »

Ohne Zeichnung/Skizze wird dir hier wohl keiner helfen können.

Könnte es eine einfache Koordinatentransformation sein in der x-y-Ebene ? Dann hätte ich hier einen Scan aus meiner Formelsammlung, vielleicht hilft es ja.

Ansonsten müsstest du dein Problem deutlicher beschreiben. Ich z.B. bin verwirrt von Mittelpunkt, altem noch nicht rotierten Punkt, neuer Punkt, endgültiger Punkt.
jLn Auf diesen Beitrag antworten »

ok, ich hoffe diese skizzen werden helfen smile

die erste skizze zeigt die karte und punkte auf der karte ohne rotation:
skizze1

die zweite skizze zeigt die karte rotiert aber die punkte auf der alten position:
skizze2

die dritte skizze zeigt die karte und die punkte rotiert, das heisst so wie es im endeffekt aussehen soll:
skizze3

mit mittelpunkt meine ich uebrigens die mitte der karte!
 
 
Poff Auf diesen Beitrag antworten »

Ich vermute mal die Punkte sollen bei der Drehung in ihrer Lage fix
auf der Karte verbleiben ...

unbesehen davon ob der Mittelpunkt stimmt oder nicht??, so scheint
mir dies evtl falsch

1. der winkel wird um 90 grad gedreht und dann ins bogenmass uebersetzt:
alpha = (sichtwinkel[YAW] + 90.0f) * PI / 180;



4. ein neuer punkt wird mit hilfe des radius, des winkels und cos/sin erstellt:
neuX = Radius * cos(alpha)
neuY = Radius * sin(alpha)




du drehst rechtsrum, da sollte es treffender
alpha = (sichtwinkel[YAW] - 90.0°) * PI / 180;
heißen.

Weiters bleibt das Problem, dass mir nicht sichergestellt erscheint,
dass alpha auch tatsächlich mit dem entsprechenden anliegenden
Winkel am Kreis in Bezug auf M übereinstimmt.



Probier das mal so aus (nur als Versuch)

alpha2 = arctan((altY-MittelPunktY)/(altX-MittelPunktX))
die arctan funktion sollte alpha2 im Bogenmaß ermitteln, oder zumidest
klar sein wie sie das zurückgibt. (arctan(1) = Pi/4 oder 45°)


4. ein neuer punkt wird mit hilfe des radius, des winkels und cos/sin erstellt:
neuX = Radius * cos(alpha2-Pi/2) oder Radius * cos(alpha2-90°)
neuY = Radius * sin(alpha2-Pi/2) oder Radius * sin(alpha2-90°)


das sollte der Fehler gewesen sein. Wenn ja dann lässt sich das noch
anders darstellen .... probiers aber erstmal so ....
.
jLn Auf diesen Beitrag antworten »

hm, leider garnicht, die formel mit dem arc. tan rotiert den punkt ueberhaupt nicht, meine mit den viewangles drinnen rotiert ja wenigstens in gleicher weise wie die karte unglücklich trotzdem danke fuer die rasche antwort, ich werde noch ein wneig damit herumexperimentieren! :>
Poff Auf diesen Beitrag antworten »

Vielleicht stimmt auch der Mittelpunkt nicht.

Dreh mal versuchsweise um NULL Grad (mit DEINEM System), wenn
dabei die Punkte versetzen, dann stimmt der Mittelp oder Winkel nicht.

Weiters bleibt unklar was mit den Punkten nun wirklich geschehen soll?
Sollen die nun fix mit der Karte mitdrehen, oder nicht, oder wie oder
was. Was ist mit den Mittelpunkten, gibts da verschiedene ? Wenn ja,
warum, wie und wieso ...

Was ist dein 'viewangle' ... das sind alles Dinge die nicht richtig
einordenbar sind ...
.



PS hm, leider garnicht, die formel mit dem arc. tan rotiert den punkt ueberhaupt nicht

das kann eigentlich NICHT sein, da muss irgendeine Verwirrung
vorliegen. Der arctan misst sozusagen die vorherige Lage aus um dann
die Drehung darauf aufzusetzen. Das Ziel dabei ist FIX mit der Drehung
der Karte mitzudrehen .... wenn du anderes willst, musst das schon
klarer artikulieren und insbesondere WIE das genau werden soll.

Vor jeder weiteren Drehung muss selbstverständlich dem alpha2
der neue, aktuelle Wert, zugewiesen werden !!
jLn Auf diesen Beitrag antworten »

also die punkte sollen fix auf der karte liegen. mit yaw-viewangles ist einfach die links bzw rechtsdrehung des spielers gemeint, die sichtweise sozusagen.
aber wie soll denn der mittelpunkt falsch sein? die x/y koordinate sowie die breite/laenge des radars (also jetzt der karte) sind fix. die punkte bewegen sich veraendern aber ihre position, da andere spieler auch nicht still stehen.

EDIT:
also wenn ich alpha gleich 0 setze wandert der punkt natuerlich auf der x achse, da cos(0) ja gleich 1 ist und deshalb die x-koordinate des neuen punktes gleich dem radius ist!

EDIT 2:
langsam kann ich mir denken woran es liegt: alpha kann auch negativ sein, und cos ist sozusagen vorzeichen unabhaengig. ich hoffe dass ich damit weiterkomme!
Poff Auf diesen Beitrag antworten »

Wenn du Karte und Punkte um Null° WEITERdrehst

>>1. der winkel wird um .. grad gedreht und dann ins bogenmass uebersetzt:
alpha = (sichtwinkel[YAW] +NULL) * PI / 180;<<

und sichtwinkel[YAW] sei KONSTANT

dann darf sich NICHTS tun.




Anderer Ansatz:

Wenn du Karte und Punkt um einen Winkel beta drehen willst,
der Mittelpunkt der Drehung vor, bei und nach der Drehung
M(mx|my) und der Punkt vor der Drehung P(px|py) ist, dann sieht
das so aus:

alpha = arctan((py-my)/(px-mx))
R=wurzel( (py-my)^2+(px-mx)^2 )

pxNeu=R*cos(alpha+beta)
pyNeu=R*sin(alpha+beta)

Pneu(pxNeu+mx|pyNeu+my)

sollte so stimmen
.
jLn Auf diesen Beitrag antworten »

danke! Gott
dein letzter ansatz funktioniert einfach perfekt, bis zu dem zeitpunkt an dem die y-koordinate des neuen punktes kleiner als die y-koordinate des mittelpunktes ist. aber ich denke das haengt dann von den winkeln oder werten ab und ich sollte das selber herausfinden! 1000 dank fuer die vielen ansaetze, ich weiss dass meine mathematischen erklaerungen meist sehr unklar sind Augenzwinkern

EDIT: habs warhscheinlich schon, wenn alpha positiv ist, hoerts auf zu funktionieren! ;D
Poff Auf diesen Beitrag antworten »

Zitat:
Original von jLn
danke! Gott
dein letzter ansatz funktioniert einfach perfekt, bis zu dem zeitpunkt an dem die y-koordinate des neuen punktes kleiner als die y-koordinate des mittelpunktes ist.



ja das hängt mit Problemen der arctan funktion zusammen und damit,
dass die ALLEINE das garnicht leisten kann. Wenn sie so arbeitet wie
ich vermute, dann müsste das folgendermaßen zu beheben sein.
(Bei y-Werte SOLO kleiner Null sollte es sogar funktionieren.)


wahrscheinliche Variante
alpha = arctan((py-my)/(px-mx))
if (px-mx)<0 then alpha=alpha+Pi (bzw +180°)

R=wurzel( (py-my)^2+(px-mx)^2 )
...


aber egal, sollte das so nicht wollen, dann ist's dennoch kein Problem
mehr, weil die Problematik nun erkannt und sich dann auch beseitigen lässt.
.


EDIT:
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »