Gummiball Algorithmus
lima-city → Forum → Programmiersprachen → Java
aufprall
ball
betonklotz
code
falle
feder
festen wert nehmen
formel
fragestellung
geschwindigkeit
grundstein
http
import
kugel
masse
physiker
problem
realisieren
schwingung
url
-
Hej,.
bin grad dabei bischen 3D zu Programmiern,.
will einen (nacher mehrere) Bälle die von oben nach runten fallen und herumhüpfen bis zum stillstand ^^
habe derweil nur ein ball der von oben nach unten beschleunigt. und unten einfach unten liegen bleibt. will aber dass der hüpft ^^ :p
nur ich weiß nicht wie ich dass mit dem Rückstoß realisiern soll,,.
gibts da vllt ne formel dazua?!
oda i-welche tipps wie man das realisiern könnte,.
lg knoi -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
berechne doch die fallgeschwindigkeit des balls?
damit kannst du dann etwas anfangen, vielleicht kann ja der User dannach eingeben in welchem Faktor der Ball zurückspringen soll (1.0, 0.8...). wenn er z.B. 0.5 eingibt springt der Bal bis zur hälfte wieder hoch und nimmt von dirt wieder geschwindigkeit an.
MFG -
huh, wofür die Masse? Die spielt doch nichts in die Fallgeschwindigkeit rein...
Zur Fragestellung: Du musst einen festen Wert nehmen. Wie viel Energie der Ball beim Aufprall verliert ist ein sehr komplexes Problem, würde ich sagen, das viele Informationen über den Ball benötigen würde. -
nikic schrieb: huh, wofür die Masse? Die spielt doch nichts in die Fallgeschwindigkeit rein...
ähm,..also beschleungigung ist ja abhängig von masse ^^ und dadurch wird die Geschwindigkeit auch beeinträchtigt?!
oda nich? -
Hm du könntest ja mal versuchen "erstatzweise" dich an einer gedämpften Schwingung zu orientieren. Beispiel Fadenpendel: Bis nach unten zur Ruhelage wird die Kugel beschleunigt, die Bewegung nach oben, wird durch Gewichtskraft abgebremst. Diese Funktion gibt zumindest mal einen mehr oder weniger schönen Graphen.
Schwer wird sicherlich den Aufprall zu betrachten. Hier verformt sich in der Regel der Körper - das zu beschreiben ist sicherlich nicht einfach. Die gedämpfte Schwingung hat da dieses Problem nicht, würde aber ähnlich verlaufen.knoi schrieb: ähm,..also beschleungigung ist ja abhängig von masse ^^ und dadurch wird die Geschwindigkeit auch beeinträchtigt?!
oda nich?
, wobei h die Höhe und g die Erdbeschleunigung. -
Hi,
knoi schrieb:
ähm,..also beschleungigung ist ja abhängig von masse ^^ und dadurch wird die Geschwindigkeit auch beeinträchtigt?!
oda nich?
Die Erdbeschleunigung g ist immer gleich (gleicher Abstand vom Erdmittelpunkt vorausgesetzt). Unterschiede in der Fallgeschindigkeit (z.B. Bleikugel / Feder) werden durch die Luftreibung verursacht.
Über den hüpfenden Ball hat man sich z.B. hier: http://www.schulphysik.de/java/physlet/applets/hops.html schon reichlich Gedanken gemacht. Die Applets gibt es auch zum Download.
Vielleicht hilft es ja weiter.
Gruß
Manni
-
Ja ganz genau will ichs eh noch nicht machen,.
wird mal der Grundstein für ein Spiel was ich machen will :p
mhmh,..dass mit der Pendel scheintne gute idee zu sein,
weiß noch nigt genau wie ichs verwenden soll,.aber is mal ein guter Ansatz,.
thx :) -
Also es gibt verschiedene Möglichkeiten dazu. Haabe auch mal versucht das zu realisieren, dannn ist aber ein anderes Projekt in die Quere gekommen. Wie schon gesagt wäre eine Möglichkeit die Fallgeschwindigkeit ausrechnen zulassen. Damit kannst du dann verschiedens realisieren.
Habe hier mal mein Code von früher:
Hier der source code:
import java.awt.*; import java.awt.geom.*; import java.awt.Component; import java.awt.event.*; import java.util.*; public class BallDemo { private Canvas myCanvas; public BallDemo() { myCanvas = new Canvas("Ball Demo", 600, 500); myCanvas.setVisible(true); } public void bounceBox(int numberBalls) { drawFrame(); bounceInTheBox current = new bounceInTheBox(myCanvas); current.balls(numberBalls); } public void drawFrame() { myCanvas.setForegroundColor(Color.blue); Rectangle rect = new Rectangle(20, 20,myCanvas.getSize().width-40,myCanvas.getSize().height-40); myCanvas.fill(rect); myCanvas.setForegroundColor(Color.white); Rectangle rect2 = new Rectangle(25, 25,myCanvas.getSize().width-50,myCanvas.getSize().height-50); myCanvas.fill(rect2); } } java.bounceInTheBox Java Code: Quelltext in neuem Fenster öffnen import java.awt.*; import java.util.*; public class bounceInTheBox { private Canvas canvas; public bounceInTheBox(Canvas canvas) { this.canvas = canvas; } protected void balls(int number) { ArrayList<BoxBall> balls = new ArrayList<BoxBall>(); Random ran = new Random(); for (int i = 0; i<number;i++) { int xPos = 50,yPos = 50; boolean finished = false; while(!finished) { xPos = ran.nextInt(canvas.getSize().width-51); if (xPos>=25) { finished = true; } } finished = false; while(!finished) { yPos = ran.nextInt(canvas.getSize().height-51); if (yPos>=25) { finished = true; } } finished = false; int diameter = 111; while (!finished) { diameter = ran.nextInt(30)+10; if (diameter%4 == 0) { finished = true; } } BoxBall current = new BoxBall(xPos,yPos,diameter,25,canvas.getSize().width-50,25,canvas.getSize().height-50,canvas); balls.add(current); } for (BoxBall current : balls) { current.move(); } } } java.BoxBall import java.awt.*; import java.awt.geom.*; import java.util.*; public class BoxBall { private int ballDegradation = 2; private Ellipse2D.Double circle; private Color color; private int diameter; private int xPos; private int yPos; private int x1Corn,x2Corn,y1Corn,y2Corn; private Canvas canvas; private int speed; /** * Constructor for objects of class BoxBall */ protected BoxBall(int xPos, int yPos, int ballDiameter, int x1Corn, int x2Corn,int y1Corn,int y2Corn, Canvas drawingCanvas) { this.xPos = xPos; this.yPos = yPos; this.x1Corn = x1Corn; this.x2Corn = x2Corn; this.y1Corn = y1Corn; this.y2Corn = y2Corn; diameter = ballDiameter; canvas = drawingCanvas; Random current = new Random(); boolean finished = false; while (!finished) { speed = current.nextInt(4); if (speed > 0) { finished = true; } } color = Color.getHSBColor( current.nextFloat(), 1.0F, 1.0F ); } public void draw() { canvas.setForegroundColor(color); canvas.fillCircle(xPos, yPos, diameter); } public void erase() { canvas.eraseCircle(xPos, yPos, diameter); } public void move() { boolean finished = false; int a=2,b=1; Random current = new Random(); while(!finished) { a = current.nextInt(speed+1)-current.nextInt(2*speed+1); b= current.nextInt(speed+1)-current.nextInt(2*speed+1); int result = Math.abs(a)+Math.abs(b); if (result == speed) { finished = true; } } while (speed != 0) { if (xPos < x2Corn) { erase(); } else if (yPos < y2Corn) { erase(); } else if (xPos < x2Corn && yPos < y2Corn) { erase(); } xPos +=a; yPos +=b; if (xPos <= x1Corn) { erase(); xPos = x1Corn; draw(); a *=-1; } if (yPos <= y1Corn) { erase(); yPos = y1Corn; draw(); b *=-1; } if (xPos >= x2Corn) { erase(); xPos = x2Corn - diameter; draw(); a *=-1; } if (yPos >= y2Corn) { erase(); yPos = y2Corn - diameter ; draw(); b *=-1; } if (xPos <= x1Corn && yPos <= y1Corn) { erase(); xPos = x1Corn+diameter; yPos = y1Corn+diameter; draw(); a *=-1; b *=-1; } if (xPos >= x2Corn+diameter && yPos <= y1Corn) { erase(); xPos = x2Corn+diameter; yPos = y1Corn; draw(); a *=-1; b *=-1; } if (xPos <= x1Corn && yPos >= y2Corn+diameter) { erase(); xPos = x1Corn; yPos = y2Corn+diameter; draw(); a *=-1; b *=-1; } if (xPos >= x2Corn+diameter && yPos >= y2Corn+diameter) { erase(); xPos = x2Corn+diameter; yPos = y2Corn+diameter; draw(); a *=-1; b *=-1; } if (xPos < x2Corn) { draw(); } else if (yPos < y2Corn) { draw(); } else if (xPos < x2Corn && yPos < y2Corn) { draw(); } canvas.wait(10); } } public int getXPos() { return xPos; } public int getYPos() { return yPos; } }
Habe den Beitrag einfach aus einem anderen Forum in dem ich angemeldet bin rauskopiert deswegen ein bischen unübersichtlich...
Edit: Code ansehnlicher gemacht. Pawnee
Beitrag zuletzt geändert: 14.12.2009 12:06:36 von pawnee -
naja eine etwas (hierfür) merkwürdige möglichkeit bietet jbox2d. dies ist ein physik engine mit der man sowas super machen kann... hat nur den kleinen nachteil das es sich für dein projekt wahrscheinlich nicht rentiert, und dass es bis jetzt (soweit ich weiß) nur ne c++ doku gibt... was aber auch kein problem sein sollte...
mfg andre -
nikic schrieb:
huh, wofür die Masse? Die spielt doch nichts in die Fallgeschwindigkeit rein...
Doch, sicher. Wie willst du sonst den Luftwiderstand berechnen ?
@knoi
Der Luftwiderstand ist auch eine der "Dämpfer", die du verwenden solltest. Darüber hinaus brauchst du die Verformungsenergie, die der Ball beim Aufprall aufnimmt (Netto!). Diese ist durch das Material gegeben, es wäre also das Beste, wenn du dich an realen Materialien orientierst, um auch realwirkende Ergebnisse zu erhalten. Das wars auch schon.
Liebe Grüße
- VampireSilence
Beitrag zuletzt geändert: 14.12.2009 1:16:34 von vampiresilence -
Luftwiderstand ist sinnlos (finde ich), der is so gering, dass den sowiso niemand bemerkt.
P.S. Bitte jetzt kein Physik-Ass des mich belehrt, dass das serwohl einen Unterschied macht -
virtual-player schrieb: Luftwiderstand ist sinnlos (finde ich), der is so gering, dass den sowiso niemand bemerkt.
Die Frage ist, aus welcher Höhe man den Ball fallen lässt.
Denn der Luftwiederstand ist quadratisch zur Geschwindigkeit.
Der Verlust bei der Verformung nur Liniar.
Bei großen Höhen sollte man den Luftwiederstand berücksichtigen.
Bei kleinen Höhen kann man ihn wirklich vernachlässigen.
P.S. es gibt eine Geschwindigkeit bei der, der Ball nicht mehr beschleunigt wird. Bei einen Fallschiermspringer liegt sie bei etwa 55 m/s (in einer quer zum Fall ausgerichteten Lage).
Siehe auch: http://de.wikipedia.org/wiki/Freier_Fall -
luftwiederstand kannst du vernachlässigen, wenn deine Fallzeit weniger als 10 sekunden beträgt... zumindest bei einem Gummiball...
und wenn du mit aufprall und hüpfen berechnen willst, nimm physikalische größen bei höhe, gewicht, berechne die energie des Gummiballs beim auftreffen und dann nimmst du den dämpfungswert zwischen 0 und 1 und berechnest bei jedem kontakt mit dem nullpunkt die neue Energie mit dieser konstante: 0->hüpft ewig, also vollelastisch, 1 hüpft nicht mehr, also Betonklotz auf betonklotz.. da hüpft auch nciht wirklich viel... und um es spannender zu machen, machst du random rein, was die berechnungen immer um 5% variierenlassne kann oder so... dann kannst du auch 5 bälle nebeneinander fallen lassen, und die hüpfen unterschiedlich.
Dein problem mit der elastischen verformung würde ich in 2D mit einer elypse durchführen. dabei definierst du einfach den radius als maximale verformbarkeit, weist dem eine zahl zu und berechnest prozentual zu der derzeitigen aufprallenergie die veränderung von r... das packst du in eine oval-funktion rein... ob du sowas ähnliches für 3D da hast, weiß ich nciht... und diesen ganzen Forgang packst du auch in die Aufprallfunktion rein...
bei fragen, kannst du dich ruhig an mich wenden, wenn du es so umsetzen willst, wie ich es vorgeschlagen habe^^ -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage