NooNooPhysics V1.0

Übersicht Sonstiges Projekte

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

the FR3AK

BeitragDo, Jan 14, 2010 18:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du überhaupt die Vollversion?

Alkan

Betreff: Danke

BeitragDo, Jan 14, 2010 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Apr 22, 2010 13:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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? Shocked
Alles muss, nichts kann!

Noobody

BeitragSa, Apr 24, 2010 11:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Apr 26, 2010 12:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Apr 26, 2010 13:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Razz Der Druck kommt in diesem Beispiel ja nur von oben und von unten, zur Seite können sie problemlos ausweichen.

Probier mal den Code hier, dann siehst du, wie Reibung das Problem behebt BlitzBasic: [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, 100 + Y*60, 50, 50 ) ; Gaaanz viele Würfel erstellen
Crate\Friction# = 0.3 ;Reibung!
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
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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Apr 26, 2010 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Mai 14, 2010 10:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Mai 14, 2010 11:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Mai 14, 2010 14:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Mai 14, 2010 15:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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 )
NNP_TurnEntity( Box1, .5, Cogwheel\CenterX,Cogwheel\CenterY, True )
NNP_TurnEntity( Box2, .5, Cogwheel\CenterX,Cogwheel\CenterY, True )
NNP_TurnEntity( Box3, .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

BeitragFr, Mai 14, 2010 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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
 

ProfPille

Betreff: Masse

BeitragDi, Jul 19, 2011 15:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, also ich wollte mal ne idee über das einbauen von masse posten Idea :
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 Very Happy
"Courage is the Magic, who turns dreams into Reality."

Tornado11

BeitragDo, Jul 21, 2011 16:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jul 21, 2011 18:51
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragDo, Jul 21, 2011 18:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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."

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht Sonstiges Projekte

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group