Entity berechnung ohne Engine3D.dll

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Entity berechnung ohne Engine3D.dll

Beitrag von tft »

Hallo ...

ich bin auf der Suche nach einer Möglichkeit einen Punkt im 3D Raum zu drehen und zu verschieben.

Als Daten habe ich .....

Position X,Y,Z
Rotation X,Y,Z in Grad ( 0-359)

Action

Turn x,y,z

Als ergebniss benötige ich

Neu Rotation Absolute X,Y,Z

Action

Move X,Y,Z

Als ergebniss benötige ich

Neu Position Absolute X,Y,Z

Ich habe von Mathe keine ahnung. Ich weis das es mit der PB 3D Engine geht. Aber ich möchte diese berechnungen von der Engine unabhängig machen. Da ich diese in einem Thread ausführen möchte. Vor 18 Jahren habe ich sowas mal mit GFA Basic gemacht. Aber leider finde ich die sachen nicht mehr. Und meine Suche im Internet hat nicht den gewünschten erfolg gebracht. Fieleicht weis ja jemand wie man sowas berechnet.

Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

einen einzelnen punkt kannst du nicht drehen.
also, kannst du schon passiert aber garnix.

du kannst einen punkt allerdings um einen zweiten drehen, also quasi auf einer kreisbahn bewegen.
dafür gibt es meines wissens auch fertige matritzen, vielleicht findet man ja was auf wiki...

verschieben ist wirklich einfach, das ist nur ne addition.

also, wenn du den Punkt (x1, y1, z1) um Move (x2, y2, z2) verschiebst,
ist das ergebnis Punkt (x1+x2, y1+y2, z1+z2)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Beitrag von alter Mann »

vielleicht kannst Du hiermit was anfangen
http://www.purebasic.fr/german/viewtopic.php?t=17537
Win11 64Bit / PB 6.0
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Beitrag von tft »

Hallo....

@Alter Man .... das kann ich auch sehr gut gebrauchen. Fielen dank. Aber es ist nicht ganz das was ich suche. Ich versuche es mal anders zu vormulieren.

Ein Objeckt befindet sich an der Position X;Y;Z , es soll sich um 5 Grad in der Z und 4 Grad in der X Achse drehen ( Dein beispiel ), und danach soll es sich entlang der Z Achse 10 einheiten vorwerts bewegen. Nicht die Z Achse im Raum , sondern die des Objectes.

@Kaeru Gaman ...... das verschieben im Raum berücksichtigt aber nicht die Stellung der Object Achsen. Wenn ein Object sich dreht. Werden die Achsen mit gedreht. Und entlang dieser Achse , zum Beispiel Z .... für eine vorwertz bewegung. Möchte ich das Object verschieben.

Was mich aber wirklich interesiert ist. Warum kann man 4 Tage im Forum die Such Funktion verwenden. Aber ich stosse nie auf das was ich suche.

Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Beitrag von alter Mann »

Das "Objekt" soll sich also um eine beliebig im Raum liegende Achse (charakterisiert durch einen Punkt und einen Vektor) drehen und sich dann entlang dieser Achse bewegen ?

Da hab ich irgendwo C-Code dazu. Vielleicht kann ich das bis heute abend mal umsetzten
Win11 64Bit / PB 6.0
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Beitrag von tft »

Hi...

wäre ja echt cool ...

Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

tft hat geschrieben:@Kaeru Gaman ...... das verschieben im Raum berücksichtigt aber nicht die Stellung der Object Achsen. Wenn ein Object sich dreht. Werden die Achsen mit gedreht. Und entlang dieser Achse , zum Beispiel Z .... für eine vorwertz bewegung. Möchte ich das Object verschieben.
da hast du ja nicht nach gefragt.
auch Objekte die man verschiebt, verschiebt man entlang von Richtungsvektoren.

wenn du eine drehung haben willst, musst du den richtungsvektor vorher so drehen, dass er in die richtung zeigt die du haben willst.

also, eine verschiebung um (10,0,0) ist immer eine 10-x-verschiebung.
wenn du um 90° drehst, hast du danach eine verschiebung um (0,10,0),
wenn du um 45° drehst ist der vektor (7.07, 7.07, 0)

