NooNooPhysics V1.0
Übersicht

![]() |
the FR3AK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hast du überhaupt die Vollversion? | ||
![]() |
AlkanBetreff: Danke |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok es funktioniert jetzt!
Danke Noobody und sehr gute Arbeit! Und ja ich habe die Vollversion the FR3AK! MfG Alkan |
||
Hauptrechner: Win7 Ultimate x64|AMD Phenom II X4 965 BlackEdition 4x3.4GHz|4 GB DualKit DDR3-1600 Ram|1.5 TB Samsung EcoGreen|Cougar CM 700Watt|ASRock M3A790GFX/120M|Nvidia GeForce 9500GT|Ati Radeon HD3300(Onboard-Deaktiviert)
Server(früher Hauptrechner): Ubuntu 9.1 x86|Intel P4 HT 3GHz|Ati Radeon X600Pro|200 GB HDD Worklog: Planetensimulation Homepage(Under Construction): alkan96.dyndns.org Wenn schon falsch, dann richtig falsch. |
Mau |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hm, beim "Beispiel 1 - Initialisierung und einfache Objekte.bb" ist mir ein Verhalten aufgefallen, das eigentlich nich korrekt sein kann. Man erkennt, das der Würfel ganz unten links einfach nach links aus dem Bildschirm herausgleitet. Auch einige der anderen Würfel "rutschen" irgendwie, obwohl sie ja eigentlich zwischen zwei Würfeln eingeklemmt sind.
Wenn man Zeile 12 Code: [AUSKLAPPEN] Crate.TEntity = NNP_CreateBox( 100 + X*60, 100 + Y*60, 50, 50 ) ; Gaaanz viele Würfel erstellen
ändert in: Code: [AUSKLAPPEN] Crate.TEntity = NNP_CreateBox( 100 + X*60, 250 + Y*51, 50, 50 ) ; Gaaanz viele Würfel erstellen
wird das sogar noch deutlicher, das zwei der Würfel sich einfach selbstständig machen. Woran liegt das und wir kann man das vermeiden? ![]() |
||
Alles muss, nichts kann! |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich verstehe nun nicht ganz, was du meinst. Kannst du es ein wenig genauer erklären oder einen Screenshot posten, auf dem das Problem eingekreist ist? | ||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
Mau |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also wenn du folgenden Code ausführst, siehst du, das zwei Würfel sich "selbstständig" machen, der in der untersten Reihe ganz links und der in der zweit-untersten Reihe ganz rechts. Die "wandern" bzw. "rutschen" einfach zum Bildrand hin weg (bei mir jedenfalls), obwohl sie das ja eigentlich gar nicht dürften, da sie ja zwischen anderen Boxen eingeklemmt sind und deshalb eigentlich gar nicht wegrutschen könnten:
Code: [AUSKLAPPEN] Graphics 800, 600, 0, 2
SetBuffer BackBuffer() Include "NooNooPhysics.bb" NNP_CreatePhysics 512, 1024, 1024 ;Physik initialisieren NNP_SetGravity 0, 0.5 ;Gravitation setzen For X = 0 To 10 For Y = 0 To 8 Crate.TEntity = NNP_CreateBox( 100 + X*60, 250 + Y*51, 50, 50 ) ; Gaaanz viele Würfel erstellen Next Next Bottom.TEntity = NNP_CreateBox( 400, 600, 800, 10 ) ;Den Boden erstellen Bottom\Locked = True ;Ihn befestigen Local Timer = CreateTimer( 60 ) While Not KeyHit( 1 ) Cls NNP_UpdateForces ;Kräfte berechnen NNP_UpdatePhysics ;Physik berechnen lassen NNP_DebugRender DEBUG_EDGES + DEBUG_VERTICES + DEBUG_CENTER ;Zeichnen Flip 0 WaitTimer Timer Wend End Gibt es eigentlich so etwas wie Reibung in der Engine bzw. lässt sich das einstellen? |
||
Alles muss, nichts kann! |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Okay, jetzt verstehe ich langsam, was du meinst. Das kommt daher, dass aufgrund von Float-Ungenauigkeiten nicht alle Federn gleichstark sind, weswegen die rechte Feder der linken unteren Box ein wenig stärker unter Druck nachgibt als die linke. Dadurch wird die obere Feder ein wenig schräg und die Box rutscht weg.
Mau hat Folgendes geschrieben: obwohl sie das ja eigentlich gar nicht dürften, da sie ja zwischen anderen Boxen eingeklemmt sind und deshalb eigentlich gar nicht wegrutschen könnten
Wenn man keine Reibung einstellt, können sie ohne Probleme wegrutschen ![]() Probier mal den Code hier, dann siehst du, wie Reibung das Problem behebt BlitzBasic: [AUSKLAPPEN] Graphics 800, 600, 0, 2 |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eventuell hilft das einknicken von Boxen entgegen, wenn man die Rechenreihenfolge per Ping/Pong-Verfahren berechnet. Jede Box und jede Ecke eines jeder Box wird in ungeraden Rechenzyklen von hinten nach vorne berechnet. Wird zwar langsamer, könnte aber auch unnötige Rechenzyclen sparen, was sich dann wieder aufhebt. Zumindest ist es bei Verlet so der Fall. | ||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Mau |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe mal ein wenig weiter experimentiert und ein zahnradförmiges Objekt erstellt, das in der Luft hängt und sich dreht:
Code: [AUSKLAPPEN] Graphics 800, 600, 0, 2
SetBuffer BackBuffer() Include "NooNooPhysics.bb" Global Cogwheel.TEntity NNP_CreatePhysics 512, 1024, 1024 ;Physik initialisieren NNP_SetGravity 0, 0.25 ;Gravitation setzen Global Wheel.TEntity CreateLevel() Timer = CreateTimer( 60 ) While Not KeyHit( 1 ) Cls ; ZAHNRAD DREHEN NNP_TurnEntity( Cogwheel, .1, Cogwheel\CenterX,Cogwheel\CenterY, True ) UserInput() NNP_UpdateForces ;Kräfte berechnen NNP_UpdatePhysics ;Physik berechnen lassen NNP_DebugRender DEBUG_EDGES + DEBUG_VERTICES ;Zeichnen Color 255, 255, 255 Text 400, 0, "Pfeiltasten links/rechts, um das Rad zu drehen", True Flip 0 WaitTimer Timer Wend End ; KOORDINATEN FÜR ZAHNRAD PUNKTE Data 22,44, 54,58, 99,33, 101,0, 148,0, 149,33, 195,58, 225,43, 249,82, 220,100, 220,151, 249,169, 225,209, 195,194, 150,220, 148,252, 101,252, 99,219, 53,194, 23,209, 0,170, 28,151, 28,101, 0,82, -1 Function CreateLevel() Wheel = NNP_CreateCircle( 400, 200, 60, 60, 1 ) ;Rad zum rumspielen WallBottom.TEntity = NNP_CreateBox( 400, 600, 800, 10, 1 ) ;Die Wände unten, links und rechts erstellen WallLeft.TEntity = NNP_CreateBox( 0, 300, 10, 600, 1 ) WallRight.TEntity = NNP_CreateBox( 800, 300, 10, 600, 1 ) WallBottom\Locked = True ;Die Wände befestigen WallLeft\Locked = True WallRight\Locked = True WallBottom\CollisionGroup = -1 ;Die Wände in die gleiche Gruppe stecken, damit die Kollision untereinander nicht berechnet wird WallLeft\CollisionGroup = -1 WallRight\CollisionGroup = -1 ; ZAHNRAD ERSTELLEN Cogwheel.TEntity = NNP_CreateEntity( 1 ) Cogwheel\Locked = True Cogwheel\CollisionGroup = -1 offx% = 300 offy% = 300 x% = 0 : y% = 0 : Vert.TVertex = Null : Prev.TVertex = Null : Frst.TVertex = Null Repeat Read x : If x = -1 Then Exit Read y Prev = Vert Vert = NNP_CreateVertex( Cogwheel, x+offx,y+offy ) If Frst = Null Then Frst = Vert If Prev<> Null Then NNP_CreateEdge Cogwheel, Prev, Vert Forever NNP_CreateEdge Cogwheel, Vert, Frst End Function Function UserInput() NNP_TurnEntity Wheel, ( KeyDown( 205 ) - KeyDown( 203 ) )*2, Wheel\CenterX#, Wheel\CenterY#, False ;Das Rad wird um das Zentrum gedreht und so beschleunigt End Function Allerdings fällt die Kugel glatt durch das Zahnrad hindurch. Ausserdem wird die Kugel auch gequetscht und in die "Unendlichkeit" geschleudert, wenn sie sich ganz unten links im Bild befindet und man immer mit der Rechts-Taste gegen das Zahnrad drückt. Woran liegt das bzw. wie kann man das vermeiden? |
||
Alles muss, nichts kann! |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Anfangspost hat Folgendes geschrieben: Die Engine unterstützt soweit die Berechnung aller beliebigen konvexen Objekte.
Ein Zahnrad ist kein konvexes Objekt und wird darum nicht korrekt berechnet. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
Mau |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hmm.... man müsste das Objekt also aus mehreren Grundobjekten zusammenbasteln. Ich habe das mal mit nem Kreis und drei Boxen gemacht, die ich übereinander gelegt habe:
Code: [AUSKLAPPEN] Graphics 800, 600, 0, 2
SetBuffer BackBuffer() Include "NooNooPhysics.bb" Global Cogwheel.TEntity Global Box1.TEntity Global Box2.TEntity Global Box3.TEntity NNP_CreatePhysics 512, 1024, 1024 ;Physik initialisieren NNP_SetGravity 0, 0.25 ;Gravitation setzen Global Wheel.TEntity CreateLevel() Timer = CreateTimer( 60 ) While Not KeyHit( 1 ) Cls UserInput() NNP_UpdateForces ;Kräfte berechnen NNP_UpdatePhysics ;Physik berechnen lassen NNP_DebugRender DEBUG_EDGES + DEBUG_VERTICES ;Zeichnen Color 255, 255, 255 Text 400, 0, "Pfeiltasten links/rechts, um das Rad zu drehen", True Flip 0 WaitTimer Timer Wend End Function CreateLevel() Wheel = NNP_CreateCircle( 400, 100, 60, 60, 1 ) ;Rad zum rumspielen WallBottom.TEntity = NNP_CreateBox( 400, 600, 800, 10, 1 ) ;Die Wände unten, links und rechts erstellen WallLeft.TEntity = NNP_CreateBox( 0, 300, 10, 600, 1 ) WallRight.TEntity = NNP_CreateBox( 800, 300, 10, 600, 1 ) WallBottom\Locked = True ;Die Wände befestigen WallLeft\Locked = True WallRight\Locked = True WallBottom\CollisionGroup = -1 ;Die Wände in die gleiche Gruppe stecken, damit die Kollision untereinander nicht berechnet wird WallLeft\CollisionGroup = -1 WallRight\CollisionGroup = -1 ; ZAHNRAD Cogwheel.TEntity = NNP_CreateEntity( 1 ) Cogwheel\Locked = 1 Cogwheel\CollisionGroup = -11 offx% = 300 offy% = 415 x% = 0 : y% = 0 : Vert.TVertex = Null : Prev.TVertex = Null : Frst.TVertex = Null For a# = 0 To 360 Step 36 Prev = Vert Vert = NNP_CreateVertex( Cogwheel, offx+Sin(a)*115,offy+Cos(a)*115 ) If Frst = Null Then Frst = Vert If Prev<> Null Then NNP_CreateEdge Cogwheel, Prev, Vert Next NNP_CreateEdge Cogwheel, Vert, Frst Box1.TEntity = NNP_CreateBox.TEntity( offx, offy, 300, 70, 1 ) NNP_TurnEntity( Box1, 36, Box1\CenterX,Box1\CenterY, True ) Box1\Locked = 1 Box1\CollisionGroup = -11 Box2.TEntity = NNP_CreateBox.TEntity( offx, offy, 300, 70, 1 ) NNP_TurnEntity( Box2, -36, Box2\CenterX,Box2\CenterY, True ) Box2\Locked = 1 Box2\CollisionGroup = -11 Box3.TEntity = NNP_CreateBox.TEntity( offx, offy, 300, 70, 1 ) NNP_TurnEntity( Box3, 90, Box3\CenterX,Box3\CenterY, True ) Box3\Locked = 1 Box3\CollisionGroup = -11 End Function Function UserInput() NNP_TurnEntity Wheel, ( KeyDown( 205 ) - KeyDown( 203 ) )*2, Wheel\CenterX#, Wheel\CenterY#, False ;Das Rad wird um das Zentrum gedreht und so beschleunigt End Function Die Kollision funktioniert so einwandfrei, aber es gibt ein neues Problem -wenn ich nun alle vier Objekte, die zusammen das Zahnrad darstellen, gemeinsam drehe, indem ich unter das CLS in der Hauptschleife einfüge: Code: [AUSKLAPPEN] ; ZAHNRAD DREHEN
NNP_TurnEntity( Cogwheel, .1, Cogwheel\CenterX,Cogwheel\CenterY, True ) NNP_TurnEntity( Box1, .1, Box1\CenterX,Box1\CenterY, True ) NNP_TurnEntity( Box2, .1, Box2\CenterX,Box2\CenterY, True ) NNP_TurnEntity( Box3, .1, Box3\CenterX,Box3\CenterY, True ) Drehen die Objekte sich irgendwie nicht synchron. Mit der Zeit verschieben sie sich ein wenig. Woran liegt das? P.S. Wäre es nicht machbar, das man einige Befehle hinzufügt, um Grundobjekte zu gruppieren, so das diese gemeinsam gedreht, positioniert werden etc.? Auf diese Art könnte man dann ja auch komplexere Objekte erstellen, ohne das man sich um alle einzeln kümmern muss. |
||
Alles muss, nichts kann! |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Durch Floatungenauigkeiten sind die Zentren der einzelnen Objekt nicht ganz exakt übereinander, weswegen sie mit jeder Drehung ein wenig asynchroner werden. Das kann man relativ einfach beheben, indem man einen Fixpunkt nimmt oder das Zentrum eines Objekts für alle anderen auch benutzt BlitzBasic: [AUSKLAPPEN] NNP_TurnEntity( Cogwheel, .5, Cogwheel\CenterX,Cogwheel\CenterY, True ) Mau hat Folgendes geschrieben: P.S. Wäre es nicht machbar, das man einige Befehle hinzufügt, um Grundobjekte zu gruppieren, so das diese gemeinsam gedreht, positioniert werden etc.? Auf diese Art könnte man dann ja auch komplexere Objekte erstellen, ohne das man sich um alle einzeln kümmern muss.
Das Gruppieren von Objekten ist leider nicht ganz so einfach, aber ich arbeitete eine Zeit lang an einer Version, die das umsetzte (WL-Eintrag). Leider war sie enttäuschend langsam, weswegen ich sie auch nie veröffentlichte. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
GERMAX |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich hab mir deine Arbeit auch mal angesehen. Ganz einfach, weil ich mir überlegt hatte einen 2-d Flipper draus zu machen und den 3-d Tisch (irgendwie) drüberzustülpen. Die anderen dlls waren mir zu mies dokumentiert, sodass man (also genauer: ich) kaum was damit anfangen kann.
Bei dem Beispiel <tube> glaub ich heisst das, hatte ich deshalb eine 2. Kugel da eingebaut. Die Framerate brach dabei um 20FPS ein. Das ist eine ganze Menge Holz für so ein eckiges Teil. Dabei hätte ich die Kugel sowieso noch um einiges runder machen müssen. Und da so die Umrisse eines Flippers reinzuhacken, wäre auch ganz schön aufwändig geworden (aber th. machbar). |
||
Erfolglos begonnene BB-Projekte:TRON/CONVOY/MYSTIC |
ProfPilleBetreff: Masse |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi, also ich wollte mal ne idee über das einbauen von masse posten ![]() alle entitys brauchen eine variable MASSE, bei der Kollision musst du die oblekte dann nict beide um die HÄLFTE verschieben sondern dem verhältnis der masse entsprechend: also z.B. 2 objekte überlappen sich um 15 pixel, objekt 1 ist 50kg schwer objekt 2 ist 100 kg schwer also muss man objekt 1 um 10 pixel verschieben und objekt 2 um 5 (nur so als beispiel) Formel: verschiebung_objekt1= gesamtverschiebung * ( 1 - Gesamtmasse / Masse_Objekt1) (oder verschiebung_objekt1= gesamtverschiebung * ( Gesamtmasse / Masse_Objekt2) ) zum obigen beispiel also: 10= 15 * (1 - 150/50) übrigens: Sehr gute arbeit, die physik haut eigentlich sauber hin ![]() |
||
"Courage is the Magic, who turns dreams into Reality." |
![]() |
Tornado11 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Idee ist richtig aber die Formel offensichtlich falsch.
15* (1-150/50) = 15 *(1-3) = -30 obwohl die gesammtverschiebung max 15 sein sollte Richtig wäre: s1 + s2 = d // s1, s2 verschiebung ; d überlappungstiefe //verschiebung von der masse abhängig machen m1 * s1 = m2 * s2 Formel zusammenstopfen und umformen umformen... s1 = m2 /(m1 + m2) * d s2 = m1 / (m1 + m2) * d Die 0.5 er verschiebung stellt sich dabei als spezialfall heraus für m1 = m2 s1 = 1/2 * d s2 = 1/2 * d |
||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ProfPille: So funktioniert das nicht, da ich hier nicht auf Objektbasis arbeite. In der Kollisionsabfrage werden also nicht ganze Objekte verschoben, sondern nur die zwei Punkte, die zur Kollisionskante gehören, d.h. deren Verschiebung hängt nicht von der Gesamtmasse des Objekts ab, sondern von der interpolierten Masse am Kollisionspunkt.
Das Problem behob ich aber schon vor zwei Jahren, die Lösung findest du hier. Da aber so ziemlich niemand die Physik-Lib verwendete, habe ich das nie in die NNP eingebaut. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
ProfPille |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ich mein natürlich Masse_objekt1/Gesamtmasse nicht andersrumm^^
wo hab ich nur wieder meinen Kopf?? Achja hier |
||
"Courage is the Magic, who turns dreams into Reality." |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group