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

Aktuelle Zeit: Mo Jul 07, 2025 13:45

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Newton - Statisches Objekt drehen
BeitragVerfasst: Sa Mär 22, 2008 21:58 
Offline
DGL Member

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

prinzipiell nutze ich nur eine leicht abgewandelte Version der Basic Demo von Sasche Williams.

Diese habe ich dahingehend erweitert, dass man die statische Bodenplatte drehen kann, ich mache das ganze mit:
Code:
  1.     NewtonBodyGetMatrix(NewtonBox[0].NewtonBody, @Matrix2[0, 0]);
  2.     Matrix2 := Matrix_Multiply(Matrix_MakePitchMatrix(degtorad(pitch)), Matrix_MakeRollMatrix(degtorad(roll)));
  3.     NewtonBodySetMatrix(NewtonBox[0].NewtonBody, @Matrix2[0, 0]);

Das Ganze funktioniert wunderbar und genauso wie ich das vorhatte, allerdings kommt es vor, dass die anderen Würfel, nun nicht mehr richtig mit diesem Objekt kollidieren, teilweise durchfallen oder sich überhaupt nicht mehr bewegen.

Wie kann ich das am besten beheben ?

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 22, 2008 22:32 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Mach das Objekt dynamisch (also Masse > 0, am besten sehr schwer) und pass die Rotation mit einem abgeleiteten Customjoint an. Das mache ich in meiner Panzerdemo für den Turm und funzt wunderbar, Kollisionen reagieren dann auch so wie sie sollen.
Als Grundlage solltest du da logischerweise einen Hingejoint nehmen, und am Ende eine zusätzliche angulare Reihe in der du die Rotation festlegst. Das sähe dann so aus :
Code:
  1. procedure TJointTankTurrent.SubmitConstraint(TimeStep : Float);
  2. ...
  3. FCurJointAngle := CalculateJointAngle(LMatrix0, LMatrix1);
  4. NewtonUserJointAddAngularRow(Joint, FCurJointAngle-TurnAngle, @LMatrix0[0, 0]);


CalculateJointAngle ist eine spezielle Funktion die auch Winkel jenseits -180°/180° realisiert, mehr dazu hier : http://www.newtondynamics.com/forum/vie ... php?t=3529

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 23, 2008 12:36 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
hi, danke für die Antwort, ich möchte das Objekt auch maximal um +-45° drehen können, ich werde mir das mit den Joints mal ansehen, etwas in der Richtung hatte ich mir auch schon überlegt.

Ich hab mal in die Dokumentation geschaut und mir nen Universal Joint gebaut (damit ich eine Rotation um zwei Achsen habe):
(modifikation des hinge joints aus der sdl joint demo)
Code:
  1. function CreateUniversalJoint(pNewtonWorld : PNewtonWorld; pPivotPoint : TVector3f) : PNewtonJoint;
  2. var
  3.  Collider   : PNewtonCollision;
  4.  Matrix     : TMatrix4f;
  5.  PinDir0, PinDir1     : TVector3f;
  6.  ParentBody : PNewtonBody;
  7. begin
  8. // Create the PARENT body for this joint =======================================
  9. Collider := NewtonCreateSphere(NewtonWorld, 1, 1, 1, nil);
  10. ParentBody := NewtonCreateBody(pNewtonWorld, Collider);
  11. // We give this body a mass of zero, cause the "root" of the joint shall not move
  12. NewtonBodySetMassMatrix(ParentBody, 0, 0, 0, 0);
  13. // Set callbacks for this body
  14. NewtonBodySetForceAndTorqueCallback(ParentBody, ForceAndTorqueCallback);
  15. // Create the CHILD body for this joint ========================================
  16. // Set some damping
  17. NewtonBodySetLinearDamping(Newtonbox[0].NewtonBody, 0.<!-- s8) --><img src=\"{SMILIES_PATH}/icon_cool.gif\" alt=\"8)\" title=\"Cool\" /><!-- s8) -->;
  18. // Give the child some mass (since it shall move)
  19. //NewtonBodySetMassMatrix(Newtonbox[0].NewtonBody, 1000, 1000, 1000, 1000);
  20. // Now create the joint at the given pivot point
  21. PinDir0 := V3(1,0,0);
  22. PinDir1 := V3(0,0,1);
  23. Result := NewtonConstraintCreateUniversal(pNewtonWorld, @pPivotPoint[0], @PinDir0[0], @PinDir1[0], Newtonbox[0].NewtonBody, ParentBody);
  24. // Release the collider
  25. NewtonReleaseCollision(pNewtonWorld, Collider);
  26. end;

Damit funktioniert die Rotation in beide Achsen, allerdings ändert sich auch hier nichts an dem Problem mit der fehlerhaften Kollision.

Die Drehung mache ich nach wie vor wie oben beschrieben, danach rufe ich NewtonUpdate auf. Ich weiß noch nicht genau was es mit den von dir geposteten Zeilen auf sich hat, aber ich denke mal, dass die der Schlüssel sind ^^ Des weiteren wäre es natürlich praktisch die Rotation, wie du sagtest auf einen bestimmten Winkel (+-45°) beschränken zu können.

Ich glaube ich werde mal im NGD Forum anfragen ;)

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 02, 2008 17:36 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
EDIT: habs nun so gemacht, dass ich alles andere drehe, sprich die Gravitation und die Kamera dementsprechend manipuliere, so spare ich mir jede Menge Joints etc. und es funktioniert.

mfg


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 » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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.012s | 16 Queries | GZIP : On ]