Billiard-Physik

Übersicht BlitzBasic Blitz3D

Gehe zu Seite Zurück  1, 2, 3

Neue Antwort erstellen

N0X

BeitragSa, Aug 01, 2009 12:49
Antworten mit Zitat
Benutzer-Profile anzeigen
gut, klappt, jetzt hab ich mal versucht aus der "k2\id%" Aktionen zu schlussfolgern.
Hat wie immer nicht so ganz geklappt.
Ich hab einfach ne Select Abfrage eingebaut.

Code: [AUSKLAPPEN]
      For k1.TKugel = Each TKugel
         For k2.TKugel = Each TKugel
              If Handle(k1)<>Handle(k2) Then
               R# = 1
               D# = InRange(EntityX(k1\mesh),EntityZ(k1\mesh),EntityX(k2\mesh),EntityZ(k2\mesh),R#)
                  If D#<2*R# Then
                  Text 10,10,"Kollision!"
                  If k1\id%=weiss Or k2\id%=weiss Then Text 10,30,"Die Weiße kollidiert! Aktion erfordert!"
                  Select k2\id%
                     Case 1
                        MoveEntity one\mesh,wForce#,0,0
                     Case 2
                        MoveEntity two\mesh,wForce#,0,0
                     Case 3
                        MoveEntity three\mesh,wForce#,0,0
                     Case 4
                        MoveEntity four\mesh,wForce#,0,0
                  End Select
               EndIf
            EndIf
         Next
      Next
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%
 

n-Halbleiter

BeitragSa, Aug 01, 2009 14:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso fragst du die k2\id ab, um dann eine Kugel zu bewegen, die offentsichtlich zwar durch eine andere Variable angesprochen wird, allerdings auf den gleichen Eintrag zeigt?

Und: Was funktioniert denn nicht? Gibt es einen Error, bewegt sich die Kugel nicht, oder was geschieht? Wenn sich die Kugel nicht bewegt, sieh' mal nach, ob du schonmal vorher "wforce#" verändert hast. Wink
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)

N0X

BeitragSa, Aug 01, 2009 15:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich dachte wenn k1 die Weiße ist, dann ist k2 irgendeine der anderen Kugeln? Embarassed
naja, also wForce# ist Global mit dem Wert 4 deklariert.
Die Eins bewegt sich ja, aber die anderen die sie berührt müssten dann ja auch mit dem Wert nach hinten rollen. Oder? Rolling Eyes (ich glaub ich mach mir das n bisschen zu einfach)
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

DaysShadow

BeitragSa, Aug 01, 2009 15:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast schon recht wenn du denkst dass wenn k1 die Weiße ist die andere nicht die Weiße ist, denn du prüfst ja ob die beiden _nicht_ die selben sind und fährst nur fort wenn das auch zutrifft.
Wenn k1 die weiße ist und k2 ebenfalls dann überspringst du ja den Rest, das müsste also passen.

Andersweitig kann ich dir aber auch grad nicht helfen =/

MfG DaysShadow
Blessed is the mind too small for doubt
 

n-Halbleiter

BeitragSa, Aug 01, 2009 15:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Du machst dir das zu einfach. Ich würde sagen, du schmeißt den Code nochmal um und gehst folgende Schritte durch (Wenn du Vektoren nicht kannst, sieh' dir diese Seite an: http://www.mathe-online.at/mathint/vect1/i.html, sie hat mir zum Thema gut geholfen):

Arrow Den Type TKugel um die Werte XVelocity# und ZVelocity# erweitern (Diese Werte werden als Vektoren genutzt.)
Arrow Eine Schleifenverschachtelung erstellen, in der jede Kugel mit jeder anderen Kugel abgearbeitet wird.
Arrow Die beiden Kugeln auf Kollision prüfen (den Teil hatten wir ja schon)
Arrow Mittels Vektorrechnung (dazu ein wenig überlegen, oder über Google suchen, es gibt sicherlich eine vielzahl an Ansätzen die schon beschrieben wurden) die Reaktion auf die Kollision berechnen (pro Kugel dann in X- bzw. ZVelocity speichern).
Arrow Kugeln um die Vektoren bewegen.

Wieso Vektorrechnung? Sie benutzt keine trigonometrischen Funktionen, sondern nur die Grundrechenarten, was die Sache schnell macht. Falls du dich nicht an Vektoren herantraust, was ja auch okay ist, dann musst du versuchen, mit Winkeln herumzuhantieren.

So, ich muss jetzt weg, ich hoffe ich konnte helfen. Smile
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)

N0X

BeitragSa, Aug 01, 2009 18:33
Antworten mit Zitat
Benutzer-Profile anzeigen
So, ich habe von ZaP mal ein paar Ausschnitte bekommen wie man das machen sollte.
Ich habe diesen Code mal (fast 1zu1 Twisted Evil übernommen)
Meine Frage nun, wieso prallt nix ab etc. wenn ich die Weiße gegen die anderen prallen lasse?

Code: [AUSKLAPPEN]
Const BALL=1,TISCH=2
Global wForce#=4,stoss
Local idcounter%=0

Type TKugel
   Field id%
   Field x#,y#,z#
   Field mesh
   Field speedx#,speedy#
   Field mass#
End Type

;---------------------------------------------------------------------|

Graphics3D 640,480,32,1
SetBuffer BackBuffer()

