#1 03.01.2007 14:02:24

simon
ProMember
Ort: Düsseldorf
Registriert: 03.06.2006
Beiträge: 168

Physik?

kaum ist das eine Problem gebannt da kommt das nächste:o
es geht (glaub ich;) ) um physic's in 2D- 
ich wollte 2 Sachen hinkriegen
1. herunterhängende Ketten/ Seile...
2. Brücken bzw ein Seil, dass an 2 Enden festgehalten wird
(wie im Bild - roter Punkt ist "fest" grüne Punkte sollen herunterhängen)
http://img80.imageshack.us/img80/8739/physicsxc9.jpg

mit dem ersten hatte ich keine Probleme - da rechne ich einfach vom letzten grünen bis zum  roten Punkt. - wie mach ich das jetzt am besten mit 2 festen Punkten?
Hinweise / Links währen echt hilfreich smile

Edited by JorEl


grrr

Offline

 

#2 03.01.2007 14:34:19

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Physik?

Zitat:

da rechne ich einfach vom letzten grünen bis zum roten Punkt.

Das funktioniert nicht so einfach, jedenfalls nicht wenn es wirklich ein Seil/Kette sein soll. Ein Seil muss ja nicht immer straff gespannt sein, daher ist das ganze schon etwas komplizierter. Ich würde eine fertige Physikengine (z.B. Newton) verwenden, dann sieht es auch wirklich gut aus smile

Coolcat


My software never has bugs. It just develops random features.

Offline

 

#3 03.01.2007 22:52:53

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Physik?

Sowas macht man mit Feder/Masse-Systemen.

Ist gar nicht so schwer - BridgeBuilder und seine tausend Varianten baut auf selbigem auf - ebenso wie mein Weihnachtsbaum  smile

Das funktioniert so:

Es gibt Massepunkte. Die haben eine Masse (optional), eine Position und eine Geschwindigkeit.

Dann gibt es Federn - Du kannst sie auch Links nennen.
Ein Link verbindet einfach nur zwei der Massepunkte. Genau zwei.
Außerdem beinhaltet ein Link eine Solllänge, also die Länge, bei der die Feder völlig entspannt ist.
Ich gehe davon aus, daß eine Feder sowohl gestaucht als auch auseinandergezogen werden kann.

Also:
Links: array[1..100] of linktyp
linktyp = record (punkt1, punkt2: integer; solllänge: single)

Punkte: array[1..100] of punktetyp
punktetyp = record (posx,posy,velx,vely,masse: single)

Vel steht für Velocity.

Jetzt machst Du einfach nur in jedem Frame: (
Für jeden Link: (
Differenz ausrechnen zwischen Solllänge und tatsächlichem Abstand der beiden Punkte
Diese Differenz gibt die Stärke an, um die die Geschwindigkeit der Punkte in Richtung des Links verändert wird -> Beschleunigung.
Geschwindigkeiten updaten)
Für jeden Punkt: (
Geschwindigkeit falls gewollt dämpfen
Positionen updaten)

Fertig.

Sieht toll aus.
Eine Dämpfung ist notwendig, eine vernünftige aber nicht SO leicht zu implementieren, siehe PD-Regler.

Eine hängende Kette ist damit sehr einfach zu realisieren.
Ebenfalls "starre" Körper, die wabbelig sind, oder Kleidung.

Beispielcode kann ich hinterherschieben.

DerPeer

Offline

 

#4 04.01.2007 09:14:46

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Physik?

Das "Fysik" schmerzt so unglaublich in den Augen aaargh  :x  big_smile

Offline

 

#5 04.01.2007 10:41:47

simon
ProMember
Ort: Düsseldorf
Registriert: 03.06.2006
Beiträge: 168

Re: Physik?

Coolcat - smile ich möchte eben selber sehen wie man sowas macht eine ph.engine benutz ich schon länger aber sowas selber schreiben ist einfach nur genial:)

firlefanz
damne stimmt schreibt man mit ph tongue lol

