Seite 1 von 1

[Erledigt]Set Entity Rotation mit FetchOrientation()

Verfasst: 05.04.2021 08:09
von tft
Hallo,

ich versuche mich gerade daran, die Absoluten Rotations Winkel von einem Entity zu Speicher und dann wider zu restaurieren.
Dabei versage ich völlig . Mir scheint da etwas wesentliches nicht bekannt zu sein.

ich speicher die daten in einer Text datei.

Code: Alles auswählen

 
    WriteStringN(0,  "pos "+StrF(EntityX(ml()    \EntityHandler,#PB_Absolute))+" "+StrF(EntityY(ml()  \EntityHandler,#PB_Absolute)) +" "+StrF(EntityZ(ml()   \EntityHandler,#PB_Absolute)) +" ")
    WriteStringN(0,  "rot "+StrF(EntityPitch(ml()\EntityHandler,#PB_Absolute|#PB_Engine3D_Adjusted))+" "+StrF(EntityYaw(ml()\EntityHandler,#PB_Absolute|#PB_Engine3D_Adjusted)) +" +StrF(EntityRoll(ml()\EntityHandler,#PB_Absolute|#PB_Engine3D_Adjusted)) +" ")
 
und will sie so wider zurückstellen .... aber schon die Gespeicherten Werte sind total unlogisch.

Code: Alles auswählen

     If FindString(Daten,"pos ") 
                              
         p1 = FindString(Daten," ",1)
         p2 = FindString(Daten," ",p1 + 1)
         p3 = FindString(Daten," ",p2 + 1)
         ML()\PosX = ValF(Mid(Daten,p1+1,p2-p1))
         ML()\PosY = ValF(Mid(Daten,p2+1,p3-p2))
         ML()\PosZ = ValF(Mid(Daten,p3+1,Len(Daten)-p3))
                              
         Debug StrF(ML()\PosX)+"/"+StrF(ML()\PosY)+"/"+StrF(ML()\PosZ)
                              
         daten = ReadString(0)
         If FindString(Daten,"rot ")
                                
         p1 = FindString(Daten," ",1)
         p2 = FindString(Daten," ",p1 + 1)
         p3 = FindString(Daten," ",p2 + 1)
         ML()\RotX = ValF(Mid(Daten,p1+1,p2-p1))
         ML()\RotY = ValF(Mid(Daten,p2+1,p3-p2))
         ML()\RotZ = ValF(Mid(Daten,p3+1,Len(Daten)-p3))
                                
         Debug StrF(ML()\RotX)+"/"+StrF(ML()\RotY)+"/"+StrF(ML()\RotZ)
und anschliessend erzeuge und rotiere ich das Entity so.

Code: Alles auswählen

    
      mesh =  LoadMesh(#PB_Any,GetCurrentDirectory()+"Data\mesh\"+ML()\BlockName+".mesh")
      If mesh = 0 : Debug "Konnte mesh nicht laden" : Debug GetCurrentDirectory()+"Data\mesh\"+ML()\BlockName+".mesh" : EndIf
      result = CreateEntity(#PB_Any,MeshID(mesh),MaterialID(_material3),ML()\PosX,ML()\PosY,ML()\PosZ, #SelectMasik5)
      RotateEntity(result,ML()\RotX,ML()\RotY,ML()\RotZ,#PB_Absolute)
      If result = 0 : Debug "Konnte Entity nicht erzeugen" : EndIf
Kann es sein das ich nicht alle 3 Achsen gleichzeitig behandeln Kann?

Gruss TFT

Re: Rotation von Entity

Verfasst: 05.04.2021 11:23
von STARGÅTE
Hallo tft,

>> "Kann es sein das ich nicht alle 3 Achsen gleichzeitig behandeln Kann?"
So in etwa. Die Euler Winkel haben die schwäche, dass die drei Koordinaten (Pitch, Yaw, Roll) alleine nicht ausreichen um eine Orientierung im Raum, eindeutig zu definieren. Es ist auch immer eine klar definierte Reihenfolge der Rotationen nötig (Konventionen), damit es zum selben Ergebnis führt.

Abhilfe schaffen hier die Funktionen FetchOrientation() und SetOrientation(). Mit ihnen kannst du (solltest du) wirklich den eindeutigen Zustand eines Objekts in Form eines Quaternion (4 Koordinaten) zurückgeben lassen und dann auch wieder zuweisen.

Re: Rotation von Entity

Verfasst: 05.04.2021 12:49
von tft
Ja hallo ...

genau so funktioniert es ...... danke für den Hinweis.

Gruss TFT