Physikalische Berechnung in 3D?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

hectic

Sieger des IS Talentwettbewerb 2006

Betreff: Physikalische Berechnung in 3D?

BeitragDi, Apr 18, 2006 22:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Kennt jemand ein gutes Tutorial in deutsch oder sowas, welches physikalische einflüsse auf Körper bearbeitet oder zumindest, wo und wonach ich suchen soll? Habe immer und immer wieder folgendes Problem. Ein Körper soll beschleunigt werden und gleichzeitig soll der Drehimpuls dazu berechnet werden. Beispiel:

Code: [AUSKLAPPEN]
Ein Körper der auf dem Boden liegt.
  ________
 |        |
 |        |
 | Körper |
 |        |
 |________| <---Kraft

Wenn Kraft größer als die Gravitation ist, dann kommt es zu folgendem:

      /\
    /    \
  /        \
/            \
\            /
  \        /
    \    /
______\/______

Der Körper 'hebt' ab. Bisher habe ich das immer nur mit einer 'Notlösung' geschafft, aber diese funktioniert auch nur bedingt. Wenn zB das Objekt umkippt, dann funktioniert die Notlösung nicht mehr...

Bitte keine Tokanak-Lösung, oder wie die Physikengine heisst. Will das schon selbst in einem Lauffähigem Code haben...

Jan_

Ehemaliger Admin

BeitragDi, Apr 18, 2006 22:49
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, vielleicht vergissdt du die REibung, die verschiedene Seitren bremst,
und die Bewegung aber vom Zentrum der Masse ausgeht.
between angels and insects
 

Dreamora

BeitragDi, Apr 18, 2006 22:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Um umkippen und dergleichen zu kontrollieren sind 2 Dinge notwendig:

1. Einführung von Reibung
2. Einführung von Momenten (Drehmoment,...)

Letzeres würde dafür sorgen, dass der Würfel oder was auch immer, auf dem Boden bleibt, wenn du unten dagegen drückst, solange eine Gravitation gegen unten wirkt und keine andere Kraftwirkung ein Abheben verursacht.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Apr 19, 2006 0:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm, ok, das mit dem Drehmoment ist mir klar, nur wie berechne ich diesen in einer 3D-Welt? Atan2 hat ja nur zwei Dimensionen. Muß ich jetzt im Raum 3mal triangulieren um mit Atan2 ein Drehmoment herrauszufinden? Dieses Wissen kann ich auch sehr gut für mein aktuelles Projekt 'thrust' gebrauchen um die Kollisionsabfrage des Raumschiffes (2D) besser berechnen zu können. Die folgende Spielerei diehnt mir zusätzlich als Basis des Projektes...

edit1: Code ist selbständig lauffähig. Es wird versucht den Energieerhaltungssatz zu berücksichtigen. Sowohl zur Geschwindigkeit als auch beim Drehimpuls...

edit2: Problem ist hier vor allem, wenn das Fahrzeug einen Winkel über 90° erreicht. Dann fliegt es auf und davon... Crying or Very sad

Code: [AUSKLAPPEN]
gfx=800
gfy=600
ghx=gfx/2
ghy=gfy/2
Graphics3D gfx,gfy,0,2
SetBuffer BackBuffer()

;Camera erstellen
camera=CreateCamera()
PositionEntity camera,-20,12,-6
RotateEntity camera,10,-40,0
CameraZoom camera,.75

;Licht erstellen
light=CreateLight()
RotateEntity light,20,0,0

;Boden erstellen
plane=CreatePlane()
mirror=CreateMirror()
EntityColor plane,64,64,96
EntityAlpha plane,.5
EntityType plane,2

;Schanze erstellen
cube=CreateCube()
PositionEntity cube,10,0,30
RotateEntity cube,45,0,0
ScaleEntity cube,10,10,10
EntityType cube,2

;Auto erstellen
car=CreateCube()
ScaleMesh car,4,2,8
PositionMesh car,0,2,0
EntityAlpha car,.6

;Reifen
Dim whe(3)
For q=0 To 3
 whe(q)=CreateSphere(12,car)
 ScaleEntity whe(q),2,2,2
 EntityRadius whe(q),2
 EntityType whe(q),1
Next
PositionEntity whe(0),-4,0,+5
PositionEntity whe(1),+4,0,+5
PositionEntity whe(2),-4,0,-5
PositionEntity whe(3),+4,0,-5

Collisions 1,2,2,2

RotateEntity car,30,0,4
car_xp#=0
car_yp#=8
car_zp#=0
car_xg#=0
car_yg#=0
car_zg#=0.01
car_xr#=0
car_yr#=0
car_zr#=0




;Hauptschleife
While Not KeyHit(1)

 If KeyDown(200) car_zg=car_zg+.02
 If KeyDown(208) car_zg=car_zg-.02

 car_xg=car_xg/1.001
 car_yg=car_yg/1.001
 car_zg=car_zg/1.001

 car_xr=car_xr/1.001
 car_yr=car_yr/1.001
 car_zr=car_zr/1.001
 car_yg=car_yg-.01

 car_xp=car_xp+car_xg
 car_yp=car_yp+car_yg
 car_zp=car_zp+car_zg

 PositionEntity whe(0),-4,0,+5
 PositionEntity whe(1),+4,0,+5
 PositionEntity whe(2),-4,0,-5
 PositionEntity whe(3),+4,0,-5

 UpdateWorld

 For q=0 To 3
  If CountCollisions(whe(q))>0
   car_xg=car_xg/1.03
   car_yg=car_yg/1.03
   car_zg=car_zg/1.03
   car_xr=car_xr/1.005
   car_yr=car_yr/1.005
   car_zr=car_zr/1.005
  End If
  car_yg=car_yg+EntityY(whe(q))/50
 Next

 car_xr=car_xr+(EntityY(whe(2))+EntityY(whe(3))-EntityY(whe(0))-EntityY(whe(1)))/20
 car_zr=car_zr+(EntityY(whe(3))+EntityY(whe(1))-EntityY(whe(2))-EntityY(whe(0)))/20

 PositionEntity car,car_xp,car_yp,car_zp
 TurnEntity car,car_xr,car_yr,car_zr

 RenderWorld
 Flip
Wend
End
 

Dreamora

BeitragMi, Apr 19, 2006 8:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Für Momente brauchst du eigentlich garkein Atan, das läuft alles über Vektoren:

Drehmoment = Arm x Anliegende Kraft (x ist Vektorprodukt, nicht Skalarprodukt)
Im Falle eines Würfels , wo die Kraft am Ecken angreifen würde, wäre das zb

Moment = [width/2 height/2 depth/2] x [kraftX kraftY kraftZ] ([] sind jeweils als Vektoren gemeint, als Referenzpunkt habe ich den Mittelpunkt gewählt)

Das heisst, dass das Moment immer senkrecht auf den beiden anderen Vektoren steht.
Wenn mehrere Kräfte angreifen, so ist das Moment einfach die Summe über i von Arm_i x Anliegende Kraft_i
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group