DerPeer
ok ich werde versuchen das zu Implementieren
für Source währe ich natürlich auch dankbar(um Fehlern entgegen zu wirken... - nicht um zu kopieren;) )

btw scheint echt nicht so schwer zu sein wie ich dachte smile


grrr

Offline

 

#6 04.01.2007 11:29:37

JorEl
ExtremeMember
Registriert: 29.01.2005
Beiträge: 894

Re: Physik?

Zitat:

Das "Fysik" schmerzt so unglaublich in den Augen aaargh

Ich war so frei es zu ändern, denn auch meine Augen hatten damit keine Freude  big_smile

Zitat:

für Source währe ich natürlich auch dankbar

Such mal nach Tutorials über cloth simulation, das ist im Wesentlichen genau das was du implementieren willst.

JorEl


Jesus hat gesagt - selig sind die, die da Leid erfahren, denn sie sollen getröstet werden... Ford Prefect hat gesagt - es ist unheimlich wichtig, dass wir miteinander reden und einen trinken.

Offline

 

#7 04.01.2007 11:50:44

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Physik?

Man könnte noch eine maximale Länge (z.B. 110%) einbauen, bevor das Seil reißt.

Zitat:

damne stimmt schreibt man mit ph :p lol

o.O. Ich dachte das wäre Absicht gewesen...


My software never has bugs. It just develops random features.

Offline

 

#8 04.01.2007 12:20:54

JorEl
ExtremeMember
Registriert: 29.01.2005
Beiträge: 894

Re: Physik?

Zitat:

Ich dachte das wäre Absicht gewesen...

Ich auch zuerst, deswegen hab ich es ursprünglich ja nicht korrigiert.  big_smile


Jesus hat gesagt - selig sind die, die da Leid erfahren, denn sie sollen getröstet werden... Ford Prefect hat gesagt - es ist unheimlich wichtig, dass wir miteinander reden und einen trinken.

Offline

 

#9 04.01.2007 14:35:16

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Physik?

Dachte ich auch. Geschmerzt hat es trotzdem big_smile

Offline

 

#10 04.01.2007 16:57:52

simon
ProMember
Ort: Düsseldorf
Registriert: 03.06.2006
Beiträge: 168

Re: Physik?

Theorie verstanden aber mit der Praxis hab ich noch Probleme.
ich habe mal die Vars vom DerPeer genommen und naja soweit bin ich (ist echt net viel) sad
-die Punkte aufstellen & mit Links verbinden
-die Punkte bewegen sich mit einfacher  Physik wink richtung Boden
  (posy := posy+gewicht)
nun noch die Beschleunigung:

Code: delphi

procedure   do_physics;
var
  i : integer;
  dst : single;
  beschl : single;
begin
//punkte
  for i := 1  to 10  do
    if punkte[i].posy < boden then   
      punkte[i].posy := punkte[i].posy + punkte[i].masse * (time);

//  links
  for i := 1  to 10  do
  begin
    dst := math.getdistance2d(punkte[links[i].punkt1].posx,punkte[links[i].punkt1].posy,                      punkte[links[i].punkt2].posx,punkte[links[i].punkt2].posy);
    if links[i].solllaenge > dst then
      beschl := links[i].solllaenge - dst
      else
      beschl := dst - links[i].solllaenge;    
  end;

end;


(um es zu testen benutz ich kein dynamisches Array)

tja und weiter weiss ich net sad :doof:  :doof:


update:

hab mal sowas gemacht ist aber auch Grütze sad

Code: delphi

procedure   do_physics;
var
  i : integer;
  dst : single;
  beschl : single;
  rad    : single;
begin
  for i := 1  to 10  do
    if punkte[i].posy < boden then
      punkte[i].posy := punkte[i].posy + punkte[i].masse * (time);


//  links
  for i := 1  to 10  do
  begin
    dst := math.getdistance2d(punkte[links[i].punkt1].posx,punkte[links[i].punkt1].posy,
                      punkte[links[i].punkt2].posx,punkte[links[i].punkt2].posy);
