Entity berechnung ohne Engine3D.dll
- 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
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
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
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
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)
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.
Der Weise weiß, dass er ein Narr ist.
- alter Mann
- Beiträge: 201
- Registriert: 29.08.2008 09:13
- Wohnort: hinterm Mond
vielleicht kannst Du hiermit was anfangen
http://www.purebasic.fr/german/viewtopic.php?t=17537
http://www.purebasic.fr/german/viewtopic.php?t=17537
Win11 64Bit / PB 6.0
- 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:
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
@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
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
- alter Mann
- Beiträge: 201
- Registriert: 29.08.2008 09:13
- Wohnort: hinterm Mond
- 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:
Hi...
wäre ja echt cool ...
Gruss TFT
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
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
da hast du ja nicht nach gefragt.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.
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.
Der Weise weiß, dass er ein Narr ist.
- alter Mann
- Beiträge: 201
- Registriert: 29.08.2008 09:13
- Wohnort: hinterm Mond
mal zum probieren
Ich hoffe, dass es soweit verständlich ist.
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()
Win11 64Bit / PB 6.0
- 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:
Hallo ..
voll danke. Echt krass.
Gruss TFT
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
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