Seite 1 von 1

Physikengine ODE (Open dynamic engine) (dll) ?

Verfasst: 23.11.2004 14:28
von Robert Wünsche
Hallo,

ich mochte gerne die ode physikengine für meine pb sachen nutzen, dabei gibt es leider noch einige schwirigkeiten, wie folgt:

Code: Alles auswählen

;ode include datei:

;Gebaut von robert Wünsche
;benötigt die ode.dll datei im C/windows verzeichniss mit der version 0.5 oder höher.

;setze den debuger auf an
;DebugLevel 10
Global ode_error  ;ist ein debugparameter, ob die funktion zum suchen der dll funktionen weitermachen kann oder nicht
                  ; wenn 0 --> höre beim fehler auf !
                  ; wenn 1 --> suche einfach weiter !
Global ode_errors ;ist die fehleranzahl !
Global ode_direkt ;wenn 1 --> letzter funktionsaufruf war direkt (sehr schnell)
                  ;wenn 0 --> letzter funktionsaufruf war nicht direkt (langsam)


Procedure ODEStart()
  time = ElapsedMilliseconds()
  Debug "ODEStart() | bei "+Str(time),10
  
  ;setze die globalen variablen:
  Global dWorldCreate
  Global dWorldDestroy
  Global dWorldSetGravity
  Global dWorldgetgravity

  
  If OpenLibrary(100,"C:\WINDOWS\ode.dll") <> 0
    ;lade alle pointervariablen:
    Debug " Library wurde erfolgreich geöffnet ! | bei "+Str(ElapsedMilliseconds() - time),10
    If ExamineLibraryFunctions(100) = 0
      Debug "  Funktionen konnten nicht abgefragt werden ! | bei "+Str(ElapsedMilliseconds() - time),10
      If ode_error = 1 : ode_errors + 1 : Else : ProcedureReturn 0 : EndIf
    Else
      ;überprüfe die funktionsnammen und füge ihre adressen hinzu:
      temp = IsFunction(100, "dWorldCreate") 
      If temp = 0
        Debug "  dWorldCreate() wurde nicht gefunden ! | bei "+Str(ElapsedMilliseconds() - time),10
        ;eintrag konnte nicht gefunden werden !"
        If ode_error = 1 : ode_errors + 1 : Else : ProcedureReturn 0 : EndIf
      Else
        ;Eintrag erfolgreich gefunden !
        Debug "  dWorldCreate() wurde gefunden | bei "+Str(ElapsedMilliseconds() - time),10
        Debug "   bei adresse "+Str(temp), 10
        dWorldCreate = temp
      EndIf
      
      temp = IsFunction(100, "dWorldDestroy") 
      If temp = 0
        Debug "  dWorldDestroy() wurde nicht gefunden ! | bei "+Str(ElapsedMilliseconds() - time),10
        ;eintrag konnte nicht gefunden werden !"
        If ode_error = 1 : ode_errors + 1 : Else : ProcedureReturn 0 : EndIf
      Else
        ;Eintrag erfolgreich gefunden !
        Debug "  dWorldDestroy() wurde gefunden | bei "+Str(ElapsedMilliseconds() - time),10
        Debug "   bei adresse "+Str(temp), 10
        dWorldDestroy = temp
      EndIf
      
      temp = IsFunction(100, "dWorldSetGravity") 
      If temp = 0
        Debug "  dWorldSetGravity() wurde nicht gefunden ! | bei "+Str(ElapsedMilliseconds() - time),10
        ;eintrag konnte nicht gefunden werden !"
        If ode_error = 1 : ode_errors + 1 : Else : ProcedureReturn 0 : EndIf
      Else
        ;Eintrag erfolgreich gefunden !
        Debug "  dWorldSetGravity() wurde gefunden | bei "+Str(ElapsedMilliseconds() - time),10
        Debug "   bei adresse "+Str(temp), 10
        dWorldSetGravity = temp
      EndIf
      
      temp = IsFunction(100, "dWorldGetGravity") 
      If temp = 0
        Debug "  dWorldGetGravity() wurde nicht gefunden ! | bei "+Str(ElapsedMilliseconds() - time),10
        ;eintrag konnte nicht gefunden werden !"
        If ode_error = 1 : ode_errors + 1 : Else : ProcedureReturn 0 : EndIf
      Else
        ;Eintrag erfolgreich gefunden !
        Debug "  dWorldGetGravity() wurde gefunden | bei "+Str(ElapsedMilliseconds() - time),10
        Debug "   bei adresse "+Str(temp), 10
        dWorldgetgravity = temp
      EndIf
      
      ;fertig :-)
      ;jetzt geben wir noch das ergebniss aus:
      ProcedureReturn 1
      
    EndIf
  Else
    time = ElapsedMilliseconds() - time
    Debug "  library konnte nicht geladen werden ! | bei "+Str(ElapsedMilliseconds() - time),10
    If ode_error = 1 : ode_errors + 1 : Else : ProcedureReturn 0 : EndIf
  EndIf
EndProcedure

;-Und nun die konvertierten befehle:
Procedure dWorldCreate()
  If dWorldCreate = 0
    ;indirekter aufruf !
    ergebniss = CallFunction(100, "dWorldCreate") 
    ;setze variable:
    ode_direkt = 0
    ProcedureReturn ergebniss
  EndIf
  ;wenn alles gut gegangen ist, direkter aufruf ! (ist sehr schnell)
  dWorldID = CallFunctionFast(dWorldCreate)
  ;setze variable:
  ode_direkt = 1
  ProcedureReturn dWorldID
EndProcedure

Procedure dWorldDestroy (dWorldID)
  If dWorldDestroy = 0
    ;indirekter aufruf !
    CallFunction(100, "dWorldDestroy",dWorldID) 
    ;setze variable:
    ode_direkt = 0
  EndIf
  ;wenn alles gut gegangen ist, direkter aufruf ! (ist sehr schnell)
  CallFunctionFast(dWorldDestroy,dWorldID)
  ;setze variable:
  ode_direkt = 1
EndProcedure

Procedure dWorldSetGravity (dWorldID,x.f,y.f,z.f)
  If dWorldSetGravity = 0
    ;indirekter aufruf !
    CallFunction(100, "dWorldSetGravity",dWorldID,x.f,y.f,z.f) 
    ;setze variable:
    ode_direkt = 0
  EndIf
  ;wenn alles gut gegangen ist, direkter aufruf ! (ist sehr schnell)
  CallFunctionFast(dWorldSetGravity,dWorldID,x.f,y.f,z.f)
  ;setze variable:
  ode_direkt = 1
EndProcedure

Procedure dWorldGetGravity (dWorldID,Gravity)
  If dWorldgetgravity = 0
    ;indirekter aufruf !
    CallFunction(100, "dWorldGetGravity",dWorldID,Gravity) 
    ;setze variable:
    ode_direkt = 0
  EndIf
  ;wenn alles gut gegangen ist, direkter aufruf ! (ist sehr schnell)
  CallFunctionFast(dWorldgetgravity,dWorldID,Gravity)
  ;setze variable:
  ode_direkt = 1
EndProcedure




;:setze den errorparameter auf 1 (nicht gefundene funktionen werden mit einer 0 versehen !
ode_error = 1
Debug ODEStart()
Debug "fehler : "+ Str(ode_errors)

;test:
world = dWorldCreate()
Debug world
Debug ode_direkt

;dWorldSetGravity(world,0,0,-9.0)

;datenplätze reservieren:
memory = AllocateMemory(48)
If memory = 0
  Debug "datenplätze (ram) konnte nicht reserviert werden !"
  End
Else
EndIf

;dWorldSetERP(world,0.3)

End
Die dll müsst ihr euch einfach von www.ode.org runterladen (dll version) und die dll datei dann in C:\windows reinkopieren !

Soweit funktioniert alles aber: wenn ich die richtigen befehle benutze, stürtzt das progi immer ab, warum ?

Im foraus: Danke !

Verfasst: 23.11.2004 16:09
von Robert Wünsche
Wieso funktioniert das nicht, wenn ich die normalen befehle verwende ?

Verfasst: 23.11.2004 16:21
von freedimension
Ich würde mal vermuten weil das kleine d vor den Funktionsnamen darauf hindeutet dass hier Doubles zurückgegeben werden, und die kann PB halt (noch) nicht.

Verfasst: 23.11.2004 16:27
von Robert Wünsche
dh. wohl, das man die normale libs garnicht mit pb benutzen kann ?
:( :? :cry: .
Schade ! :freak:

Verfasst: 23.11.2004 16:34
von freedimension
Du kannst schon, du musst halt einen Wrapper in C bauen der normale Floats zurückgibt und empfängt.

Verfasst: 23.11.2004 16:39
von Robert Wünsche
:( !
Leider kann ich kein c und kein c++ !
Gibts irgentwo schon so einen double-float wrapper ?

PS: ich gucke mal in purearea.net nach, feleicht finde ich was.

Verfasst: 24.11.2004 23:19
von NetSlayer
Robert Wünsche hat geschrieben:PS: ich gucke mal in purearea.net nach, feleicht finde ich was.
Ich weiß es ist OffTopic, aber...

Rechtschreibung. Danke, das musste mal gesagt sein.