//GetRad( y1- y2, x1 - x2);
    if dst > links[i].solllaenge  then
    begin
    beschl := dst - links[i].solllaenge;
    rad := getrad( punkte[links[i].punkt1].posy - punkte[links[i].punkt2].posy, punkte[links[i].punkt1].posx - punkte[links[i].punkt2].posx);
    punkte[links[i].punkt2].posx := punkte[links[i].punkt2].posx + sin(rad)*beschl;
    punkte[links[i].punkt2].posy := punkte[links[i].punkt2].posy + cos(rad)*beschl;
    end;

  end;

end;

grrr

Offline

 

#11 04.01.2007 17:41:28

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Physik?

Du musst für jeden einzelnen Punkt eine Kraft als Vektor speichern (also mit Richtung). Du musst zuerst die Summe aller Kräfte für jeden Punkt berechnen und erst dann den Punkt bewegen.

Coolcat


My software never has bugs. It just develops random features.

Offline

 

#12 05.01.2007 21:04:57

Chris
ExtremeMember
Ort: Erlangen, Bay
Registriert: 24.01.2005
Beiträge: 694
Web-Seite

Re: Physik?

Gibts da irgendwelche Papers dazu?

das ganze interessiert mich irgendwie auch

mfg Chris


Nimm meinen Rat an - ich brauch ihn sowieso nicht

Offline

 

#13 06.01.2007 10:51:40

simon
ProMember
Ort: Düsseldorf
Registriert: 03.06.2006
Beiträge: 168

Re: Physik?

ich habe bis jetzt nur das hier : http://freespace.virgin.net/hugo.elias/models/m_cloth.htm
gefunden. die meisten Tutorials sind aber soweit ich sehe nur for 3D studios hmm

btw
das hier funktioniert schon ganz gut aber leider immer noch net perfekt sad

Code: delphi

procedure   do_physics;
var
  i : integer;
  dst : single;
  beschl : single;
  rad    : single;
begin

  for i := 1  to punkt_count  do
    if punkte[i].posy < boden then
      punkte[i].posy := punkte[i].posy + punkte[i].masse * (time);

//  links
  for i := 1  to links_count  do
  begin
    dst := math.getdistance2d(punkte[links[i].punkt1].posx,punkte[links[i].punkt1].posy,
                      punkte[links[i].punkt2].posx,punkte[links[i].punkt2].posy);
//GetRad( y1- y2, x1 - x2);
    if round(dst) > links[i].solllaenge  then
    begin
    beschl := dst - links[i].solllaenge;
    beschl := beschl/20;
    rad := getrad( punkte[links[i].punkt1].posy - punkte[links[i].punkt2].posy, punkte[links[i].punkt1].posx - punkte[links[i].punkt2].posx);
    punkte[links[i].punkt2].posx := punkte[links[i].punkt2].posx + sin(rad)*beschl;
    punkte[links[i].punkt2].posy := punkte[links[i].punkt2].posy + cos(rad)*beschl;

    rad := getrad( punkte[links[i].punkt2].posy - punkte[links[i].punkt1].posy, punkte[links[i].punkt2].posx - punkte[links[i].punkt1].posx);
    punkte[links[i].punkt1].posx := punkte[links[i].punkt1].posx + sin(rad)*beschl;
    punkte[links[i].punkt1].posy := punkte[links[i].punkt1].posy + cos(rad)*beschl;
    end;

    if round(dst) < links[i].solllaenge  then
    begin
    beschl := links[i].solllaenge-dst;
    beschl := beschl/20;
    rad := getrad( punkte[links[i].punkt1].posy - punkte[links[i].punkt2].posy, punkte[links[i].punkt1].posx - punkte[links[i].punkt2].posx);
    punkte[links[i].punkt2].posx := punkte[links[i].punkt2].posx - sin(rad)*beschl;
    punkte[links[i].punkt2].posy := punkte[links[i].punkt2].posy - cos(rad)*beschl;

    rad := getrad( punkte[links[i].punkt2].posy - punkte[links[i].punkt1].posy, punkte[links[i].punkt2].posx - punkte[links[i].punkt1].posx);
    punkte[links[i].punkt1].posx := punkte[links[i].punkt1].posx - sin(rad)*beschl;
    punkte[links[i].punkt1].posy := punkte[links[i].punkt1].posy - cos(rad)*beschl;
    end;
   end;
