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

Aktuelle Zeit: Fr Jul 18, 2025 11:20

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



Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Newton - ne Frage
BeitragVerfasst: Mo Sep 20, 2004 16:00 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 28, 2002 19:27
Beiträge: 568
Wohnort: Chemnitz / Sachsen
Hallo

1) ich weiss es gibt einen anderen thread zu newton, doch ich wollte nicht, dass mehrere frage in einem thread beantwortet werden, das bringt nur alles durcheinander.

2) hab ich ein problem mit der Physikengine Newton.

ich hab mir nu schon einige dinge (unteranderem sos demos) zu newton angeschaut.
überall habe ich nur gesehen, dass ein CollisionTree für die Welt erstellt wurde, aber nicht für einen Gegenstand.

mein Problem ist nun, ich hab versucht, eine Welt per Create3DSCollisionTree(const pScene3DS : TAll3DSMesh); (von sos) und einen Gegenstand mit einer Methode ähnlich Create3DSCollisionTree(const pScene3DS : TAll3DSMesh); nur mit geänderter Triübergabe, zu erstellen. doch leider funktioniert das nicht, newton spuckt zwar keine fehler aus, jedoch passiert auch nichts (obwohl ich den gegenstand extra mitten in die luft positioniert habe und eh die antwort kommt, ApplyForceanTorque hab ich auch gesetzt. Wenn ich stattdessen aber für den gegenstand eine Kugel als Collider nehme, dann funktioniert das. leider gibt es dann eine sehr unrealistische physikalische Bewegung.
Nun die Frage : gibt es eine möglichkeit, auch genaue Triangleangaben an einen Collider zu übergeben, so dass die kollision sehr genau berechnet wird und keine umschreibenden Primitiven genutzt werden müssen?

rswm

_________________
Aktuelles Projekt :
www.PicPlace.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 20, 2004 16:04 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Tree-Kollisionen in Newton sind immer statisch, also halt für Sachen wie Levels oder Terrains (und ApplyForceAndTorque werden für solche Kollsionsobjekte ignoriert). Wenn du einen dynamischen, komplexen Mesh mit Physik versehen willst musst du eine Compound-Kollision über NewtonCreateCompoundCollision erstellen, der du dann die (konvexen) Polygone deines Objektes übergibst.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 20, 2004 16:07 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 28, 2002 19:27
Beiträge: 568
Wohnort: Chemnitz / Sachsen
da kann ich aber, soweit ich die newton-docs im sdk verstanden hab nur primitiven, also kugel, etc. reinpacken und keine polygone.

_________________
Aktuelles Projekt :
www.PicPlace.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 20, 2004 16:14 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Achso, du willst also dreiecks-genaue Kollision? Soweit ich informiert bin geht das bei Newton in der aktuellen Version (Newton ist ja noch recht jung) nicht. Das ist aber in Planung, und evtl. schon im nächsten SDK. Bis dahin musst du entweder auf ODE umsteigen oder die Geometrie deines Objektes so nah wie möglich mit Bounding-Primitiven beschreiben.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 20, 2004 16:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 28, 2002 19:27
Beiträge: 568
Wohnort: Chemnitz / Sachsen
gut sollte wohl gehen, mussch halt 2 zylinder nehmen, soll ein bowling-pin werden.

_________________
Aktuelles Projekt :
www.PicPlace.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 20, 2004 16:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
*hust* Zylinder gehen in Newton leider auch noch nicht. Allerdings ist das nächste SDK nicht mehr weit (ich tippe mal auf 1-2 Wochen, da der Macher nur noch einige Tutorials bereinigen muss) und da gibts dann Zylinder.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 20, 2004 22:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 28, 2002 19:27
Beiträge: 568
Wohnort: Chemnitz / Sachsen
toll, also dann nur kugel und box, naja sollte auch mit box und kugel gehen, aber wie verknüpf ich das dann???

_________________
Aktuelles Projekt :
www.PicPlace.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 20, 2004 23:15 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
ODE kann das auch nicht wirklich. In der neuesten Inkarnation kann man zwar Dreiecksmeshes auch dynamisch verwenden (also TriMesh <-> TriMesh Kollision), das zeitigt aber manchmal recht seltsame Ergebnisse und tut auch der Performance nicht besonders gut. Das Zusammenstöpseln von komplexen Geoms aus Kugeln, Boxen, Zylindern und Kegeln funktioniert normalerweise aber recht gut, und ich glaube sowohl in Newton als auch in ODE sind die Inklusion beliebiger konvexer, polygonaler Objekte geplant.
Nichtsdestotrotz sind auch in ODE Kugeln und Boxen deine besten Freunde :wink: .

Übrigens: wenn man sich überlegt, dass der Kollisionstest mit einer Kugel wirklich extrem einfach ist, macht es durchaus Sinn, auch eine größere Menge von Kugeln für die "physikalisch korrekte" Repräsentation eines Objektes zu verwenden.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 21, 2004 00:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 28, 2002 19:27
Beiträge: 568
Wohnort: Chemnitz / Sachsen
so hab mir das nu überlegt, werd ne box nehmen und darauf dann ne kugel setzen. dazu brauch ich ja, wenn ich die tutorials richtig verstanden hab, joints. aber was ich ne verstanden hab, wie ich mir das nu zambastel. hat da jemand mal ne idee, komm da einfach ne drauf. evtl. mit bissl source, versteh delphisource immer recht gut als anschauung, muss ja nicht das genaue beispiel hier sein.

thx rswm

_________________
Aktuelles Projekt :
www.PicPlace.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 21, 2004 00:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Schau mal in mein Ragdoll-Demo. Ragdolls sind bestehen ja auch nur aus einigen Primitiven, die über Joints (allerdings spezielle) verbunden sind. In deinem Falle muss der Joint dann fest sein, so dass Kugel und Quader einen starren Körper bilden.

P.S. : Wenns nicht zu viele Kegel werden kannst du (solange Newton noch keine Zylinder kann) den Zylinder doch mit einigen rotierten Quadern annähern. Wenn du das mit 8 Quader machst, jeweils um 360/8° gedreht, sollte der Nutzer kaum nen Unterschied zu nem echten Zylinder bemerken.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 21, 2004 00:10 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 28, 2002 19:27
Beiträge: 568
Wohnort: Chemnitz / Sachsen
also zu viele körper werdens ne, gibt halt nur 10 pins beim bowling ;-)