wenn du dein Objekt in Richtung der Objektachse bewegen willst,
ist eben die Objektachse dein Richtungsvektor,
den multiplizierst du halt mit der Geschwindigkeit.


das widerspricht nicht dem, was der Alte Mann sagt, es ist nur etwas zusätzliche Hintergrundinformation.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Beitrag von alter Mann »

mal zum probieren

Code: Alles auswählen

EnableExplicit

#PB_DBL_EPS        = 2.2204460492503131e-016   ; smallest such that 1.0+#PB_DBL_EPS != 1.0
#PB_EPS_QUAD       = (#PB_DBL_EPS*#PB_DBL_EPS) 

Macro M_SQRT(w)
  MathSqrt(w)
EndMacro

Macro M_ABS(w)
  Abs(w)
EndMacro

Macro M_TORAD(w)
  ((w)*#PI/180.)
EndMacro

Macro M_TOGRAD(w)
  ((w)*180./#PI)
EndMacro

Procedure.d MathSqrt(w.d)
  If w <= 0.0
    ProcedureReturn 0.0
  EndIf
  ProcedureReturn Sqr(w)
EndProcedure

; ********************************************************************************
; Matrixmultiplikation (Anz. der Spalten der 1. Matrix =Anz. Zeilen der 2. Matrix)
; P: alter Mann
; E: iZ1,iS1      Zeilen,Spalten der 1. Matrix
;    dMat1(2)     Koeffizienten der 1. Matrix
;    iZ2,iS2      Zeilen,Spalten der 2. Matrix
;    dMat2(2)     Koeffizienten der 2. Matrix
; A: dMat3(2)     Ergebnismatrix (lZ1 Zeilen,lS2 Spalten)
; R: 0            i.O.
;    1            Anz. der Spalten der 1. Matrix <> Anz. Zeilen der 2. Matrix
;*********************************************************************************
Procedure.i  Pb_Math_Mat2Mul (iZ1.i,iS1.i,dMat1.d(2),iZ2.i,iS2.i,dMat2.d(2),dMat3.d(2))

  If iS1 <> iZ2 
    ProcedureReturn 1
  EndIf
  Protected  i.i,j.i,k.i
  Protected  dSum.d

  For i=0 To iZ1-1 Step 1
    For j=0 To iS2-1 Step 1
      dSum = 0.0
      For k=0 To iZ2-1 Step 1
        dSum + dMat1(i,k) * dMat2(k,j)
      Next k
      dMat3(i,j) = dSum
    Next j
  Next i
  ProcedureReturn 0
EndProcedure

; **********************************************************************
; Setzen der Transformationsmatrix für eine vorgegebene Rotationsachse
; P: alter Mann
; E: dVx.d,dVy.d,dVz.d  Richtungsvektor
;    dW.d               Drehwinkel (rad)
; A: dMat.d(2)          Transformationsmatrix (4x4)
; R: 0                  i.O.
;    1                  Null-Vektor
; **********************************************************************
Procedure.i Pb_Math_MatDreVek(dVx.d,dVy.d,dVz.d,dW.d,dMat.d(2))

  Protected dL.d   = dVx*dVx+dVy*dVy+dVz*dVz
  Protected iRet.i = 0
  
  dMat(0,3) = 0.0
  dMat(1,3) = 0.0
  dMat(2,3) = 0.0
  dMat(3,0) = 0.0
  dMat(3,1) = 0.0
  dMat(3,2) = 0.0
  dMat(3,3) = 1.0
  If dL <= #PB_EPS_QUAD ; Vektorlänge = 0 : es wird die Einheitsmatrix zurückgegeben
    dMat(0,0) = 1.0  
    dMat(0,1) = 0.0  
    dMat(0,2) = 0.0  
    dMat(1,0) = 0.0  
    dMat(1,1) = 1.0  
    dMat(1,2) = 0.0  
    dMat(2,0) = 0.0  
    dMat(2,1) = 0.0  
    dMat(2,2) = 1.0
    iRet      = 1    
  Else
    If M_ABS(dL-1.0) > #PB_EPS_QUAD ; Vektor muß normiert werden
      dL = 1./M_SQRT(dL)
      dVx * dL
      dVy * dL
      dVz * dL
    EndIf
    
    Protected dSin.d  = Sin(-dW)
    Protected dCos.d  = Cos(-dW)
    Protected d1Cos.d = 1.-dCos

    dMat(0,0) =      dCos+dVx*dVx*d1Cos
    dMat(0,1) =  dVz*dSin+dVx*dVy*d1Cos
    dMat(0,2) = -dVy*dSin+dVx*dVz*d1Cos
    dMat(1,0) = -dVz*dSin+dVx*dVy*d1Cos
    dMat(1,1) =      dCos+dVy*dVy*d1Cos
    dMat(1,2) =  dVx*dSin+dVy*dVz*d1Cos
    dMat(2,0) =  dVy*dSin+dVx*dVz*d1Cos
    dMat(2,1) = -dVx*dSin+dVy*dVz*d1Cos
    dMat(2,2) =      dCos+dVz*dVz*d1Cos
  EndIf
  ProcedureReturn iRet
EndProcedure

; **********************************************************************
; Setzen der Transformationsmatrix für eine vorgegebene Verschiebung
; P: alter Mann
; E: dVx.d,dVy.d,dVz.d  Verschiebevektor
;    dL.d               Verschiebelänge
; A: dMat.d(2)          Transformationsmatrix (4x4)
; R: 0                  i.O.
;    1                  Verschiebevektor = 0 und Verschiebelänge <> 0
; **********************************************************************
Procedure.i Pb_Math_MatVer(dVx.d,dVy.d,dVz.d,dL.d,dMat.d(2))

  Protected iRet = 0
  If dL <> 0.0
    Protected dVL.d = dVx*dVx+dVy*dVy+dVz*dVz
    If dVL < #PB_EPS_QUAD
      iRet = 1
    Else
      If M_ABS(dVL-1.0) > #PB_EPS_QUAD ; Vektor muß normiert werden
        dVL = 1./M_SQRT(dVL)
        dVx * dVL
        dVy * dVL
        dVz * dVL
      EndIf
    EndIf
    dVx * dL
    dVy * dL
    dVz * dL
  EndIf
  dMat(0,3) = dVx
  dMat(1,3) = dVy
  dMat(2,3) = dVz
  dMat(0,0) = 1.0  
  dMat(0,1) = 0.0  
  dMat(0,2) = 0.0  
  dMat(1,0) = 0.0  
  dMat(1,1) = 1.0  
  dMat(1,2) = 0.0  
  dMat(2,0) = 0.0  
  dMat(2,1) = 0.0  
  dMat(2,2) = 1.0
  dMat(3,0) = 0.0
  dMat(3,1) = 0.0
  dMat(3,2) = 0.0
  dMat(3,3) = 1.0
  ProcedureReturn iRet
EndProcedure

; **********************************************************************
; Berechnen der Transformationsmatrix für die Drehung um eine Achse
; P: alter Mann
; E: dPx.d,dPy.d,dPz.d  Achspunkt
;    dVx.d,dVy.d,dVz.d  Achsvektor
;    dW.d               Drehwinkel (rad)
; A: dMat.d(2)          Transformationsmatrix (4x4)
; R: 0                  i.O.
;    1                  Achsvektor = 0 
; **********************************************************************
Procedure.i Pb_Math_MatRotAx (dPx.d,dPy.d,dPz.d,dVx.d,dVy.d,dVz.d,dW.d,dMat.d(2))

  Protected Dim dMat1.d(3,3)
  Protected Dim dMat2.d(3,3)
  Protected iRet.i = 0

  iRet = Pb_Math_MatDreVek(dVx,dVy,dVz,dW,dMat1.d())
  Pb_Math_MatVer(dPx,dPy,dPz,0.0,dMat.d())
  Pb_Math_Mat2Mul(4,4,dMat(),4,4,dMat1(),dMat2())
  Pb_Math_MatVer(-dPx,-dPy,-dPz,0.0,dMat1.d())
  Pb_Math_Mat2Mul(4,4,dMat2(),4,4,dMat1(),dMat())
  ProcedureReturn iRet
EndProcedure

; **********************************************************************
; Transformieren eines Punktes/Vektors
; P: alter Mann
; E: *dQx.d,*dQy.d,*dQz.d  Punkt/Vektor
;    dQw.d                 = 1.0 Punkt
;                          = 0.0 Vektor
;    dMat.d(2)             Transformationsmatrix (4x4)
; A: *dQx.d,*dQy.d,*dQz.d  neuer Punkt/Vektor
; **********************************************************************
Procedure.i Pb_Math_MatTra (*dQx.d,*dQy.d,*dQz.d,dQw.d,dMat.d(2))

  Protected Dim dE.d(3,1)
  Protected Dim dA.d(3,1)
  
  dE(0,0) = PeekD(*dQx)
  dE(1,0) = PeekD(*dQy)
  dE(2,0) = PeekD(*dQz)
  dE(3,0) = dQw

  Pb_Math_Mat2Mul (4,4,dMat(),4,1,dE(),dA())
  
  PokeD(*dQx,dA(0,0))
  PokeD(*dQy,dA(1,0))
  PokeD(*dQz,dA(2,0))

EndProcedure

;- *****************************************************
Procedure Test()

; Achse außerhalb des Nullpunktes in z-Richtung
Protected AchsPktX.d = 50.0 
Protected AchsPktY.d = 0.0
Protected AchsPktZ.d = 0.0
Protected AchsVekX.d = 0.0
Protected AchsVekY.d = 0.0
Protected AchsVekZ.d = 1.0

Protected Dim TrafoMatrix.d(3,3)
; Transformationsmatrix berechnen bie einer Drehung um 180°
Pb_Math_MatRotAx (AchsPktX,AchsPktY,AchsPktZ,AchsVekX,AchsVekY,AchsVekZ,M_TORAD(180.),TrafoMatrix())

; beliebig viele Punkte transformieren
Protected GeoPktX.d = 100.0
Protected GeoPktY.d = 0.0
Protected GeoPktZ.d = 0.0
Pb_Math_MatTra (@GeoPktX,@GeoPktY,@GeoPktZ,1.0,TrafoMatrix())
Debug GeoPktX
Debug GeoPktY
Debug GeoPktZ
GeoPktX.d = 50.0
GeoPktY.d = 50.0
GeoPktZ.d = 0.0
Pb_Math_MatTra (@GeoPktX,@GeoPktY,@GeoPktZ,1.0,TrafoMatrix())
Debug GeoPktX
Debug GeoPktY
Debug GeoPktZ

; Achse durch Nullpunkt und in Richtung (x=1,y=1,z=0) -> Transformationsmatix für Winkel -90°
Pb_Math_MatRotAx (0.0,0.0,0.0,1.0,1.0,0.0,M_TORAD(-90.),TrafoMatrix())
GeoPktX.d = 100.0
GeoPktY.d = 0.0
GeoPktZ.d = 0.0
; Punkt transformieren
Pb_Math_MatTra (@GeoPktX,@GeoPktY,@GeoPktZ,1.0,TrafoMatrix())
Debug GeoPktX
Debug GeoPktY
Debug GeoPktZ
; Vektor transformieren
Protected GeoVekX.d = 50.0
Protected GeoVekY.d = 30.0
Protected GeoVekZ.d = 10.0
Pb_Math_MatTra (@GeoVekX,@GeoVekY,@GeoVekZ,0.0,TrafoMatrix())
Debug GeoVekX
Debug GeoVekY
Debug GeoVekZ

; Verschiebematrix entlang des Vektors für Länge 20
Pb_Math_MatVer(GeoVekX,GeoVekY,GeoVekZ,20.0,TrafoMatrix())
GeoPktX.d = 100.0
GeoPktY.d = 20.0
GeoPktZ.d = 50.0
; Punkt verschieben
Pb_Math_MatTra (@GeoPktX,@GeoPktY,@GeoPktZ,1.0,TrafoMatrix()) 
Debug GeoPktX
Debug GeoPktY
Debug GeoPktZ


EndProcedure

Test()
Ich hoffe, dass es soweit verständlich ist.
Win11 64Bit / PB 6.0
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Beitrag von tft »

Hallo ..

voll danke. Echt krass.

Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

>Fielen dank.
>vormulieren
Kleiner Buchstabentausch?? :lol:
Win11 x64 | PB 6.20
Antworten