Trägheitsgesetz

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

Mr Hopp

Betreff: Trägheitsgesetz

BeitragDo, Jun 01, 2006 13:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Scheiß Physik Sad Ich wollte ein 3D-Spacegame proggen, verzweifle allerdings an der Raumschiff-Steuerung Sad

Das Problem ist, dass man im Weltall ja bekanntlich immer geradlinig fliegt, so lange nichts passiert. D.h. wenn ich beschleunige, dann das Triebwerk abschallte und das Raumschiff rotiere, fliegt es nicht "immer der Nase lang" sondern einfach weiter, bis ich das Triebwerk einschallte.......

Die Grundüberlegung habe ich geschafft, ich wollte einen Pivot für die Fliehkraft erstellen, an den das Raumschiff und die Kamera gebunden sind. Somit fliegt der Pivot, und nicht das Raumschiff, welches sich drehen kann, wie es will, und trotzdem in die Flieh-Richtung fliegt. Das eigentliche Problem besteht jetzt aber darin, dass irgendwann ja auch gewünscht wird, die Richtung zu ändern.......

Also, wer Ahnung von Physik hat, könnte mir doch bitte, wenn er Zeit und Lust hat, ein bisschen was von der Fliehkraft und dem ganzen Zeugs erklären Laughing

Mfg Mr Hopp
 

coldie

BeitragDo, Jun 01, 2006 14:00
Antworten mit Zitat
Benutzer-Profile anzeigen
ich würd sagen du musst einen geschwindigkeitsvektor machen, der die bewegung vom piviot verursacht. Mit dem triebwerk kannst du dann einfluss auf den geschwindigkeitsvektor nehmen, je nachdem wie das raumschiff gedreht ist wenn du gasgibst.

kenn mich aber noch nicht so gut mit bb aus vll. gehts auch einfacher.

Benibaerenstark

BeitragDo, Jun 01, 2006 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Es geht auch ohne Vektoren!

Ich würde drei Variabeln nehmen XSpeed, YSpeed, ZSpeed. Je nach Ausrichtung und Schub wird der Speed beeinflusst. Wie sich der Schub auf die drei Geschwindigkeiten verteilt, berechntest du mit Sin/Cos von den drei Drehungen EntityPitch, Yaw, Roll.

Für Details: Nehme ein Blatt Papier, zeichne ein 3D-Koordinatensystem und da hinein die Ausrichtung deines Modelles. Zeichne dir die Winkel und überlege logisch. (Definition von Sin/Cos ist die einzige mathematische Grundlage, die bekannt sein sollte)Ist ein bisschen Arbeit, aber wenn du es selber ausrechnest und verstehts, was dein Code macht, macht es viel mehr Spass.

mfg beni
3D Scanner selber bauen? -> www.bewe-3dscanner.ch.vu
 

coldie

BeitragDo, Jun 01, 2006 14:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Ich würde drei Variabeln nehmen XSpeed, YSpeed, ZSpeed

häää? genau das ist doch ein geschwindigkeitsvektor Rolling Eyes

Benibaerenstark

BeitragDo, Jun 01, 2006 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, wenn du meinst. ich habe noch nie "Vektorrechnen" gemacht, und ich komme auch ohne den Begriff "Vektor" aus. Ich baue meinen code einfach durch logische überlegungen. Doch mir solls recht sein - wenn er damit was anfangen kann...
3D Scanner selber bauen? -> www.bewe-3dscanner.ch.vu
 

Mr Hopp

BeitragDo, Jun 01, 2006 15:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok......ich werd mal sehen, was sich mit Cos und Sin machen lässt, ich hatte das ja noch nie in der Schule, also werde ich ein bisschen nachforschen müssen Rolling Eyes Aber danke Very Happy
 

Mr Hopp

BeitragFr, Jun 09, 2006 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
sorry, ich muss das Thema nochmal ansprechen Laughing

Erstmal: Soll ich jetzt einen Fliehpunkt erstellen???

Und zu den Vektoren (Was auch immer das ist^^), soll ich da

- X_Speed
- Y_Speed
- Z_Speed

und

- X_Rotation
- Y_Rotation
- Z_Rotation

erstellen???

ICH HAB KEINEN PLAN!!!! Rolling Eyes
 

Dreamora

BeitragFr, Jun 09, 2006 21:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du so etwas willst musst du mehr als nur Trägheit alleine einführen:

1. Die gesamte Steuerung muss über Kräfte erfolgen. Also wenn man nach links / rechts dreht wird die aktuelle Richtung durch eine Kraft aus der entsprechenden Richtung beeinflusst

2. Der Antrieb ist auch eine Kraft

3. Rotationen sind keine Kräfte und haben auf die bewegung keinen Einfluss

Daraus folgt auch, dass die Rotation über Turnentity erfolgt, die bewegung jedoch über moveentity mit der global flag anstatt im Koordinatensystem des Objektes.


Wichtig dafür sind die folgenden Dinge:

Kraft = Masse * Beschleunigung
- Wenn du also eine kraft hast und eine masse, so kannst du daraus leicht die beschleunigung in die entsprechende Richtung ausrechnen. Diese musst du dann zum aktuellen geschwindigkeitsvektor addieren.

Impuls = Masse * Geschwindigkeit
- Das sagt dir etwas darüber, wieviel Energie aktuell in der bewegten Masse ist. Das ist auch das, was im Endeffekt die Trägheit erzeugt, da der Impuls erst beseitig werden muss, der von der trägen Masse (ungleich schwere Masse) erzeugt wird.


Wenn du noch mehr Infos brauchst, empfehle ich dir eine der vielen ausführlichen Physikseiten zu besuchen, die dir das ganze näher bringt. Dann wird dir auch einleuchten warum man dafür Vektoren nimmt. (Dann kann man die Gleichungen nämlich ganz einfach aufstellen etc Es gibt sogar einige Operationen die ohne Vektoren garnicht gehen, wie richtig abprallen und dergleichen)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Mr Hopp

BeitragFr, Jun 09, 2006 22:08
Antworten mit Zitat
Benutzer-Profile anzeigen
erstmal vielen vielen Dank für die ausführliche Hilfe Smile Dann allerdings: ich habe ordentlich nach Seiten gesucht, hab allerdings nur etliche Endlosformeln gefunden, bei denen ich noch nichtmal weiß, ob sie überhaupt was damit zu tun haben Confused Kannst du mir vielleicht noch einen Link geben Laughing Ich bin einfach in der Physik noch ganz am Anfang Sad

Wäre auf jeden Fall sehr nett Smile

Edit: Außerdem wüsste ich gar nicht, wie ich Kraft und Masse im Spiel umsetzen könnte Embarassed
Nochmal Edit: Sorry, aber ich habe gerade beim Nachforschen festgestellt, dass Vektoren was ganz anderes zu sein scheinen, als ich dachte.....da bedarf es also auch noch einer Erklärung Very Happy Das nimmt Ausmaße an.........wenn ich das beherrsche, schreibe ich ein Tut Very Happy
 

Dreamora

BeitragFr, Jun 09, 2006 22:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Masse ist eigentlich einfach: Alle Objekte haben eine Masse. Was keine Masse hat erfährt keinerlei physikalischen Einfluss, da alles von Masse abhängt.

Kraft: Das ist ein Vektor mit einer Richtung und einer Länge. Die Länge ist die Kraft.

Und wirst leider nicht drumherum kommen dir diese "Endlosformeln" anzutun, denn ohne ist nicht viel zu machen.
Aber am besten fangst du mit lernen von vorne an anstatt in der Mitte bzw. am Ende.

Sprich erst einmal Vektormathe, dann Ort-Geschwindigkeit-Beschleunigung, dann Kräfte, dann grundlegende Mechanik wie Reibung etc (auch Kräfte) und dann Impulse, Trägheit etc.

Ich möchte und werde dir keine "fertige Implementation" liefern, da das 0 Sinn hat. Wenn du nicht verstehst wie es funktioniert führt das nur dazu das wir dir in ein paar Tagen das nächste Problem lösen müssen und das ist nicht der Sinn. Wenn du physik nicht lernen möchtest, so ist das natürlich ok. Aber dann möchte ich dich bitten, sie auch nicht zu benutzen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Mr Hopp

BeitragFr, Jun 09, 2006 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
nein nein, du verstehst mich falsch Shocked Ich MÖCHTE es ja lernen, aber es ist für mich ziehmlich kompiliziert.......die Frage nach dem Link war halt, weil ich eben nur berichte "Aus der Mitte" gefunden habe.....und mit "Endlosformeln" meinte ich Formeln, die ich eben noch gar nicht verstehen KANN Rolling Eyes aber ok, dann suche ich erstmal nach Vektoren^^ Wenn's gar nict mehr geht, frag ich auch mal meine Physiklehrerin Very Happy

Also auf jeden Fall vielen Dank und GANZ WICHTIG: Mr Hopp WILL lernen, er akzeptiert keine fertigen Lösungen, die er nicht versteht Wink
 

Dreamora

BeitragFr, Jun 09, 2006 23:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut
Werd Mal sehen ob ich den anderen Artikel wieder finde, der das ganze stück um stück aufbaut.
Ein guter war, wenn ich mich richtig entsinne, im Wiki zu finden.

Wobei ich nimmer weiss ob der deutsch war. Die gescheiten sind leider mit ziemlicher sicherheit in englisch gehalten ... aber da sich die Namensgebungen in niedriger Mathe kaum unterscheiden von D zu E und das Summen- als auch das Produktzeichen eh identisch sind Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Rone

BeitragSa, Jun 10, 2006 1:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Mr.Hopp,

ich denke um eine "einfache" Space-Physik zu machen muss man nicht erst
einen Physik oder Vektorrechnungs - Kurs machen, sondern logisches Denkvermögen und die genannten Formeln sollten ausreichen.

Kraft = Masse * Beschleunigung
Geschwindigkeit = Beschleunigung * Zeit
Strecke = Geschwindigkeit * Zeit [+ zurückgelegte_Strecke]

Bei vielen Sachen kann man die Physik auch faken um einen ähnlichen Effekt zu erziehlen, wie z.B. bei Reibung...

Ich hab das gerade mal ausprobiert, vieleicht hilft dir das ja weiter(Als denkanzatz, oder so...)?!
...Läuft auf jeden Fall:

Code: [AUSKLAPPEN]

Graphics3D 640,480,16
SetBuffer BackBuffer()

;zählt wie viele frames beschleunigtwird ( anstatt Zeitmessung)
count=0

;BeschleunigungsVector
aX# = 0
aY# = 0
aZ# = 0

;Geschwindigkeitsvector
SpeedX# = 0
SpeedY# = 0
SpeedZ# = 0

;Sterne
For i=0 To 4000
   bli=CreateSphere()
   PositionEntity bli,Rand(-1000,1000),Rand(-1000,1000),Rand(-1000,1000)
   ;EntityColor bli,Rand(0,255),Rand(0,255),Rand(0,255)
Next

;Licht
light = CreateLight(1)
TurnEntity light,25,00,0
PositionEntity light ,0,1,-5

;Camera
camera = CreateCamera()
TurnEntity camera,25,0,0

;Spieler
player = CreateCube()
PositionEntity player,0,-3,5
 
;für beschleunigungsvector um sich berechnung
;der einzelnen ax,ay  und az beschleunigungswerte aus Rotation zu ersparen
sp=CreateSphere()
PositionEntity sp,0,-3,4
ScaleEntity sp,0.25,0.25,0.25
EntityColor sp,0,200,0

EntityParent camera ,player
EntityParent light  ,player
EntityParent sp,player

While Not KeyHit(1)
   
   aX#= ( EntityX(player,1) - EntityX(sp,1) )
   aY#= ( EntityY(player,1) - EntityY(sp,1) )
   aZ#= ( EntityZ(player,1) - EntityZ(sp,1) )

   If KeyDown (203) Then TurnEntity player,0,1,0
   If KeyDown (205) Then TurnEntity player,0,-1,0
   If KeyDown (200) Then TurnEntity player,1,0,0
   If KeyDown (208) Then TurnEntity player,-1,0,0
   
   If KeyDown(57) Then
      ;V=A*t
      count=count+1
      SpeedX = SpeedX + aX*(0.01666*count)
      SpeedY = SpeedY + aY*(0.01666*count)
      SpeedZ = SpeedZ + aZ*(0.01666*count)
      laenge# = Sqr(SpeedX*SpeedX+SpeedY*SpeedY+SpeedZ*SpeedZ)   
   Else
      count=0
   EndIf
   
   PositionEntity player, EntityX(player)+SpeedX*0.01666,EntityY(player)+SpeedY*0.01666,EntityZ(player)+SpeedZ*0.01666
   
   RenderWorld
   Text 0,0,"Speed: "+Sqr(SpeedX*SpeedX+SpeedY*SpeedY+SpeedZ*SpeedZ)
   Flip
Wend
End


Ps: es kann helfen die Sachen die man machen will erstmal 2-dimensional
durchzudenken...(bei mir zumindest Wink )
 

Mr Hopp

BeitragDi, Jun 13, 2006 13:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen vielen Dank, genau sowas hab ich gesucht Very Happy nur zwei fragen hätte ich:

1. Warum wird da die Wurzel gezogen???
2. Was hat es mit 0.01666 auf sich, ist die Zahl beliebig???

Rone

BeitragDi, Jun 13, 2006 14:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
1. Warum wird da die Wurzel gezogen???

Die Zeile kann gelöscht werden...
(Da wird die Laenge des Speed-Vektors ausgerechnet...mit Pydgoras)

Zitat:
2. Was hat es mit 0.01666 auf sich, ist die Zahl beliebig???

Das ist die Zeit, die ein frame bei einer Framerate von 60 Bildern/s dauert...
S=V*t+S0 => t=0.0166666

mfg

5k41

BeitragDi, Jun 13, 2006 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
ich fake auch immer sehr gerne... hier noch eine kleine anregung aus einem kleinen 2D SpaceShooter von mir:
Code: [AUSKLAPPEN]

 ;Drehsteuerung:

 If speed#<-speedfaktor# Then;vorwärts
  If KeyDown(205) And pitch#<maxpitch Then pitch#=pitch#+pitchfaktor#
  If KeyDown(203) And pitch#>-maxpitch Then pitch#=pitch#-pitchfaktor#
 ElseIf speed#>speedfaktor# Then;rückwärts
  If KeyDown(203) And pitch#<maxpitch Then pitch#=pitch#+pitchfaktor#
  If KeyDown(205) And pitch#>-maxpitch Then pitch#=pitch#-pitchfaktor#
 EndIf

 ;Drehung:

 winkel=(winkel+pitch#) Mod 360
 If winkel<0 Then winkel=360+winkel
 If winkel=360 Then winkel=359

 ;Verlangsamung:

 If pitch#>0 Then pitch#=pitch#-(pitchfaktor#/5)
 If pitch#<0 Then pitch#=pitch#+(pitchfaktor#/5)

und ähnlich sieht das dann auch mit dem bewegen aus!

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image
 

Mr Hopp

BeitragDi, Jun 13, 2006 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
ok....dann vielen dank, ich mach mich dann mal an die arbeit Very Happy

Markus2

BeitragDi, Jun 13, 2006 19:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Als Hilfe läßt sich auch gut ein Pivot mißbrauchen der am Schiff hängt .
Den setzt du einfach lokal auf Pos. 0,0,0 und bewegst ihn wie du die Düsen
gerne Steuern würdest , also mit MoveEntity (für jedes Frame) .
Vom Schiff und vom Pivot nimmst du jetzt die Globale Pos. und rechnest
den Richtungsvector aus (ohne Sin,Cos) .
Richtungsvector=Beschleunigung und addierst die auf die Geschwindigkeit .
 

Krümel

BeitragFr, Jun 16, 2006 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo, Mr Hopp!

ich bin auf folgende löung deines problems gekommen:
(die "pivot"-Variante)

Code: [AUSKLAPPEN]

Graphics3D 800,600,16,2
SetBuffer BackBuffer()

CreateLight()
camera=CreateCamera()
MoveEntity camera,0,0,-10

UfoPivot=CreatePivot()
Ufo=CreateCone(40,True,UfoPivot)
TurnEntity Ufo,50,0,0
ScaleEntity Ufo,1,1.5,0.25
EntityColor Ufo,100,100,150:EntityShininess Ufo,0.8

Reibung#=0.995

While Not KeyHit(1)

   If KeyDown(30)                                          
      Schub#=Schub+0.005
      ;richtungsvektor ermitteln:
      TFormVector 0,Schub,0, Ufo,0
      RichtungX#=TFormedX():RichtungY#=TFormedY():RichtungZ#=TFormedZ()
   EndIf
   If KeyDown(200) DrehungX#=DrehungX+0.01
   If KeyDown(208) DrehungX#=DrehungX-0.01
   If KeyDown(203) DrehungY#=DrehungY+0.01
   If KeyDown(205) DrehungY#=DrehungY-0.01
   
   MoveEntity UfoPivot,RichtungX*Schub,RichtungY*Schub,RichtungZ*Schub
   TurnEntity Ufo,DrehungX,0,DrehungY

   ;bewegungen abbremsen
   DrehungX=DrehungX*Reibung:DrehungY=DrehungY*Reibung
   Schub=Schub*Reibung

   RenderWorld
   Flip
Wend

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group