ich schau mal in die ragdoll demo, hab aber schon in der irrlichtdemo geschaut. melde mich dann nochmal, ob ichs gerafft hab. ansonsten muss ich dich noch bissl belagern. dass die kugel als joint dann steif sein muss hab ich schon verstanden, da muss ich dann damping (?) auf 0 setzen, damit es kein damping gibt.

rswm

_________________
Aktuelles Projekt :
www.PicPlace.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 21, 2004 00:28 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 28, 2002 19:27
Beiträge: 568
Wohnort: Chemnitz / Sachsen
so hab grad mal in die docs geschaut, da gibts ne Function NewtonCreateCylinder ...*???* aber irgendwie isse ne implementiert, naja.

was die ragdolls angeht, so ein bissl was habsch kapiert.

ich nehm zwei PNewtonBodys und erstelle eins als kugel und das andere als Box, transformiere die kugel nach oben und danach klatsch ich einen joint-ball nei und verknüpf die beiden miteinander. habsch das so ritich erkannt???

_________________
Aktuelles Projekt :
www.PicPlace.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 21, 2004 12:02 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Vergiss das was ich oben gesagt habe, du brauchst nämlich eigentlich keinen Joint. Mit ner Compound-Kollision (siehe oben) kannst du den Kegel beschreiben. Also Kugel verschieben und zusammen mit dem Quader als Compound-Kollision (Compound heisst AFAIK glaub ich sogar "zusammengesetzt") übergeben. Joints haben ja die "Eigenart" dass sie nachgeben, und dein Kegel soll ja starr sein.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 21, 2004 14:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 28, 2002 19:27
Beiträge: 568
Wohnort: Chemnitz / Sachsen
also nochmal, ich nehme 2 PNewtonCollision. initialisiere eins als Box und eins als Kugel. dann nehme ich NewtonCreateCompound NewtonCreateCompoundCollision und übergebe beide PNewtonCollisions als array an die function. danach hab ich mein collsion-information und erstelle damit meinen körper. hab ich doch nu richtig verstanden, oder?

_________________
Aktuelles Projekt :
www.PicPlace.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 22, 2004 00:01 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 28, 2002 19:27
Beiträge: 568
Wohnort: Chemnitz / Sachsen
so hab das nu hinbekommen *freu*

nu hab ich aber ein anderes problem, ich hab mir nu gesagt, beim bowling gibts 10 pins, habs aber erstmal mit 3 pins probiert.

Code:
  1. Matrix_SetIdentity(PinMatrix);
  2. Matrix_SetTransform(PinMatrix, V4(0,10,0));
  3. CreateXCollisionTree(BodyPin1, PinMatrix);
  4.  
  5. Matrix_SetIdentity(PinMatrix);
  6. Matrix_SetTransform(PinMatrix, V4(0,10,0));
  7. Matrix_SetTransform(PinMatrix, V4(2,0,2));
  8. CreateXCollisionTree(BodyPin1, PinMatrix);
  9.  
  10. Matrix_SetIdentity(PinMatrix);
  11. Matrix_SetTransform(PinMatrix, V4(0,10,0));
  12. Matrix_SetTransform(PinMatrix, V4(0,0,-4));
  13. CreateXCollisionTree(BodyPin3, PinMatrix);


