(Java3D) Einen Faden programmieren - Logikproblem

Java3D_Noob

Mitglied
Hallo Community,
ich hab ein Problem. Und zwar muss ich ein Fadenpendel simulieren.(mit Java3D) Das ganze sieht so aus, dass ein Punkt auf einem Koordinatensystem liegt, der sich nicht bewegen kann. An diesem wird der Faden befestigt und auf der anderen Seite des Fadens ist ein zweiter Punkt, der wiederum bewegt werden kann.
Die Bewegungen werden durch programmierte Kräfte simuliert (wie in Physik). In der Schule haben wir z.B. eine Feder programmiert, was dazu führte, dass der 2. Punkt Durch Schwerkraft und durch die Feder hin und her "schwingt" - wie in echt halt auch.
Mein Problem: Ich hab keine Idee wie ich diesen Faden von der Logik her programmieren soll. Ich hab schon versucht die Feder mit sehr sehr hoher Federhärte als Faden zu betrachten, aber das ist zu ungenau und schwingt trotzdem noch ein bisschen hoch und runter.

Hat jemand eine Idee wie ich einen Faden rein von der Logik her überhaupt programmieren könnte?

Hier mal den Text von der Feder:
[JAVA=42]
package basisklassen;

/**
* Zwischen zwei Massepunkten ist eine Feder angebracht.<br>
* Die Feder ist masselos und kann in Abhängigkeit von ihrer Nulllänge, der Federhärte und ihrer aktuellen
* Dehnung den Massepunkten die wirkende Kraft mitteilen.<br>
* Gerade wegen der Masselosigkeit der Feder ist sie auch bestens dafür geeignet,
* andere Kräfte wie Gravitation oder Coulombkraft zu simulieren.
*
* @author **********
* @version 1.0 (9.12.2012)
*/
public class Feder {
private double D = 0;
private double l0 = 0;
private Massenpunkt m1;//Massenpunkt: Die Punkte, die im Koordinatensystem sind.(eigene Klasse)
private Massenpunkt m2;

private Vektor F = new Vektor(); // eigene Klasse, dient für die Erstellung von Punkten im Koord.-Sys.
double l;
double ds;

/**
* Eine neue Feder wird erzeugt.<br>
* Diese hat eine Federhärte (in N/m), eine Nulllänge (in m) einen Anfangspunkt und einen Endpunkt, wobei egal ist, welcher welcher ist.
*
* @param _D Federhärte
* @param _l0 Nulllänge
* @param _m1 Anfangspunkt
* @param _m2 Endpunkt
*/
public Feder(double _D, double _l0, Massenpunkt _m1, Massenpunkt _m2) {
D = _D;
l0 = _l0;
m1 = _m1;
m2 = _m2;
}
public double getl0(){
return l0;
}

/**
* Die passenden Kräfte wirken auf die beiden Massenpunkte.
*
* @see Massenpunkt
*/
public void KraefteWirken() {
// Bestimme den Richtungsvektor: (m2 - m1) und die Länge davon.
F.set(m2.getX());
F.Subtrahiere(m1.getX());
l = F.Laenge();
// Jetzt nur Richtung des Vektors von m1 nach m2 merken:
F.Normieren();
// Dehnung berechnen.
// Die ist positiv, wenn die Feder länger als l0 ist.
// Dann wird m2 herangezogen (also -r) und m1 auch (also +r).
// Dehnung ist negativ, wenn die Feder kürzer als l0 ist.
// Dann wird m2 abgestoßen (also +r) und m1 auch (also -r).
// Also wie "positiv" denken, den Rest macht das Vorzeichen von ds!
ds = l - l0;
F.MultipliziereZahl(ds);
F.MultipliziereZahl(D);
// Das ist nun offensichtlich die Kraft auf die Masse 1:
m1.F_wirkt(F);
// umgekehrte Kraft auf die Masse 2:
F.Gegenvektor();
m2.F_wirkt(F);
}

}

[/code]

Ich hab mir schon überlegt, dass ich irgendwie die Dehnung so machen muss, dass sie immer 1 (also keine Dehnung) ist. Aber das klappt irgendwie nicht.

Vielen Dank im vorraus 🙂
 
Das mit der "Länge 1" ist schon nicht verkehrt. Bei Kräften hat man ja immer ein Problem: Wenn man den Faden wirklich NICHT-dehnbar machen will (oder auch nur "sehr wenig dehnbar") dann treten leicht mal große Kräfte auf. Ein normaler Euler wird da instabil, und einen impliziten Löser... ... willst du sicher nicht schreiben 😉 (abgesehen davon, dass er ggf. unerwünschte Dämpfung reinbringt). Das ganze findet praktische Anwendung eher im 2D-Fall, nämlich bei der Stoffsimulation. Aber auch der 1D-Fall kommt vor: Bei der Simulation von Haaren. Da wurde auf der letzten VRIPHYS ein Verfahren vorgestellt, das kannst du dir ggf. mal ansehen: http://www.matthiasmueller.info/publications/FTLHairFur.pdf
 
Wird das nicht alles zu kompliziert? Im Grunde sind die Massepunkte steif im Raum, vlt. auf beliebig zu definierenden Koordinaten. Die wirkende Kraft auf jeden Punkt ist genau die halbe Federkraft, welche sich aus der FEderkonstante ermitteln lässt. Die in x,y,z-Richtung wirkenden Kräfte kannst du aus dem Kräftegleichgewicht und ein paar Winkelfunktionen ermitteln.
 
Ok schonmal ein großes Danke an euch beide 🙂 Ich glaub allerdings dass Marco13s Lösung wirklich zu kompliziert für mich ist, im Moment bin ich in der 11. Klasse und euler zeugs hatten wir noch garnicht.. :/ @Horschie: Ja die Massenpunkte kann man beliebig im Raum setzen, aber wie kommst du darauf, dass die Kraft, die wirkt die halbe Federkraft ist? (sorry falls das ne blöde Frage ist, aber Physik hab ich abgewählt.. xD)
Ach ja und ich hab mal folgendes versucht, bei der Feder:
Java:
[...]
l0 = l;
ds = l - l0 +1 ;
F.MultipliziereZahl(ds);
[...]
Aber dann springt alles nurnoch wild hin und her, sah sehr lustig aus 😀 aber leider nicht hilfreich???:L
 
Zuletzt bearbeitet:
Das mußte so klappen:

Dein beweglicher Punkt hat einen Ort und einen (Anfangs-)Geschwindigkeitsvektor. Die Gravitation erzwingt eine Beschleunigung (kann auch bremsend wirken), welche in einem kleinen Zeitintervall delta_t eine Geschwindigkeitsänderung bewirkt. Du darfst nur Komponenten der Beschleunigung benutzen, welche senkrecht zur Fadenlinie stehen.
 
Vermutlich hattet ihr den Euler schon, habt ihn aber nicht unter diesem Namen kennengelernt: Irgendwo werden ja aus Kräften neue Beschleunigungen berechet, aus den Beschleunigungen dann neue Geschwindigkeiten, und das den Geschwindigkeiten neue Positionen. Das ist quasi der Euler. Aber vielleicht findest du auch eine einfachere Lösung für das ganze, als das, was z.B. in http://www.matthiasmueller.info/publications/posBasedDyn.pdf beschrieben ist.
 

Neue Themen


Zurück
Oben