Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 22.08.2003, 14:45 Titel: Stufenlose Rotation (inkl. 30kb-Bild, nur als Warnung ;)) |
|
|
Hallo,
sagt mal hat von euch jemand ne Ahnung, wie ich eine Stufenlose Rotation bewerkstelligen koennte? Das Problem dabei ist ein Zielvektor. Ich meine Stufenlos rotieren waehrend man eine Taste drueckt ist ja weniger schwer, aber ich moechte meine Objekte an einem Zielvektor ausrichten.
Beispielsweise klicke ich auf eine 2D-Karte irgendwo hin, daraus entsteht dann ein Zielvektor. Jetzt kuckt dann mein Objekt mit der Nase nach Norden, der Zielvektor zeigt nach Suedosten. Dort bewegt sich das Objekt dann auch hin, aber mit der Nase nach Norden eben. Ich weiß jetzt auch nicht, wie ich einer Rotationsroutine sagen soll, wo die Nase dann hinzeigt, wenns stufenlos ist. Alternativ koennte man ja nur Werte a la 0, 30, 60, 90 usw. Grad zulassen, aber das sieht natuerlich nicht sehr schick aus....
Ach ja. Rotation muss erstmal nur im Y-Bereich stattfinden
Also um eine Hilfe waere ich super dankbar....
Zuletzt bearbeitet von X-FILE am 31.08.2003, 11:58, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 22.08.2003, 20:13 Titel: |
|
|
Ich verstehe die Frage nicht ganz. Soll sich das Objekt so lang drehen, bis es den Zielvektor erreicht hat, oder was? _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 22.08.2003, 20:39 Titel: |
|
|
Hmpf ich befuerchtete, dass das keine kapiert so wie ich das wieder formuliere
Ja aber so in etwa stimmt es. Mit dem Unterschied, dass er nicht den Ort des Zielvektors erreichen soll und sich dreht, sondern nur den Zielvektor nutzt um sich zu orientieren. Also so denk ich mir das.
Nehmen wir nochmal das Klickbeispiel. Ich haette gerne den Zielvektor des klicks als Orientierungs"hilfe". D.h. wo die Maus hingeklickt hat (rechts oben, links unten usw.... um das Objekt eben rum) soll sich die Nase orientieren.
Aehnlich wie Christians Spritedrehung auf der Stelle, nur eben ohne Tastatur, sondern eben mit Mausklickausrichtung
Das Problem ist, dass ich nicht einfach die Koordinaten des Mausklicks als Ausrichtung nehmen kann, weil ja meine Nase auch keine Ausrichtung in dem Sinne hat. Sondern nur den Winkel 0,0 (X,Y)...
Hoffe das war etwas besser.... |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 23.08.2003, 11:31 Titel: |
|
|
Hm...da hilft wahrscheinlich am Besten Sinus und Cosinus(hatte das noch net in der Schule). Deshalb kann ich dir jetzt schlecht weiterhelfen _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 23.08.2003, 21:02 Titel: |
|
|
Code: |
double TargetToAngel(double startx,double starty,double zielx,double ziely, double ow=0)
{
double z=0.0174532925199433;
double x=zielx-startx;
double y=ziely-starty;
if(x==0)
{
if(y==0)
return ow;
if(y>0)
return 90;
if(y<0)
return 270;
}
if(y==0)
{
if(x>0)
return 0;
if(x<0)
return 180;
}
if((x>0) && (y>0)) //NO
return atan(y/x)/z;
if((x<0) && (y>0)) //NW
return 180+atan(y/x)/z;
if((x>0) && (y<0)) //SO
return 360+atan(y/x)/z;
if((x<0) && (y<0)) //SW
return 180+absf(float(atan(y/x)/z));
return ow;
}
|
Müsste noch optimoert werden da der code ziemlich alt ist.
ow ist der wert der zurücjgegeben wird wenn ein berechnungsfehler auftritt (am besten den alten winkel)
Und der Code ist auf Grad und nicht auf Bogenmaß ausgelegt (sorry) |
|
Nach oben |
|
|
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 23.08.2003, 21:50 Titel: |
|
|
Hey spitze!! Danke dir. Ich werd mir das mal durchkucken, weil so auf Anhieb (2 Minuten) hab ichs ned verstanden, aber wenns Fragen gibt, poste ich
Danke... |
|
Nach oben |
|
|
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 25.08.2003, 01:09 Titel: |
|
|
Hallo,
@FallenAngel84. Ich hab mir das jetzt mal alles durchgesehen. So weit so gut, aber ein paar kleine Fragen waeren da noch. Fuer eine Antwort waere ich super dankbar:
1.
Code: |
double z=0.0174532925199433;
double x=zielx-startx;
double y=ziely-starty;
|
Ok. Hier setzt du ja den Zielpunkt(vektor), den dein Objekt eigentlich hat. Hat es einen bestimmten Grund, warum du z so Imaginaer belegt hast??
2.
Code: |
if(x==0)
{
if(y==0)
return ow;
if(y>0)
return 90;
if(y<0)
return 270;
}
if(y==0)
{
if(x>0)
return 0;
if(x<0)
return 180;
}
|
Diese Abfragen - hmmm. Den Sinn habe ich nicht so ganz begriffen. Wozu sind die denn eigentlich gut? Ich weiß zwar was du da tust, aber wozu? Kann ich das nicht weglassen? Sorry, wenns ne echt dumme Frage ist, aber ich verstehs wirklich nicht. Oder behandelst du hier die Spezialfaelle, wenn ich zufaellig genau die Achsen treffe mit meinem Ziel?
Code: |
if((x>0) && (y>0)) //NO
return atan(y/x)/z;
if((x<0) && (y>0)) //NW
return 180+atan(y/x)/z;
if((x>0) && (y<0)) //SO
return 360+atan(y/x)/z;
if((x<0) && (y<0)) //SW
return 180+absf(float(atan(y/x)/z));
return ow;
|
Nur das ich hier richtig liege. Du berechnest also den ArcusTangens zu dem jeweiligen Punkt und erhaelst dann als Endprodukt den Winkel (also return [...]). D.h. dieser Returnwert ist mein gewuenschter Zielwinkel. Stimmt so, oder?
Wenn das alles so richtig ist, dann bin ich ja echt froh das durchschaut zu haben
Ach so noch eines: was ist genau dieses "ow"? Warum gibst du das zurueck?
Auf alle Faelle noch mal VIELEN DANK!! |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 25.08.2003, 18:54 Titel: |
|
|
Die Variable z hat den Sinn Bogenmaß und Grad hin und her zu rechnen (da 2*PI = 360 Grad sind) wenn du das weglassen würdest dann glaube ich würden die Endergebnisse in Bogenmaß zurückgegeben.
Code: |
if(x==0)
{
if(y==0)
return ow;
if(y>0)
return 90;
if(y<0)
return 270;
}
if(y==0)
{
if(x>0)
return 0;
if(x<0)
return 180;
}
|
Das sind tatsächlich Sonderfälle da es sonst zu Divisionen durch 0 geben könnte und der Rechenaufwand wird eingegrenzt.
Code: |
if((x>0) && (y>0)) //NO
return atan(y/x)/z;
if((x<0) && (y>0)) //NW
return 180+atan(y/x)/z;
if((x>0) && (y<0)) //SO
return 360+atan(y/x)/z;
if((x<0) && (y<0)) //SW
return 180+absf(float(atan(y/x)/z));
return ow;
|
Ja hier wird der ArcusTangens benutzt um den Winkel in GRAD zu berechnen die if Anweisungen sind dazu da um die Quartale eines Kreises zu berücksichtigen da es ohne zu vielen Rechenfehlern kommt.
Und ow ist nur dazu da im Falle eines Fehlers den alten Winkel zurückzugeben (Wenn Ziel und Start auf einem Punkt sind).
Du solltest bei Gelegenheit die Mathematischen Funktionen optimieren. |
|
Nach oben |
|
|
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 25.08.2003, 19:04 Titel: |
|
|
Du hast diese Funktion fuer den 2D-Bereich erstellt oder? Weil ich grad ueberlege, dass das so Sinn macht, wenn man den Screen also quasi von oben sieht mit den ueblichen x,y Koordinaten. Da ich das ganze aber fuer 3D verwenden will, kann ich ja y einfach durch z ersetzen, oder ist das ein Denkfehler?? (ich will ja nur in x,z Ebene rotieren.
Danke... |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 25.08.2003, 19:23 Titel: |
|
|
Wenn du das in 3D machen willst aber trotzdem nur auf einer Ebene handelst kannst du das machen für die 3. Dimension brauchst du die Funktion nur 2 mal aufrufen mit anderen Werten, brauchst also nur ein wenig logisch denken. |
|
Nach oben |
|
|
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 28.08.2003, 15:35 Titel: |
|
|
Hallo,
primaer @FallenAngel. Ich habd as jetzt mal eingebaut in meinen 3D-Raum. Jetzt hab ich aber das Problem, dass das Objekt zwar Drehungen vollzieht, aber diese ziemlich falsch. Also meistens in entgegengesetzte Richtung. Kannst du mir sagen woran das liegen mag? Soll ich meinen Code mal posten?
Vielen Dank...
P.S.: was ist "absf"? Damit kann ich auch interpretisch nix anfangen Der Kompiler uebrigens auch ned |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 28.08.2003, 18:26 Titel: |
|
|
absf ist die abs Funktion eben nur für float Werte bei mir lässt sich das kompilieren aber nur durch folgende Zeile:
Code: |
inline double absf(double x) { if(x<0) return x*=-1; else return x;}
|
Und das er sich falsch dreht stimmt zwar aber die funktion war auch auf ein anderes System ausgelegt. Du musst glaunbe ich einfach zum Endergebnis 90 Grad oder so hinzuaddieren. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 29.08.2003, 18:50 Titel: |
|
|
Hab mal nachgeschaut was die Funktion ausgibt, die Funktion arbeitet entgegen dem Uhrzeigersinn. Um das zu beheben mache das hier (leider habe ich keine Lust gehabt die Funktion zu korrigieren was aber eleganter gewesen währe):
absf(TargetToAngel(startx,starty,zielx,ziely)-360); |
|
Nach oben |
|
|
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 29.08.2003, 23:29 Titel: |
|
|
Hi FallenAngel84,
[deleted] zu frueh gefreut. Weder das eine noch das andere funktioniert! Also weder deine Korrektur, noch meine funktioneirt in diesem Sinne. Das darfs ja nicht geben. Ich check das nich... |
|
Nach oben |
|
|
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 30.08.2003, 19:37 Titel: |
|
|
Ok noch mal zu dem Thema. Ich habs jetzt anders gemacht. Hab irgendwo nen guten Algo gefunden und nebenbei noch schoene neue Befhele gelernt
Also bei mir sieht obige Funktion jetzt so aus:
Code: |
RotationY = (atan2(ZielVec.z - CurVec.z, ZielVec.x - CurVec.x)* 180/D3DX_PI);
|
Dabei bekomme ich jetzt super die Gradausrichtung an. Ein Problem bleibt aber noch. Das ganze Funktioniert nur in einem Einheitshalbkreis von 0- 180° und -180 - 0° (von rechts nach links im CCW). Ergo bewegt sich das Modell immer noch bei zwei Quadranten genau entgegengesetzt, weil die Objektausrichtung um einen Quadranten verschoben ist und von 0-360 geht.
Hat jmd. nen Plan was ich da machen kann? Das passt noch nicht zusammen... |
|
Nach oben |
|
|
|