punkt rotieren (zentrum abh.) |
27.05.2005, 05:49 | jLn | Auf diesen Beitrag antworten » | ||
punkt rotieren (zentrum abh.) 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 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 ): 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 |
||||
27.05.2005, 05:51 | 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) |
||||
27.05.2005, 15:57 | jLn | Auf diesen Beitrag antworten » | ||
bitte, bitte, ich brauche unbedignt hilfe dieser fehler stockt schon wochen lang den fotschritt meines games die punkte drehen sich zwar mit der karte,a ber leider an falschen stellen :| |
||||
27.05.2005, 16:43 | 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. |
||||
27.05.2005, 16:47 | 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. |
||||
28.05.2005, 00:07 | jLn | Auf diesen Beitrag antworten » | ||
ok, ich hoffe diese skizzen werden helfen 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! |
||||
Anzeige | ||||
|
||||
28.05.2005, 01:40 | 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 .... . |
||||
28.05.2005, 02:23 | 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 trotzdem danke fuer die rasche antwort, ich werde noch ein wneig damit herumexperimentieren! :> |
||||
28.05.2005, 02:53 | 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 !! |
||||
28.05.2005, 03:09 | 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! |
||||
28.05.2005, 04:01 | 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 . |
||||
28.05.2005, 05:15 | jLn | Auf diesen Beitrag antworten » | ||
danke! 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 EDIT: habs warhscheinlich schon, wenn alpha positiv ist, hoerts auf zu funktionieren! ;D |
||||
28.05.2005, 11:45 | Poff | Auf diesen Beitrag antworten » | ||
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: |
|