Billiard-Physik

Übersicht BlitzBasic Blitz3D

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen

N0X

BeitragFr, Jul 31, 2009 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
   For k1.Kugel = Each Kugel
      For k2.Kugel = Each Kugel
           If Handle(K1)<>Handle(K2) Then
            D# = Sqr((EntityX(white\mesh)-EntityX(k1\mesh))^2+(EntityY(white\mesh)-EntityY(k1\mesh))^2)
            R# = 1
               If D#<2*R# Then Text 10,10,"Kollision?!"
         EndIf
      Next
   Next


Confused
Ich check das nich.
Ich weiß ihr habt mir genug Lösungsansätze gegeben. Trotzdem kapier ich das nicht.
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%
  • Zuletzt bearbeitet von N0X am Fr, Jul 31, 2009 20:24, insgesamt einmal bearbeitet
 

n-Halbleiter

BeitragFr, Jul 31, 2009 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
So in etwa. Wobei hier noch optimiert werden kann: Setze zuerst anstatt "^2" ein "*" mit dem selben Term ein ((EntityX(white\mesh)-EntityX(k1\mesh))^2 -> ((EntityX(white\mesh)-EntityX(k1\mesh))*((EntityX(white\mesh)-EntityX(k1\mesh)). Das wird Geschwindigkeit bringen.

Zusätzlich solltest du die Geschichte der in-Reichweite-Erkennung in eine andere Form bringen, um nochmals Geschwindigkeit einzusparen: Code: [AUSKLAPPEN]
D#= InRange(EntityX(white\mesh),EntityY(white\mesh),EntityX(k1\mesh),EntityY(k1\mesh),R#)


Dazu die Funktion InRange: Code: [AUSKLAPPEN]
Function InRange(X1#,Y1#,X2#,Y2#,Range)
   Return ((X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2))<=(Range*Range)
End Function


Was macht dieses Konstrukt? Die Funktion nutzt den Satz des Pythagoras in der Form a² + b² = c². Hier wird keine Wurzel gezogen, wodurch die Geschwindigkeit um einiges erhöht wird. 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

BeitragFr, Jul 31, 2009 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut, nur irgendwie Zeigt er mir jetzt an das es die ganze Zeit eine Kollision gibt. Surprised
Hab' ich den Radius falsch gesetzt? (müsste doch 1 sein, ich Scale ja nix oder so)
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%
  • Zuletzt bearbeitet von N0X am Fr, Jul 31, 2009 20:31, insgesamt einmal bearbeitet
 

n-Halbleiter

BeitragFr, Jul 31, 2009 20:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Das wird daran liegen, dass du alle Kugeln (darunter die weiße) durchgehst, und dann mit der weißen auf Kollision prüfst.^^
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

BeitragFr, Jul 31, 2009 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Das heißt eher so?
Code: [AUSKLAPPEN]
D# = InRange(EntityX(k1\mesh),EntityY(k1\mesh),EntityX(k2\mesh),EntityY(k2\mesh),R#)
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%
 

n-Halbleiter

BeitragFr, Jul 31, 2009 20:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau. Als nächstes solltest du dich mit der Kollisionsbearbeitung herumschlagen. Dieses Thema ist schon ziemlich komplex. Zap hat schonmal etwas geschickt, mit dem du etwas anfangen kannst: http://de.wikipedia.org/wiki/Sto%C3%9F_(Physik). Ansonsten ist das Stichwort, was du brauchst "Rigid Body Physics". Das hier dürfte viel abdecken: http://chrishecker.com/Physics_References (englisch). Wobei das ganze, da ja an sich nur Stöße relevant sind, ziemlich vereinfachbar ist. Wenn du Vektoren kannst, dürfte das recht (*hust*) einfach sein. Ich mache mir jetzt mal Gedanken dazu, während ich noch ein wenig zocke. ^^ Falls sich noch Fragen ergeben, werde ich mich danach bemühen, sie zu beantworten. 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

BeitragFr, Jul 31, 2009 20:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, danke, klappt nur leider immer noch nicht Sad
Naja ich schick mal n bisschen mehr Code unter die Leute:
Code: [AUSKLAPPEN]
Type kugel
   Field x#,z#
   Field mesh
End Type

For k1.Kugel = Each Kugel
   For k2.Kugel = Each Kugel
        If Handle(K1)<>Handle(K2) Then
         R# = 0.5
         D# = InRange(EntityX(k1\mesh),EntityY(k1\mesh),EntityX(k2\mesh),EntityY(k2\mesh),R#)
            If D#<2*R# Then Text 10,10,"Kollision?!"
      EndIf
   Next
Next

Function InRange(X1#,Y1#,X2#,Y2#,Range)
   Return ((X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2))<=(Range*Range)
End Function
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%
 

n-Halbleiter

BeitragFr, Jul 31, 2009 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du die Kugeln vorher schon bewegt? Wenn ja, probiere mal deinen Code mit dem "normalen" Ansatz für Distanzerkennung (den mit Sqr(...)), es kann sein, dass ich beim auf die Schnelle Code-hinschreiben einen Fehler gemacht habe. Wenn es immernoch nicht funktioniert, muss das Problem an anderer Stelle sitzen.
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

BeitragFr, Jul 31, 2009 22:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich versteh' das nicht..
Code: [AUSKLAPPEN]
Const BALL=1,TISCH=2
Global qx=0,wForce#=4,stoss

Type kugel
   Field x#,z#
   Field mesh
End Type

Graphics3D 1680,1050,32,1
SetBuffer BackBuffer()

Global cam = CreateCamera()

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

Global queue = LoadMesh("models\queue.3ds")

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

white\mesh = LoadMesh("models\balls\white.3ds")
one\mesh   = LoadMesh("models\balls\one.3ds")
two\mesh   = LoadMesh("models\balls\two.3ds")
three\mesh = LoadMesh("models\balls\three.3ds")
four\mesh  = LoadMesh("models\balls\four.3ds")
five\mesh  = LoadMesh("models\balls\five.3ds")
six\mesh   = LoadMesh("models\balls\six.3ds")
seven\mesh = LoadMesh("models\balls\seven.3ds")
eight\mesh = LoadMesh("models\balls\eight.3ds")
nine\mesh  = LoadMesh("models\balls\nine.3ds")
ten\mesh   = LoadMesh("models\balls\ten.3ds")
ele\mesh   = LoadMesh("models\balls\eleven.3ds")
twe\mesh   = LoadMesh("models\balls\twelve.3ds")
thi\mesh   = LoadMesh("models\balls\thirteen.3ds")
fut\mesh   = LoadMesh("models\balls\fourteen.3ds")
fif\mesh   = LoadMesh("models\balls\fifteen.3ds")

PositionEntity white\mesh,-100,80,0
PositionEntity one\mesh,80,80,0
PositionEntity two\mesh,88,80,4.5
PositionEntity three\mesh,88,80,-4.5
PositionEntity four\mesh,96,80,9
PositionEntity eight\mesh,96,80,0
PositionEntity five\mesh,96,80,-9
PositionEntity six\mesh,104,80,13.5
PositionEntity seven\mesh,104,80,4.5
PositionEntity nine\mesh,104,80,-4.5
PositionEntity ten\mesh,104,80,-13.5
PositionEntity ele\mesh,112,80,18
PositionEntity twe\mesh,112,80,9
PositionEntity thi\mesh,112,80,0
PositionEntity fut\mesh,112,80,-9
PositionEntity fif\mesh,112,80,-18

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

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

PositionEntity cam,-100,200,-300
RotateEntity cam,20,0,-7
TurnEntity cam,0,-20,0
CameraRange cam,1,1500

EntityType table,TISCH

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

Collisions BALL,TISCH,2,2
Collisions BALL,BALL,2,2
While Not KeyHit(1)
   Cls
   RotateEntity cam,EntityPitch(cam)+MouseYSpeed(),EntityYaw(cam)-MouseXSpeed(),0
   
   For k1.Kugel = Each Kugel
      For k2.Kugel = Each Kugel
           If Handle(K1)<>Handle(K2) Then
            R# = 1
            D# = InRange(EntityX(k1\mesh),EntityY(k1\mesh),EntityX(k2\mesh),EntityY(k2\mesh),R#)
               If D#<2*R# Then Text 10,10,"Kollision?!"
         EndIf
      Next
   Next
   
   updBalls()

   PositionEntity queue,qx,78,0
   
   RenderWorld()
   UpdateWorld()
   Flip
Wend
End

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

Function InRange(X1#,Y1#,X2#,Y2#,Range)
   Return ((X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2))<=(Range*Range)
End Function

Function updBalls()
   For k.Kugel = Each Kugel
      TranslateEntity k\mesh,0,-1,0
   Next
   
   If KeyHit(57) Then
      qx=-210
      RotateEntity queue,0,180,7
      
      PositionEntity cam,-160,83,0
      RotateEntity cam,6,-90,0
   EndIf
   
   If KeyHit(54) Then stoss=1
   
   If stoss=1 Then
      MoveEntity white\mesh,wForce#,0,0
   EndIf
   
   If MouseDown(1) Then
      qx=qx-MouseYSpeed()
      
      If qx<-230 Then qx=-230
      If qx>-202 Then qx=-202
   EndIf
   If KeyDown(17) Then MoveEntity cam,0,0,4
End Function


Ist jetzt n ganz schöner Batzen, sorry, aber ohne deine Hilfe pack ich das nich. Rolling Eyes
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Noobody

BeitragFr, Jul 31, 2009 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst in der Kollisionserkennung EntityX und EntityZ verwenden und nicht, wie im jetzigen Code, EntityX und EntityY. EntityY ist nämlich die Höhenkoordinate, die ja bei allen Kugeln dieselbe ist. X und Z sind die Koordinaten, die bei der Kollision relevant sind.
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

N0X

BeitragFr, Jul 31, 2009 22:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Klar, hatte ich auch probiert, hat aber nicht geklappt weil ich bei
Code: [AUSKLAPPEN]
Return ((X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2))[u]<=(Range*Range)[/u]

das Range ding stehen gelassen.
Jetzt klappts danke! Very Happy
Besonders an n-Halbleiter danke! Razz

//Edit:
Aber wie weiß ich jetzt welche Kugel berührt worden ist? (war ja mein eigentliches Prob.)
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

DaysShadow

BeitragFr, Jul 31, 2009 23:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Gib der Kugel im Type ein Feld id, entweder halt nen Int oder nen String, dann kannst du jede klar identifizieren.

MfG DaysShadow
Blessed is the mind too small for doubt

N0X

BeitragFr, Jul 31, 2009 23:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut, ID's sind vergeben.
Wie kann ich sie auslesen, wenn die Weiße kollidiert?
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%
 

da_poller

BeitragSa, Aug 01, 2009 0:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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ß*

N0X

BeitragSa, Aug 01, 2009 1:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab ich auch schon überlegt, aber die 3. Dimension lass ich da erstmal besser raus. (Da ich mit 2 anscheinend ja schon relativ schnell Probleme bekomm Rolling Eyes )
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%
 

n-Halbleiter

BeitragSa, Aug 01, 2009 2:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Back to Topic: Ich würde sagen, du fügst eben deinem Type ein Feld ID% hinzu, in der du eine eindeutige Zahl speicherst. Möglich wäre zum Beispiel der Handle der Typeinstanz. Dann definierst du eine globale Variable, die du zum Beispiel "Whiteball" nennst. In dieser Variable speicherst du dann die ID der weißen Kugel. Wenn nun eine Kollision erfolgt, prüfst du, ob k1 oder k2 die weiße Kugel sind (z.B. mit "If k1\id=Whiteball <...>", wenn du in der ID-Variable den Handle speicherst. Danach kannst du den Rest deiner Routine abarbeiten.
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 10:53
Antworten mit Zitat
Benutzer-Profile anzeigen
So?

Code: [AUSKLAPPEN]
Global weiss=0

For k.Kugel = Each Kugel
   For i=0 To 15
      k\id=(i)
   Next
Next

For k1.Kugel = Each Kugel
   For k2.Kugel = Each Kugel
          If Handle(k1)<>Handle(k2) Then
         If k1\id=weiss Then Text 10,30,"k1 ist weiss"
         If k2\id=weiss Then Text 10,30,"k2 ist weiss"
         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!"
      EndIf
   Next
Next


Wenn ja, klappt nicht..
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%
 

n-Halbleiter

BeitragSa, Aug 01, 2009 12:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
For k.Kugel = Each Kugel
   For i=0 To 15
      k\id=(i)
   Next
Next
<- Damit ist eigentlich klar, warum es nicht funktioniert: Jeder Kugel wird die id 15 gesetzt. Confused

Nutze After, und packe das in eine For-Next-Schleife.
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)

DaysShadow

BeitragSa, Aug 01, 2009 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Local idCounter% = 0
For k.Kugel = Each Kugel
k\id = idCounter
idCounter = idCounter + 1
Next


Das dürfte es auch tun.

MfG DaysShadow
Blessed is the mind too small for doubt
 

n-Halbleiter

BeitragSa, Aug 01, 2009 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder das.

Ich wollte ja lediglich auf die Problematik der verschachteteln Schleifen hinweisen. 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)

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group