end;




"Du musst für jeden einzelnen Punkt eine Kraft als Vektor speichern (also mit Richtung). Du musst zuerst die Summe aller Kräfte für jeden Punkt berechnen und erst dann den Punkt bewegen.
" - speichern ist klar aber nicht wie ich die Summe ausrechne...  kannst du mir nen Tip geben?`(dh wie berechne ich die Summe der Kräfte, wenn ich wie hier sin/cos benutze)



update - hat noch jemand ne idee wie ich die ganze Geschichte zum pendeln bringe??


grrr

Offline

 

#14 06.01.2007 15:11:40

Chris
ExtremeMember
Ort: Erlangen, Bay
Registriert: 24.01.2005
Beiträge: 694
Web-Seite

Re: Physik?

mein Code funktioniert ganz gut.

bei bedarf poste ich ihn hier...

mfg Chris


Nimm meinen Rat an - ich brauch ihn sowieso nicht

Offline

 

#15 06.01.2007 18:14:44

simon
ProMember
Ort: Düsseldorf
Registriert: 03.06.2006
Beiträge: 168

Re: Physik?

hab mal die Linien - durch Texturen ersetzt jetzt sieht das auch noch nett aus smile
http://img367.imageshack.us/my.php?image=ropezy0.jpg


grrr

Offline

 

#16 08.01.2007 11:13:19

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Physik?

Bei mir sieht der Code ungefähr so aus:

Code: delphi

for i:=1 to 100 do if linie[i].aktiv then begin
  pu1:=linie[i].p1;
  pu2:=linie[i].p2;
  sd:=linie[i].solldist;

  tx:=punkt[pu1].xp-punkt[pu2].xp;
  ty:=punkt[pu1].yp-punkt[pu2].yp;
  tz:=punkt[pu1].zp-punkt[pu2].zp;

  ad:=linie[i].altedist;                       // wichtig für Dämpfung
  d:=sqrt(sqr(tx)+sqr(ty)+sqr(tz));

  deltad:=(d-ad)*0.1;                       // Dämpfung

  // ausgerechnete Kraft, die zwischen den beiden Punkten
  // eines Links (Linie) wirken soll
  k:=(sd-d)*0.01 - deltad;

  tx:=tx/d;
  ty:=ty/d;
  tz:=tz/d;

  if not(punkt[pu1].fest) then with punkt[pu1] do begin
    xs:=xs+tx*k;
    ys:=ys+ty*k;
    zs:=zs+tz*k;
  end;

  if not(punkt[pu2].fest) then with punkt[pu2] do begin
    xs:=xs-tx*k;
    ys:=ys-ty*k;
    zs:=zs-tz*k;
  end;

  linie[i].altedist:=d;
end;

for i:=1 to 100 do with punkt[i] do if aktiv and not(fest) then begin
  ys:=ys+0.01;           // Gravitation

  xp:=xp+xs;
  yp:=yp+ys;
  zp:=zp+zs;
end;



Hilft das?
Gehts jetzt?

DerPeer

Offline

 

#17 09.01.2007 13:37:03

simon
ProMember
Ort: Düsseldorf
Registriert: 03.06.2006
Beiträge: 168

Re: Physik?

werde mir den Code Morgen mal zu Herzen nehmen vor allem die Dämpfung  müsste ich einbauen - danke erstmal dafür smile


grrr

Offline

 

#18 10.01.2007 10:54:08

simon
ProMember
Ort: Düsseldorf
Registriert: 03.06.2006
Beiträge: 168

Re: Physik?

jep hat geholfen und das wie smile danke!


grrr

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson