Eine Frage zur Devil Physic Engine

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

onkelz89

Betreff: Eine Frage zur Devil Physic Engine

BeitragMi, Okt 31, 2007 0:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

hab folgendes Problem. Ich möchte da es sonst zu langsam ist alle Objekte die mit der Physik Engine arbeiten werden, nur dann auch als solches im Program ansehen lassen wenn sich die Gegenstände bewegen. Ansonsten sollen es ganz normale Objekte sein.

Dazu muss ich die Objekte auf 1mal die genau gleiche Position bringen - was nicht so schwer ist. Außerdem aber auch genau die gleiche Drehung erzeugen - sodass kein Übergang zu sehen ist...

Ansatz:
Code: [AUSKLAPPEN]
PositionEntity test,ODE_dBodyGetPositionX#(pm\body),ODE_dBodyGetPositionY#(pm\body),ODE_dBodyGetPositionZ#(pm\body)
            phyx#=ODE_dBodyGetPitch#(pm\body)
            phyy#=ODE_dBodyGetYaw#(pm\body)
            phyz#=ODE_dBodyGetRoll#(pm\body)
            conx#=EntityPitch(test,True)
            cony#=EntityYaw(test,True)
            conz#=EntityRoll(test,True)
             
            newx#=0
            newy#=0
            newz#=0

            If phyx#<conx# Then newx#=conx#-phyx#
            If phyx#>conx# Then   newx#=phyx#-conx#
            If phyy#<cony# Then newy#=cony#-phyy#
            If phyy#>cony# Then newy#=phyy#-cony#
            If phyz#<conz# Then newz#=conz#-phyz#
            If phyz#>conz# Then   newz#=phyz#-conz#
            
            If newx#<0 Then newx#=newx#+360
            If newy#<0 Then newy#=newy#+360
            If newz#<0 Then newz#=newz#+360

            If newx#>359 Then newx#=newx#-360
            If newy#>359 Then newy#=newy#-360
            If newz#>359 Then newz#=newz#-360

            TurnEntity test,newx#,newy#,newz#,True


Test ist in dem Fall das Objekt (normal) nachdem zB 5 Frames lang sich das Phsikobjekt nichtmehr bewegt hat...

Wenn ich das Program starte - sehe ich das Objekt zwar auf der richtigen stellen. Jedoch ununterbrochen wie wild am rumdrehen... auch wenn das Physikobjekt still steht...

Irgendwas beachte ich wohl nicht, oder ist ganz und gar falsch.

Bitte helf mir Wink

Danke im Vorraus


EDIT:

zweiter Ansatz... geht aber auch nur minimal besser
Code: [AUSKLAPPEN]

If phyx#<conx# Then newx#=conx#-phyx# TurnEntity test,-newx#,0,0
            If phyx#>conx# Then   newx#=phyx#-conx# TurnEntity test,newx#,0,0
            If phyy#<cony# Then newy#=cony#-phyy# TurnEntity test,0,-newy#,0
            If phyy#>cony# Then newy#=phyy#-cony# TurnEntity test,0,newy#,0
            If phyz#<conz# Then newz#=conz#-phyz# TurnEntity test,0,0,-newz#
            If phyz#>conz# Then   newz#=phyz#-conz# TurnEntity test,0,0,newz#
 

onkelz89

BeitragDo, Nov 01, 2007 23:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab vielleicht das Prob... komme so aber nicht weiter:

Code: [AUSKLAPPEN]

   If KeyHit(8) Then TurnEntity test2,15,0,0,True:turnx#=turnx#+15
   If KeyHit(9) Then TurnEntity test2,0,15,0,True:turny#=turny#+15
   If KeyHit(7) Then TurnEntity test2,0,0,15,True:turnz#=turnz#+15
   
   If KeyHit(6) Then TurnEntity test,trunx#,turny#,turnz#,True:turny#=0:turnz#=0:turnx#=0


Die sache ist wenn man den Code ausführt und am Anfang Keyhit(7) also die 8 drückt, dann dreht er sich bei 5 (Keyhit(6)) nicht... und nach einigen Drehungen wechselt der Button "ohne Function"...

Ist das ein Bug in Blitz???
 

Dreamora

BeitragDo, Nov 01, 2007 23:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei KeyHit(6) solltest du RotateEntity nehmen.
TurnEntity ist eine relative Rotation zur jetzigen Rotation.
Wenn du es jedoch auf einen fixen Winkel setzen willst (was der sinn von deinem addieren und setzen zu sein scheint), so musst du rotate nehmen.

Allerdings ist anzumerken, dass auch dann das resultat normalerweise ein anderes sein wird.

das liegt daran, dass 3 getrennte rotationen nicht eindeutig sind. Dies werden sie nur wenn man sie immer in der gleichen reihenfolge ausführt und zwar in der gleichen wie es der befehl mit allen 3 gleichzeitig um die volle winkelmenge tun würde.

Dies ist nicht einfach zu umgehen. Der normale Ansatz sind Quaternions
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

onkelz89

BeitragSa, Nov 03, 2007 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, erstmal vielen dank für die info - werd mir mal en paar Sachen darüber auf Wiki durchlesen... weiß nähmlich nich wirklich was das ist Razz

Oder hat jemand ne kurzanleitung? Wenn nein is auch nicht schlimm. Hauptsache das Problem ist damit lösbar
 

Dreamora

BeitragSa, Nov 03, 2007 14:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Kurzanleitung wofür?
Quaternion? Nein, das ist auch kein Anfängerthema, deswegen sollte man schon ein wenig was mathematisch verstehen (Euler Winkel und Matrizen zwangsweise denn man wird beides brauchen, darüber hinaus vielleicht noch komplexe zahlen) wenn man sich an diese heran wagen will.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

onkelz89

BeitragSo, Nov 04, 2007 22:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, wie gesagt danke für die Hilfe - werde mir die Sachen mal auf Wiki anschauen - ein erster Blick drauf hat mich ziemlich zweifeln lassen aber naja je mehr man nachließt desto logischer wird alles ... Mathe eben Wink

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group