damit erstelle ich die Pins, also die Collision-Informationen.

hier die Prozedur :

Code:
  1. procedure CreateXCollisionTree(var Body : PNewtonBody; mat : TMatrix4f);
  2. var
  3.  TmpFace : array[0..2] of T3Dpoint;
  4.  TmpM    : TMatrix4f;
  5.  Min     : TVector3f;
  6.  Max     : TVector3f;
  7.  m,f     : Integer;
  8.  i       : integer;
  9.  link0, link1, link2, link3, link4: PNewtonCollision;
  10.  arr    : TcollisionPrimitiveArray;
  11. begin
  12.      Matrix_SetIdentity(Mat);
  13.      Matrix_SetTransform(Mat,V4(0,1,0));
  14.      link0 := NewtonCreateSphere(NewtonWorld, 0.2, @Mat[0,0]);
  15.  
  16.      Matrix_SetIdentity(Mat);
  17.      Matrix_SetTransform(Mat,V4(0,0,0));
  18.      link1 := NewtonCreateBox(NewtonWorld,0.5,1,0.5,@Mat[0,0]);
  19.  
  20.      Matrix_SetIdentity(Mat);
  21.      Matrix_SetTransform(Mat,V4(0,0,0));
  22.      Matrix_SetRotation(mat,V3(90/5*2, 90/5*2, 90/5*2));
  23.      link2 := NewtonCreateBox(NewtonWorld,0.5,1,0.5,@Mat[0,0]);
  24.  
  25.      Matrix_SetIdentity(Mat);
  26.      Matrix_SetTransform(mat,V4(0,0,0));
  27.      Matrix_SetRotation(mat,V3(90/5*3, 90/5*3, 90/5*3));
  28.      link3 := NewtonCreateBox(NewtonWorld,0.5,1,0.5,@mat[0,0]);
  29.  
  30.  
  31.      Matrix_SetIdentity(mat);
  32.      Matrix_SetTransform(mat,V4(0,0,0));
  33.      Matrix_SetRotation(mat,V3(90/5*4, 90/5*4, 90/5*4));
  34.      link4 := NewtonCreateBox(NewtonWorld,0.5,1,0.5,@mat[0,0]);
  35.  
  36.      Matrix_SetIdentity(mat);
  37.      SetLength(arr,5);
  38.      arr[0] := link0;
  39.      arr[1] := link1;
  40.      arr[2] := link2;
  41.      arr[3] := link3;
  42.      arr[4] := link4;
  43.      Collider := NewtonCreateCompoundCollision(NewtonWorld,5,arr);
  44.      Body := NewtonCreateBody(NewtonWorld, Collider);
  45.      Matrix_SetIdentity(mat);
  46.      Matrix_SetTransform(mat, V4(0,10,0));
  47.      Matrix_SetRotation(mat,V3(45,45,45));
  48.      NewtonBodySetMatrix(Body, @mat[0,0]);
  49.      NewtonReleaseCollision(NewtonWorld, Collider);
  50.      NewtonReleaseCollision(NewtonWorld, link0);
  51.      NewtonReleaseCollision(NewtonWorld, link1);
  52.      NewtonReleaseCollision(NewtonWorld, link2);
  53.      NewtonReleaseCollision(NewtonWorld, link3);
  54.      NewtonReleaseCollision(NewtonWorld, link4);
  55.      NewtonBodySetForceAndTorqueCallback(Body, BallCharacterApplyForceAndTorque);
  56.      NewtonBodySetMaterialGroupID(Body, MatWorld);
  57.      // Give it a huge mass, so it makes fun to throw them against other crates ;)
  58.      NewtonBodySetMassMatrix(Body, 9, 1, 1, 1);
  59. //     NewtonWorldUnfreezeBody(NewtonWorld, Body);
  60. //     NewtonBodySetAutoFreeze(Body, 0);
  61. end;


Das Problem ist, wenn ich nur BodyPin1 zeichne, und erstelle dann gehts, wenn ich aber auch BodyPin2 oder BodyPin3 oder beide zusätzlich erstelle, dann gibts nichts.
wenn ich nur BodyPin2 oder BodyPin3 zeichne, dann gibts entweder nen stack overflow oder ne böse accesviolation.

habsch da irgendwo was falsch gemacht, find aber eigentlich nichts, oder is da wieder irgendwas zu beachten, was ich nicht beachtet habe?

_________________
Aktuelles Projekt :
www.PicPlace.de


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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.010s | 15 Queries | GZIP : On ]