Global cam = CreateCamera()

;---------------------------------------------------------------------|

table = LoadMesh("models\table.3ds")

Global white.TKugel = New TKugel
Global one.TKugel   = New TKugel
Global two.TKugel   = New TKugel
Global three.TKugel = New TKugel
Global four.TKugel  = New TKugel
Global five.TKugel  = New TKugel
Global six.TKugel   = New TKugel
Global seven.TKugel = New TKugel
Global eight.TKugel = New TKugel
Global nine.TKugel  = New TKugel
Global ten.TKugel   = New TKugel
Global ele.TKugel   = New TKugel
Global twe.TKugel   = New TKugel
Global thi.TKugel   = New TKugel
Global fut.TKugel   = New TKugel
Global fif.TKugel   = New TKugel

;Hier lade ich die Meshes

;---------------------------------------------------------------------|

For k.TKugel = Each TKugel
   k\id%=idcounter%
   idcounter%=idcounter%+1
Next

For k.TKugel = Each TKugel
   EntityType k\mesh,BALL
Next

EntityType table,TISCH

;---------------------------------------------------------------------|

Collisions BALL,TISCH,2,2
While Not KeyHit(1)
   Cls
   
   physics()
   updBalls()

   RenderWorld()
   UpdateWorld()
   Flip
Wend
End

;---------------------------------------------------------------------|

Function physics()
   For k.TKugel = Each TKugel
      k\speedx# = k\speedx# * 0.99
      k\speedy# = k\speedy# * 0.99
         
      If k\speedx# < 0.001 And k\speedx# > -0.001 Then k\speedx# = 0.0
      If k\speedy# < 0.001 And k\speedy# > -0.001 Then k\speedy# = 0.0
      
      For k2.TKugel = Each TKugel
         If k2\mesh <> k\mesh Then
            k\x# = EntityX(k\mesh)
            k\y# = EntityY(k\mesh)
            k\z# = EntityZ(k\mesh)

            k2\x# = EntityX(k2\mesh)
            k2\y# = EntityY(k2\mesh)
            k2\z# = EntityZ(k2\mesh)

            If EntityDistance(k\mesh, k2\mesh) <= 0.122 ; >> kollision
               Text 10,10,"Kollision!"
               collision_normal_degree# = ATan2(k2\z#-k\z#, k2\x#-k\x#)

               vectorX# = Cos(collision_normal_degree#)
               vectorY# = Sin(collision_normal_degree#)

               movement_vector1# = k\speedx# * vectorX# + k\speedy# * vectorY#
               movement_vector2# = k2\speedx# * vectorX# + k2\speedy# * vectorY#

               speedfactor# = (2.0 * (movement_vector1# - movement_vector2#)) / (k\mass# + k2\mass#)

               k\speedx# = k\speedx# - speedfactor# * k\mass# * vectorX#
               k\speedy# = k\speedy# - speedfactor# * k\mass# * vectorY#

               k2\speedx# = k2\speedx# + speedfactor# * k2\mass# * vectorX#
               k2\speedy# = k2\speedy# + speedfactor# * k2\mass# * vectorY#
            EndIf
         EndIf
      Next
   Next
End Function

Function updBalls()
   For k.TKugel = Each TKugel
      TranslateEntity k\mesh,0,-1,0
   Next
   
   If KeyHit(54) Then stoss=1
   
   If stoss=1 Then
      MoveEntity white\mesh,wForce#,0,0
   EndIf
End Function


Mfg,
N0X

PS.:
@ZaP: Wenn ich den Code nicht so verwenden darf, sag bescheid.
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Tankbuster

BeitragSa, Aug 01, 2009 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil du keine Ball-Ball kollision sondern nur Ball-Tisch Kollision hast?
Twitter
Download Jewel Snake!
Windows|Android

N0X

BeitragSa, Aug 01, 2009 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Passiert trotzdem nix.
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Tankbuster

BeitragSa, Aug 01, 2009 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Bewegen sich die anderen Kugeln auch?
Es gibt immer wieder Probleme mit Kollisionen von 2 Bewegenden Entitys. Daher würde ich dir vorschlagen, eine eigene Kollisionsroutine zu schreiben. EntityDistance müsste dafür reichen.
Twitter
Download Jewel Snake!
Windows|Android

hazumu-kun

BeitragSa, Aug 01, 2009 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
da_poller hat Folgendes geschrieben:
Noobody hat Folgendes geschrieben:
Ausserdem hast du bei einem Billardspiel ja nur zwei Dimensionen, die du berücksichtigen musst; die Kugeln bewegen sich ja nur auf dem Tisch und können sich in der Höhe nicht bewegen.


das halte ich für ein gerücht.. (zumindest gibt es mittel und wege bei denen die 3te dimension die ein oder andere partie retten kann!
*klugscheiß*


Beim Poolbilliard ist eine springende Kugel automatisch ein Foul!
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent
 

da_poller

BeitragSa, Aug 01, 2009 23:43
Antworten mit Zitat
Benutzer-Profile anzeigen
viken... wozu besitze ich dann ein jump queue? oO sry für ot, aber ein jumpshot ist im pool billard(8ball, 9 ball sowie 14/1) ein erlaubtes und genutztes mittel. für detailfragen bitte aber dann pm.

Gehe zu Seite Zurück  1, 2, 3

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group