JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=ee664e671558cf13af160ad8516f3f0cMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Stufenlose Rotation (inkl. 30kb-Bild, nur als Warnung ;))
Gehe zu Seite 1, 2, 3  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 22.08.2003, 14:45    Titel: Stufenlose Rotation (inkl. 30kb-Bild, nur als Warnung ;)) Antworten mit Zitat

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 Wink

Also um eine Hilfe waere ich super dankbar....


Zuletzt bearbeitet von X-FILE am 31.08.2003, 11:58, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 22.08.2003, 20:13    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 22.08.2003, 20:39    Titel: Antworten mit Zitat

Hmpf ich befuerchtete, dass das keine kapiert so wie ich das wieder formuliere Wink

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 Wink
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
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 23.08.2003, 11:31    Titel: Antworten mit Zitat

Hm...da hilft wahrscheinlich am Besten Sinus und Cosinus(hatte das noch net in der Schule). Deshalb kann ich dir jetzt schlecht weiterhelfen Neutral
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 23.08.2003, 21:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 23.08.2003, 21:50    Titel: Antworten mit Zitat

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 Wink

Danke...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 25.08.2003, 01:09    Titel: Antworten mit Zitat

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 Wink Laughing Embarassed

Ach so noch eines: was ist genau dieses "ow"? Warum gibst du das zurueck?

Auf alle Faelle noch mal VIELEN DANK!!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 25.08.2003, 18:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 25.08.2003, 19:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 25.08.2003, 19:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 28.08.2003, 15:35    Titel: Antworten mit Zitat

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 Wink Der Kompiler uebrigens auch ned Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 28.08.2003, 18:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 29.08.2003, 18:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 29.08.2003, 23:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 30.08.2003, 19:37    Titel: Antworten mit Zitat

Ok noch mal zu dem Thema. Ich habs jetzt anders gemacht. Hab irgendwo nen guten Algo gefunden und nebenbei noch schoene neue Befhele gelernt Wink

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite 1, 2, 3  Weiter
Seite 1 von 3

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum