Autor Beitrag
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 01.06.05 02:15 
Hallo zusammen!

Vielleicht kennt ihr das alte Game "The Incredible Maschine". Man hat verschiedene Gegenstände und Tools zur Verfügung (z.B. Förderband, Ball, Seil) und muss die geschickt miteinander verknüpfen um eine bestimmte Aufgabe zu lösen... Z.B. Pistole zertrennt ein Seil, woran ein Ball hängt, der dann runterfällt und dann aufs Förderband fällt, usw.. Man baut sich so eine kleine "Maschine" zusammen. Vom Konzept her ähnlich wie Lemmings, jedoch einfach mit Physik... Jedoch wird in "The Incredible Maschine" nicht wirklich physikalisch korrekt gerechnet (nicht viel, auf jeden Fall).

Ich programmiere zur Zeit an einer kleinen Physikengine und wollte mal Ideen für ein ähnliches Game sammeln! Die Engine ist noch lange nicht fertig, sie soll im Prinzip schlussendlich auch Wärmeaustausch und so Zeug beinhalten. Ein Ballon, welches aufgrund der Wärme aufsteigt, usw. Mal schauen, ob das alles noch bei einer begrenzten CPU-Auslastung drinliegt.

Falls ihr weitere coole Ideen habt, bitte posten! :) Die Physikengine kann noch nicht so viel (bis jetzt nur inelastische Stösse und Reibung), ein kleines Demo ist im Anhang (Code noch völlig unoptimiert, deswegen nicht so schnell).

Das Spiel soll in 2D sein (obwohl die Engine schon 3D rechnet).

Danke! :)

PS: Sorry, passt wohl nicht in diese Sparte... Meinetwegen könnt ihr's ins Off-Topic verschieben.
Einloggen, um Attachments anzusehen!
XMagic
Hält's aus hier
Beiträge: 12


Delphi 7
BeitragVerfasst: Mi 01.06.05 20:48 
Sieht verdammt genial aus!
Außer einigen kleinen Mankos ( Rechteck gerät "in" den Stern bzw. in die Zahnräder :D ) wirklich absolut spitze :D!

Könntest du mir erklären WIE du das gemacht hast?
Bin nunja, nicht kompletter, aber ich bin Anfänger.
Könntest mir evtl. den Source geben / posten?
Würd ich 100 pro nicht verwenden können und so, würde aber denke ich, sehr viel lernen können.
Auf jedenfall top! :D

Als Idee: du könntest noch soetwas wie Flüssigkeiten einbauen, die auf Oberflächen sind, wo der Körper dann hinabgleitet :D.
delfiphan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 01.06.05 22:15 
Der Fehler taucht ab und zu bei spitzen Ecken auf und liegt an der Kollisionserkennung. Dort weiss der Algorithmus nicht so recht auf welcher Seite das Objekt ist...
Die Kollisionserkennung wird aber sowieso noch ausgetauscht, bzw. Spitze Objekte wird es dann schlussendlich einfach nicht geben.
Flüssigkeiten? Ja, was Vereinfachtes in der Richtung wär durchaus möglich. :) Danke für die Idee :idea: 8)
ploRa
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59

Win XP
Delphi 6
BeitragVerfasst: Fr 10.06.05 09:13 
Also ich wäre auch mal an diesem code intressiert !
Um ein bisschen reinzugucken und zum lernen !

Mfg
delfiphan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 10.06.05 10:19 
Am Code wirst du nichts lernen. Bringt wahrscheinlich mehr, wenn du einfach regelmässig den Physikunterricht besuchst ;)

Ganz kurz die Schritte zusammengefasst: Aus einer gegebenen Konfiguration werden Berührungspunkte zwischen Objekten gesucht, die in ein Gleichungssystem geschrieben und dieses gelöst. Die Lösung gibt dann ungefähr die Konfiguration im nächsten Zeitschritt (vereinfacht gesprochen).

Jetzt willst du natürlich wissen, wie das Gleichungssystem aussieht. Ich poste hier keine Herleitung in Ascii-Format und der Code bringt wird dich nicht weiterbringen. Da du mir das nicht glaubst (;)) meinetwegen geb ich hier den Code fürs Aufstellen des Systems. Der Code macht ca. die Hälfte der Berechnungsprozedur aus. Der Rest ist dann nur noch ein Solver:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
  ...
  TMat := JMat; // JMat enthält Informationen über die momentane Konfiguration
  for I := 0 to TMat.Count-1 do
   with TMat.Rows[I] do
   begin
    LI := Scale(LI, Bodies[IndexI].MassInv); // Skaliert mit inverser Masse
    LJ := Scale(LJ, Bodies[IndexJ].MassInv);
    AI := Mult(Bodies[IndexI].ITensInv, AI); // Skaliert mit inversem Trägheitstensor
    AJ := Mult(Bodies[IndexJ].ITensInv, AJ);
   end;
  SetLength(bTemp, 2*N);
  for I := 0 to N-1 do
   with Bodies[I] do
   begin
    bTemp[I*2] := Add(v, Scale(f, dt*MassInv));
    bTemp[I*2+1] := Add(w, Scale(Mult(ITensInv, Sub(t, Cross(w,Mult(ITens,w)))), dt));
   end;
  SetLength(bb, TMat.Count);
  for I := 0 to TMat.Count-1 do
   with JMat.Rows[I] do
   begin
     D := 1/(Dot(TMat.Rows[I].LI, JMat.Rows[I].LI)+
             Dot(TMat.Rows[I].AI, JMat.Rows[I].AI)+
             Dot(TMat.Rows[I].LJ, JMat.Rows[I].LJ)+
             Dot(TMat.Rows[I].AJ, JMat.Rows[I].AJ));
     bb[I] := (Dot(LI, bTemp[IndexI*2])+
               Dot(AI, bTemp[IndexI*2+1])+
               Dot(LJ, bTemp[IndexJ*2])+
               Dot(AJ, bTemp[IndexJ*2+1]))*D;
     LI := Scale(LI, D);
     AI := Scale(AI, D);
     LJ := Scale(LJ, D);
     AJ := Scale(AJ, D);
   end;
   ...

Da das jetzt nicht Open Source ist gibt's auch nicht den kompletten Code. Da ich aber den Code den Leuten von Omorphia geben werde, kann du ihn vielleicht in einiger Zeit anschauen.

Und nun Back zu Topic. Aber wie's aussieht hat niemand mehr eine coole Idee :(


Zuletzt bearbeitet von delfiphan am Fr 10.06.05 11:46, insgesamt 1-mal bearbeitet
Asgar
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 160

XP Home Edition
D5
BeitragVerfasst: Fr 10.06.05 10:21 
vieleicht kannst du noch sowas einbauen das wenn z,b, ein ball irgendwo runterfällt nach dem aufprall wieder ein kleines stück hochspringt
delfiphan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 10.06.05 10:23 
Ja das kommt noch. :) Im Moment gibt's nur inelastische Stösse. Elastische Stösse sind aber einfacher zu realisieren.
Asgar
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 160

XP Home Edition
D5
BeitragVerfasst: Fr 10.06.05 10:45 
vieleicht kannste ja auch sowas wie federn reinnehmen, so was mit Dehnung und so
delfiphan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 10.06.05 10:47 
Jo, stimmt. Seile und Federn wären cool. Ein Trampolin für runterfallende Kugeln wär auch noch was :) Danke :D
Asgar
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 160

XP Home Edition
D5
BeitragVerfasst: Fr 10.06.05 10:51 
wenn das programm fertig is, postest du es dann hier im DF? würde nämlich dann gerne mal die fertige Version sehen.
delfiphan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 10.06.05 10:55 
Klar :) könnte aber noch eine Weile dauern, bis nämlich meine Ferien beginnen.

Hier noch eine kleine Demo-Scene, die ich vor einigen Wochen für ein Projekt (mit noch 2 anderen Leuten) gemacht hab. Läuft ziemlich langsam. Ab 2GHz funktioniert's einigiermassen. Es zeigt ein gasgefüllter Ballon und eine Kugel, die drauffällt. Sowas soll auch ins Game rein. Da 2D sollte das dann schneller laufen. Ein Seil (Anleitung: Maus bewegen) hab ich auch schon vor einiger Zeit gemacht (2002/2003 war das) :)
Muss "nur" noch alles ins Game rein (und in 2D wegen Geschwindigkeit).
delfiphan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 16.06.05 02:18 
Kleine Echtzeit-Flüssigkeitssimulation, die ich evtl. auch ins Game einbauen könnte. Weil das ganze aber nicht so gut "verträglich" mit der obigen Starrkörpersimulation ist, wird es vielleicht aber nicht gehn (ausser ich finde einen Umweg..) :\
user defined image
Einloggen, um Attachments anzusehen!
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Do 16.06.05 07:33 
Das sieht mal wirklich geil aus! Respekt.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Dr. Chaotica
Hält's aus hier
Beiträge: 5

XP
Delphi 7, PHP 5
BeitragVerfasst: Do 16.06.05 12:39 
Also ich hab ja Kp, ob sowas schwierig zu programmieren ist (noobs können sowas ja nicht einschätzen), aber das scheint gut zu werden, was du da vorhast.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 16.06.05 12:49 
Na ja, wo ich die Flüssigkeit sehe: Wie wärs damit, die in Elemente reinzufüllen, damit sich deren Schwerpunkt verschiebt?

Und du kennst ja wahrscheinlich den Effekt, wenn du ein rohes Ei drehen lässt, das wär doch auch ein geiler Effekt, wenn auch etwas kompliziert zu berechnen (Ich habs damals nicht hinbekommen). Das ist allerdings eher was für 3D...
delfiphan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 16.06.05 22:04 
Komm nicht ganz nach was du mit den gefüllten Elementen meinst... Das Problem ist, dass die Gleichungen auf einem (unsichtbaren) Gitter gerechnet werden und die Geschwindigkeiten innerhalb einer Zelle konsistent sein müssen; Wände müssten deswegen immer parallel zu einer Koordinatenachse sein, deswegen geht das auch mit dem Ei nicht so gut, da die Grenzen rund sind. Oder besser gesagt: Es geht nicht ohne zusätzlichen Rechenaufwand.
-delphin-
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: Sa 18.06.05 11:56 
ich denke, er meint, dass die Flüssigkeiten in den Körpern sind und sich dort bewegen, sodass sie ihren Schwerpunkt verändern und sich stärker drehen. Man könnte das so machen, dass man mit der Maus bestimmen kann, wo sich die Flüssigkeit im Körper aufhalten soll, so hat man mehr Einfluss auf die Sache, die da vor sich geht :arrow: d.h. man klickt in eine Ecke und das Wasser fließt dorthin, was den Körper dazu bringt mit der Ecke nach unten zu fallen ;)

PS: Das Flüssigkeitenprog is richtig gut, Respekt :D
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Sa 18.06.05 14:06 
das seil ist aber wohl noch nicht soo ganz ausgereift: es dehnt sich, als gäbe es keinen widerstand. und dann läuft die dehnung parallel nach hinten durch. du solltest eine federkonstante einbauen, oder das seil undehnbar machen... aber die flüssigkeit ist nun wirklich genial. da hast du sicher auch den inneren zusammenhalt zwischen den teilchen miteinbezogen? so dass sich nicht kleine tropfen bilden, obwohl richtiges wasser z.B. durch die wasserstoffbrücken zusammengehalten werden würde. aufjeden fall ist das genial. :D weiter so! achja, ich tu ja so, als ob ich bei omorphia mitarbeiten würde (bin zu dumm oO ich hab bisher nix gefunden, was ich schaffen könnte.. oO), da werd ich dann sicher mal den ganzen code sehn können ^^

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
delfiphan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 19.06.05 02:37 
Das Seil hab ich mal vor langer Zeit programmiert, klar, das lässt sich noch um einiges verbessern. Das war eher da, um einige Beispielideen zu posten. Wenn jemand noch andere Ideen hätte, dann raus damit!

Die Oberflächenspannung der Flüssigkeit ist nicht berücksichtigt. Zum einen ist es ein kleiner Effekt und zum anderen ist es für ein Game. Kleine Spritzer gibt's auch ohne Oberflächenspannung. Die werden dann einfach nicht rund... Das Problem bei der Oberflächenspannung ist, dass man die Krümmung beim Phasenübergang berechnen muss. Das geht natürlich viel zu lange.

Wasserstoffbrücke usw.: Die Teilchen, die man sieht, die sind nur zur Visualisierung da. Das sind Fluidpartikel und sind nicht mit Molekülen zu vergleichen. Das Fluid wird kontinuierlich als Vektorfeld gerechnet und die Partikel bewegen sich dann einfach entlang dieses Vektorfeldes. Das Vektorfeld wird wiederum aus einer Differentialgleichung (Navier-Stokes-Gleichungen) in jedem Schritt gewonnen. Was konkret gerechnet wird, sieht man also nicht: Das ganze wird auf einem fixen z.B. 64x64 Gitter gerechnet und in jedem Frame werden die Geschwindigkeitskomponenten an den fixen Gitterpunkten berechnet. Die Fluidpartikel "spüren" sich also gar nicht. Das wäre auch viel zu zeitintensiv, wenn man ausrechnen müsste, welche Partikel wie nahe an anderen Partikel sind.

In einem Game muss man mogeln, wo man nur kann. Es muss nur bedingt physikalisch korrekt sein. Das Fluidprogramm berechnet für ein inkompressibles Fluid die Massen und Impulserhaltung mit "Slip"-Randbedingungen auf einem diskreten Gitter, Luft drumherum hat keinen Druck (keine Luftblasen, die aufsteigen)
"Richtiges Wasser" verhaltet sich anders: Oberflächenspannung, Kompressibilität, (annährend) "No-Slip" Randbedingungen, (annähernd) kontinuierlich. An die Viskosität von Wasser komm ich "dank" numerischer Diffusion auch nicht ran.

Das ganze läuft im Vergleich zu echtem Wasser viel zu langsam. Es sieht eher aus wie Öl... Tja, und das bei 100% Prozessorauslastung ;)
Dr. Chaotica
Hält's aus hier
Beiträge: 5

XP
Delphi 7, PHP 5
BeitragVerfasst: Mo 20.06.05 12:03 
Ist es irgendwie möglich mit Delphi Metaballs zu erzeugen? Das wäre dann 3D, aber es würde, wenigstens recht dicht an Wasser herankommen.