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

Aktuelle Zeit: Mi Jul 09, 2025 08:34

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Newton 2D CustomJoint
BeitragVerfasst: Sa Dez 29, 2007 15:03 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Hallo,

ich habe gerade angefangen, mich mit Newton zu beschäftigen, da ich vorhabe, es in einem 2D Spiel zu nutzen.
Um die Physik auf eine Ebene zu beschränken, verwende ich einen Custom Joint (http://walaber.com/newton_wiki/index.php?title=CJ_2D_Joint_planar_rotation)

Nun habe ich es geschafft, die Bewegung (translation) auf die Ebene zu beschränken, allerdings baut er bei der Rotation immer noch mist.
Hier mal ein bissl code (kann ich den joint nicht auch klassenunabhängig machen, sodass ich nicht für jede box einen joint instanzieren muss ?):
Code:
  1.  
  2.   TJoint2D = class
  3.   constructor Create(kpBody0: PNewtonBody; kPlaneNormal: TVector3f);
  4.   private
  5.     mpbody0: PNewtonBody;
  6.     mPlaneNormal,
  7.     mPlaneOrigin: TVector3f;
  8.     mpJoint: PNewtonJoint;
  9.   protected
  10.     procedure SubmitConstraint;
  11.   end;
  12.  

Code:
  1.  
  2. constructor TJoint2D.Create(kpBody0: PNewtonBody; kPlaneNormal: TVector3f);
  3. var
  4.   matrix0: TMatrix4f;
  5. begin
  6.   mpBody0 := kpBody0;
  7.   mPlaneNormal := kPlaneNormal;
  8.  
  9.   NewtonBodyGetMatrix(mpBody0, @matrix0[0][0]);
  10.   mPlaneOrigin.x := matrix0[3][0];
  11.   mPlaneOrigin.y := matrix0[3][1];
  12.   mPlaneOrigin.z := matrix0[3][2];
  13.   mpJoint := NewtonConstraintCreateUserJoint(NewtonWorld, 6, @SubmitJoint2DConstraint, mpBody0, nil);
  14.   NewtonJointSetUserData(mpJoint, self);
  15. end;
  16.  
  17. procedure TJoint2D.SubmitConstraint;
  18. var
  19.   matrix0: TMatrix4f;
  20.   object_point,
  21.   world_point: TVector3f;
  22. begin
  23.   // Beschränkung der Translation
  24.   NewtonBodyGetMatrix(mpBody0, @matrix0[0][0]);
  25.   NewtonUserJointAddLinearRow (mpJoint,  @matrix0[3][0], @mPlaneOrigin.x, @mPlaneNormal.x);
  26.   // Beschränkung der Rotation
  27.   object_point := MatrixVectorTransform(matrix0, mplanenormal);
  28.   world_point.x := mPlaneOrigin.x + mPlaneNormal.x;
  29.   world_point.y := mPlaneOrigin.y + mPlaneNormal.y;
  30.   world_point.z := mPlaneOrigin.z + mPlaneNormal.z;
  31.   NewtonUserJointAddLinearRow(mpJoint, @object_point.x, @world_point.y, @mPlaneNormal.z);
  32. end;
  33.  

Hier mein Vektor / Matrix Code:
Code:
  1.  
  2.   TVector3f = record
  3.     X,
  4.     Y,
  5.     Z: Single;
  6.   end;
  7.   TMatrix4f = array[0..3, 0..3] of Single;
  8.  
  9. function MatrixVectorTransform(m: TMatrix4f; v: TVector3f): TVector3f;
  10. begin
  11.   result.x := v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2] + 1 * m[0][3];
  12.   result.y := v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2] + 1 * m[1][3];
  13.   result.z := v.x * m[2][0] + v.y * m[2][1] + v.z * m[2][2] + 1 * m[2][3];
  14. end;
  15.  

Jede Box besitzt ein
Code:
  1.     Joint2D: TJoint2D;

welches am ende des creates so erzeugt wird;
Code:
  1.  
  2.   Joint2D := TJoint2D.Create(NewtonBody, v3(0, 0, 1));
  3.  


Vielen Dank schonmal

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 02, 2008 14:54 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 07, 2006 13:37
Beiträge: 83
Wohnort: Partenheim
Hallo Seth!

