Billiard-Physik
Übersicht

Gehe zu Seite Zurück 1, 2, 3 Weiter
![]() |
N0X |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gut, nur irgendwie Zeigt er mir jetzt an das es die ganze Zeit eine Kollision gibt. ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok, danke, klappt nur leider immer noch nicht ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5% |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! ![]() Besonders an n-Halbleiter danke! ![]() //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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5% |
n-Halbleiter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Code: [AUSKLAPPEN] For k.Kugel = Each Kugel
<- Damit ist eigentlich klar, warum es nicht funktioniert: Jeder Kugel wird die id 15 gesetzt. For i=0 To 15 k\id=(i) Next Next ![]() Nutze After ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzBasic: [AUSKLAPPEN] Local idCounter% = 0 Das dürfte es auch tun. MfG DaysShadow |
||
Blessed is the mind too small for doubt |
n-Halbleiter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Oder das.
Ich wollte ja lediglich auf die Problematik der verschachteteln Schleifen hinweisen. ![]() |
||
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
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group