Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Apr 24, 2024 22:40

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Mai 07, 2013 09:15 
Offline
DGL Member

Registriert: Do Mär 21, 2013 14:57
Beiträge: 51
Programmiersprache: C#,C++
Hi Leute!

Mir ist in den letzten Tagen etwas seltsames aufgefallen: Verwende ich GL.Rotate() und eine selbstimplementierte Rotation mit Hilfe einer Rotationsmatrix
um eine Rotation um eine beliebige Achse zu animieren (beiden Funktionen übergebe ich den selben Rotationswinkel pro Programmdurchlauf) ist die selbst-
implementierte um 2,.. mal schneller. Sprich das Objekt rotiert mit GL.Rotate() langsamer als es sollte - ist das bekannt oder wird dort die Rotation anders
berechnet?

Nur zur Sicherheit, damit ich keinen Quatsch erzähle, meine Rotationsfunktion:

Code:
  1.  
  2.             // Compute circular measure of the rotation angle.
  3.             this.rotation_angle_box += ((Math.PI) / 180) * (this.rot_per_cycle);
  4.  
  5.             // Compute rotation matrix rows. (rotation around z - axis)
  6.             Vector3d row1 = new Vector3d((float)(Math.Cos(rotation_angle_box)), (float)(-(Math.Sin(rotation_angle_box))), 0);
  7.             Vector3d row2 = new Vector3d((float)(Math.Sin(rotation_angle_box)), (float)(Math.Cos(rotation_angle_box)), 0);
  8.             Vector3d row3 = new Vector3d(0, 0, 1);
  9.  
  10.  
  11.             this.hitboxNewBody = new List<Vector3d>();
  12.  
  13.             for (int i = 0; i < this.hitboxCurrentBody.Count; i++)
  14.             {
  15.                 this.hitboxNewBody.Add(new Vector3d()
  16.                 {
  17.                     X = ((row1.X * (this.hitboxCurrentBody[i].X)) + (row1.Y * (this.hitboxCurrentBody[i].Y)) + (row1.Z * (this.hitboxCurrentBody[i].Z))),
  18.                     Y = ((row2.X * (this.hitboxCurrentBody[i].X)) + (row2.Y * (this.hitboxCurrentBody[i].Y)) + (row2.Z * (this.hitboxCurrentBody[i].Z))),
  19.                     Z = ((row3.X * (this.hitboxCurrentBody[i].X)) + (row3.Y * (this.hitboxCurrentBody[i].Y)) + (row3.Z * (this.hitboxCurrentBody[i].Z)))
  20.                 });
  21.             }
  22.  


Ich berechne die Rotationsmatrix um (hier) die Z - Achse und multipliziere jeden Punkt, gemäß der Mathematik, mit dieser um später den Körper zu zeichnen.

Ist nur eine Interessensfrage!

_________________
_______________________________________
Lets move over mountains and through valleys:
GL.Map2(,,,,,,,,,)
GL.MapGrid2(,,,,,,,,,)
GL.EvalMesh2(,,,,,,,,,)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mai 08, 2013 09:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Nov 30, 2011 21:41
Beiträge: 136
Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
Deine Funktion sieht eigentlich richtig aus. Was bedeutet bei dir "rotiert langsamer als es sollte". Machst du pro Frame eine 1 Grad Drehung oder so, weil das liegt dann vielleicht eher an was anderem. Lass dir das Objekt mal so zeichnen, und dann nochmal mit GL.Rotate(90) und vergleiche die beiden vielliecht fällt dir dann was auf.

P.S. gerade fällt mir doch noch was auf:
Machst du irgendwann aus der hitBoxNewBody den HitBoxCurrentBody? weil wenn du dann ein um 10° gedrehtes Objekt nochmal um 10° drehst, würdest du stattdessen eine Drehung um 30° bekommen. Weil rotation_angle_box wird ja nochmal um 10 erhöht und würde dann ja das bereits gedrehte Objekt (um 10 + 10 = 20°) drehen. (Meiner Meinung nach würde das zwar stattdessen zu einer Beschleunigung führen, aber vielliecht hilft dir das ja trotzdem weiter.)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mai 08, 2013 15:14 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
da Du mit C# arbeitest, würde ich dir SharpDX oder SlimDX nahelegen, oder falls es doch auch auf Linux und Mac laufen soll MonoGame.

Da gibt es dann zum Beispiel auch Matrix.CreateRotation{X/Y/Z/FromQuaternion/pipapo}

Immer so eigenbrödlerischen Mathekram zu machen, der sich an keine Codes anlehnt, die man ganz einfach ergooglen kann und dann auch noch unleserlich im Quellcode stecken........ naja.

In dem Zuge kann man auch einfach Bullet für die Physikberechnungen hernehmen, diese Bibliothek bietet auch Bindings für Slim/SharpDX/undviele mehr.


Jaja... ist DirectX, aber das war seit DX10 eh die bessere Wahl, wenn man sich lieber auf die Windowsplattform beschränkt.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mai 13, 2013 09:30 
Offline
DGL Member

Registriert: Do Mär 21, 2013 14:57
Beiträge: 51
Programmiersprache: C#,C++
@Knittel:

Nein die HitBoxCurrentBody wird nur ein einziges mal beim Erstellen des Objektes der Klasse in der diese Funktion verwendet wird berechnet und nicht verändert
in ihrer Position und Lage. Diese wird lediglich als Referenz für die HitBoxNewBody verwendet.

Was ich mit "rotiert langsamer als es sollte" meine: Übergebe ich der selbst implementierten Funktion und der GL.Rotate den gleichen Winkel, um eine Drehbewegung zu realisieren, und lasse zwei gleiche Körper nebeneinander rotieren (einen GL.Rotate und den anderen mit der self made Version) ist der
Körper, welcher durch die selbst geschriebene Funktion rotiert, dem anderen irgendwann vorraus. (ist das verständlich?)


@phlematiker:

Leider bin ich durch Vorgaben meines Professors an OpenGL gebunden, was es mir nicht erlaubt DirectX zu verwenden. Findest du die Funktion wirklich unleserlich? Meiner Meinung nach ist sie einfach zu lesen, kann aber auch daran liegen, dass ich es selbst implementiert habe und sich der eigene Code
natürlich einfacher für einen selbst ließt.

_________________
_______________________________________
Lets move over mountains and through valleys:
GL.Map2(,,,,,,,,,)
GL.MapGrid2(,,,,,,,,,)
GL.EvalMesh2(,,,,,,,,,)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 48 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.123s | 17 Queries | GZIP : On ]