Ich hatte nicht die Zeit, lange drüberzugucken oder es selbst zu testen, aber ich denke, der Fehler liegt in der Funktion "MatrixVectorTransform".
Denn wenn du die Matrix von Newton beziehst, ist sie transponiert. Wenn du also innerhalb deiner Funktion die Indizes der ersten Dimension mit denen der zweiten Dimension deiner Matrix vertauschst, sollte es schon keinen Mist mehr bauen.

Conan

_________________
THE TRUTH IS NOT OUT THERE!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 02, 2008 15:50 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Du meinst so ?
Code:
  1.  
  2. function MatrixVectorTransform(m: TMatrix4f; v: TVector3f): TVector3f;
  3. begin
  4. //  result.x := v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2] + 1 * m[0][3];
  5. //  result.y := v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2] + 1 * m[1][3];
  6. //  result.z := v.x * m[2][0] + v.y * m[2][1] + v.z * m[2][2] + 1 * m[2][3];
  7.   result.x := v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + 1 * m[3][0];
  8.   result.y := v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + 1 * m[3][1];
  9.   result.z := v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + 1 * m[3][2];
  10. end;
  11.  

Jetzt springen die Klötze zwar nicht mehr, allerdings scheinen sie sich immernoch um andere Achsen als die Z-Achse zu drehen.

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 02, 2008 22:00 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 07, 2006 13:37
Beiträge: 83
Wohnort: Partenheim
Zitat:
NewtonUserJointAddLinearRow(mpJoint, @object_point.x, @world_point.y, @mPlaneNormal.z);


Mit "@world_point.y" übergibst du den Vektor (world_point.y; world_point.z; Wert, der sich im RAM zufällig dahinter befindet) an Newton.
Ähnlich mit "@mPlaneNormal.z".
Ich nehme an, das ist ein Tippfehler o. ä.

Falls es das nicht war, tippe ich auf die Vektoren, die innerhalb eines Records vorliegen, obwohl ich dachte, dass sich die Werte, wie beim Array auch, hintereinander im RAM befinden.

Ich hoffe, diesmal klappt's.
Conan

_________________
THE TRUTH IS NOT OUT THERE!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 02, 2008 22:15 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Danke, wenn ich die ganzen .x und .y und .z einfach weg lasse klappt es, danke ;)

(jetzt habe ich die Darstellung auf 2D umgestellt und plötzlich wird mein ForceAndTorqueCallback nicht mehr aufgerufen Oo)

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 02, 2008 23:09 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 07, 2006 13:37
Beiträge: 83
Wohnort: Partenheim
Lass' das *.x bitte nicht weg, da du ja einen Pointer übergeben willst, der auf das erste Element deines Vektors zeigen soll, nicht auf das Objekt, das die Elemente enthält. Delphi korrigiert das zwar in den meisten Fällen, doch nicht in allen.

Conan

_________________
THE TRUTH IS NOT OUT THERE!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 03, 2008 12:40 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Irgendwie klappt das noch nicht so richtig (außerdem scheinen die boxen ab und an doch abzuschweifen, wenn auch nur gering, aber sie berühren die clipping ebene)
Ich hab mal mein Projekt hochgeladen:

http://www.exec-dev.de/2D.zip

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 13, 2008 18:16 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 07, 2006 13:37
Beiträge: 83
Wohnort: Partenheim
Hi Seth!

Ich hoffe, du hast dein Problem schon gelöst. Denn eine wirkliche Lösung habe ich für dich auch nicht.
Ich bin mir zwar ziemlich sicher, dass es am Gewicht der Boxen liegt, sodass die Joints einfach zu schwach sind, die schweren Kisten in der Bahn zu halten, empfehle dir aber trotzdem, dich, falls du es nicht schon getan hast, mit dieser Frage an das Newton-Forum zu wenden und außerdem dein Programm so anzupassen, dass du eine Gravitation von 9.8 * Mass hast, denn dafür ist Newton ausgelegt. Wenn es mit dieser Schwerkraft nicht realistisch wirkt, solltest du nicht die Schwerkraft anpassen sondern den Fehler an anderer Stelle suchen (das sag' ich aus Erfahrung).

Ich hoffe, ich konnte dir trotzdem irgendwie helfen,
Conan

_________________
THE TRUTH IS NOT OUT THERE!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 16, 2008 17:13 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
anders anpassen dürfte schwierig werden, da ich ja auf pixelbasis hantiere ;)

mfg


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 19 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]