Drawing3D - Draw-Befehle für 3D-Szenen
- Falko
- Admin
- Beiträge: 3531
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0 - Kontaktdaten:
Re: Drawing3D - Draw-Befehle für 3D-Szenen
Danke @STARGÅTE
MfG Falko
MfG Falko
- silbersurfer
- Beiträge: 174
- Registriert: 06.07.2014 12:21
Re: Drawing3D - Draw-Befehle für 3D-Szenen
Schade Stargate auf PureBasic 5.2 läuft es leider nicht mehr
schmeißt den Fehler"Stucture mit Dymamischen Elementen ist in StructureUnion nicht erlaubt vielecht kannst du das ja beheben ?
Wäre Super denn Drawing3D ist echt gut
gruss Silbersurfer
Code: Alles auswählen
Structure Drawing3D_Object
StructureUnion
Type.i
Cluster.Drawing3D_Cluster ;<<<<<<<<< dieses Element
Line.Drawing3D_Line
Triangle.Drawing3D_Triangle
EndStructureUnion
EndStructure
schmeißt den Fehler"Stucture mit Dymamischen Elementen ist in StructureUnion nicht erlaubt vielecht kannst du das ja beheben ?
Wäre Super denn Drawing3D ist echt gut
gruss Silbersurfer
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Re: Drawing3D - Draw-Befehle für 3D-Szenen
du kannst glaube ich die ganze struktur auskommentieren, die wird in dieser Version die hier online ist eh nicht genutzt.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- silbersurfer
- Beiträge: 174
- Registriert: 06.07.2014 12:21
Re: Drawing3D - Draw-Befehle für 3D-Szenen
jo das funzt... cool, Danke Stargate
Die Lib ist echt stark....
Die Lib ist echt stark....
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
- silbersurfer
- Beiträge: 174
- Registriert: 06.07.2014 12:21
Re: Drawing3D - Draw-Befehle für 3D-Szenen
hallo Stargate,
Ich habe da noch mal eine frage bezüglich Rotation Matrix
habe mir, um alles besser zu verstehen eine eigene Rotation Matrix erstellt
Die funtz auch soweit nur das Sie nach einiger Zeit aus dem Ruder Läuft und ich Frage mich warum?
wenn die Rotation für jede Achse allein gemacht werden läuft alles richtig
dein Code hier
läuft sauber, nur kann Ich nicht ganz nachvollziehen warum
meine Frage was übersehe Ich jetzt hier
gruss Silbersurfer
Ich habe da noch mal eine frage bezüglich Rotation Matrix
habe mir, um alles besser zu verstehen eine eigene Rotation Matrix erstellt
Die funtz auch soweit nur das Sie nach einiger Zeit aus dem Ruder Läuft und ich Frage mich warum?
wenn die Rotation für jede Achse allein gemacht werden läuft alles richtig
Code: Alles auswählen
With *use
\p11=CosZ*CosY : \p21=-SinZ : \p31=-SinY
\P12=SinZ : \p22=CosZ*CosX : \p32=-SinX
\p13=SinY : \p23=SinX : \p33=CosY*CosX
EndWith
läuft sauber, nur kann Ich nicht ganz nachvollziehen warum
Code: Alles auswählen
*Use\p11 = CosY*CosZ : *Use\p12 = -CosY*SinZ : *Use\p13 = SinY
*Use\p21 = SinX*SinY*CosZ+CosX*SinZ : *Use\p22 = -SinX*SinY*SinZ+CosX*CosZ : *Use\p23 = -SinX*CosY
*Use\p31 = -CosX*SinY*CosZ+SinX*SinZ : *Use\p32 = CosX*SinY*SinZ+SinX*CosZ : *Use\p33 = CosX*CosY
gruss Silbersurfer
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Re: Drawing3D - Draw-Befehle für 3D-Szenen
Die Rotation im 3D-Raum ist eine Hintereinanderausführung von Einzelrotationen um jede der drei Achsen.
Zwar (bzw. vermutlich) stimmen deine Einzelrotationen, aber du hast sie "falsch" multipliziert.
RotationXYZ = RotationZ * RotationY * RotationX
Dabei werden die Matrixeinträge nicht einfach einzeln multipliziert, sondern nach der Vorschrift:
M = A * B -> M[i,j] = Summe[k]( A[i,k] * B[k,j] )
Dabei sei auch erwähnt, dass die Matrixmultiplikation nicht kommutativ ist, also A*B <> B*A ist.
Deswegen gibt es durchaus verschiedene Rotationsmatrizen, jenachdem welche Rotationsachen-Reihenfolge man definiert.
Weiterführende Literatur: Eulersche Winkel
Zwar (bzw. vermutlich) stimmen deine Einzelrotationen, aber du hast sie "falsch" multipliziert.
RotationXYZ = RotationZ * RotationY * RotationX
Dabei werden die Matrixeinträge nicht einfach einzeln multipliziert, sondern nach der Vorschrift:
M = A * B -> M[i,j] = Summe[k]( A[i,k] * B[k,j] )
Dabei sei auch erwähnt, dass die Matrixmultiplikation nicht kommutativ ist, also A*B <> B*A ist.
Deswegen gibt es durchaus verschiedene Rotationsmatrizen, jenachdem welche Rotationsachen-Reihenfolge man definiert.
Weiterführende Literatur: Eulersche Winkel
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- silbersurfer
- Beiträge: 174
- Registriert: 06.07.2014 12:21
Re: Drawing3D - Draw-Befehle für 3D-Szenen
das habe Ich auch soweit verstanden und meine Matrix macht das auch so (denke Ich jetzt mal)
was Ich mit aus dem Ruder laufen meinte, ist das nach einiger Zeit sich die Pixel verschieben...
die Rotation verlaufen erstmal so wie erwartet nur das irgendwann sich die Form verändert (Viereck)
als wäre was ungenau an der Rechnung an sich *grübel
was Ich mit aus dem Ruder laufen meinte, ist das nach einiger Zeit sich die Pixel verschieben...
die Rotation verlaufen erstmal so wie erwartet nur das irgendwann sich die Form verändert (Viereck)
als wäre was ungenau an der Rechnung an sich *grübel
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
- alter Mann
- Beiträge: 201
- Registriert: 29.08.2008 09:13
- Wohnort: hinterm Mond
Re: Drawing3D - Draw-Befehle für 3D-Szenen
Das sich die Objekte, die Du mit der Transformationsmatrix "behandelst" nach einer Weile verzerrt dargestellt werden, ist nicht verwunderlich, da sich durch die ständige Matrixmultiplikation Fehler aufsummieren. Du must also die Transformationsmatrix nach einigen Multiplikationen wieder "orthogonalisieren". Eine "orthogonale" Transformationsmatrix hat eine Determinante von 1. Eine "verzerrte" Transformationsmatrix eine kleiner 1.
Win11 64Bit / PB 6.0
Re: Drawing3D - Draw-Befehle für 3D-Szenen
Redest du jetzt von deinem oder meinem Code?
Also die Matrix die jetzt noch im Post von dir steht ist falsch.
Das mit "aus dem Ruder Läuft" kann durchaus ein normales Artefakt der Matrizenrechung sein.
Bei jeder Matrizenmultiplikation entstehen ungenauigkeitden Aufgrund der Floats.
Eine fortlaufende Rotation mit einer Matrix führt zu einer Matrix die nicht mehr Normiert ist.
Das bedeutet anschaulich, das Objekt wird scheinbar "großer".
Aus diesem Grund verwenden 3D-Anwendungen Quaternions.
Dort wird eine Orientierung eines Objekts mit Hilfe von 4 Zahlen dargestellt und nicht mit 9 wie bei der Rotationsmatrix.
Außerdem sind weniger Multiplikationen nötig, sodass weniger Fehler entstehen.
Bei Drawing3D habe ich darauf verzichtet, da ich keine dynamischen Sachen anzeigen lassen wollte, da die Engine dafür eh zu langsam ist, sondern nur statische.
Ansonsten kannst du ja mal dein Code posten oder als PN zukommen lassen, vllt ist es auch was anderes.
Also die Matrix die jetzt noch im Post von dir steht ist falsch.
Das mit "aus dem Ruder Läuft" kann durchaus ein normales Artefakt der Matrizenrechung sein.
Bei jeder Matrizenmultiplikation entstehen ungenauigkeitden Aufgrund der Floats.
Eine fortlaufende Rotation mit einer Matrix führt zu einer Matrix die nicht mehr Normiert ist.
Das bedeutet anschaulich, das Objekt wird scheinbar "großer".
Aus diesem Grund verwenden 3D-Anwendungen Quaternions.
Dort wird eine Orientierung eines Objekts mit Hilfe von 4 Zahlen dargestellt und nicht mit 9 wie bei der Rotationsmatrix.
Außerdem sind weniger Multiplikationen nötig, sodass weniger Fehler entstehen.
Bei Drawing3D habe ich darauf verzichtet, da ich keine dynamischen Sachen anzeigen lassen wollte, da die Engine dafür eh zu langsam ist, sondern nur statische.
Ansonsten kannst du ja mal dein Code posten oder als PN zukommen lassen, vllt ist es auch was anderes.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- silbersurfer
- Beiträge: 174
- Registriert: 06.07.2014 12:21
Re: Drawing3D - Draw-Befehle für 3D-Szenen
Hm da Ich leider kein Mathe Profi bin, und Mir immer alles hart in meinen Schädel hämmern muß
bin Ich mit meiner Wissensaufnahme hier wohl am Ende, mein Problem ist sicher nicht das Verstäntnis, sondern eher
die Schreibweise von Mathematik wo Ich immer wieder auf dem Schlauch stehe "Leider seuftz"
Stargate schrieb
Mir ist auch aufgefallen das es nur zu fehlern kommt wenn Ich X und Y Achse Rotiere X-Z oder Y-Z ergeben in meinen Augen keine fehler
zumindest Rotieren Sie wie Ich mir das gedacht hatte
alter Mann Schrieb
mir fehlt da immer der bezug wie man etwas in Progammiersprachen umsetzt
So Hier jetzt mal ein kleiner code wie Ich das meine Hoffe das er nicht alt so schlimm ist
bin Ich mit meiner Wissensaufnahme hier wohl am Ende, mein Problem ist sicher nicht das Verstäntnis, sondern eher
die Schreibweise von Mathematik wo Ich immer wieder auf dem Schlauch stehe "Leider seuftz"
Stargate schrieb
ja aber was genau mache Ich da Falsch ?Also die Matrix die jetzt noch im Post von dir steht ist falsch.
Mir ist auch aufgefallen das es nur zu fehlern kommt wenn Ich X und Y Achse Rotiere X-Z oder Y-Z ergeben in meinen Augen keine fehler
zumindest Rotieren Sie wie Ich mir das gedacht hatte
alter Mann Schrieb
da Habe Ich das ganze Web durchsucht und auch viel gefunden nur leider wieder alles in der Mathesprache wo bei mir dann der Kopf RauchtTransformationsmatrix nach einigen Multiplikationen wieder "orthogonalisieren"
mir fehlt da immer der bezug wie man etwas in Progammiersprachen umsetzt
So Hier jetzt mal ein kleiner code wie Ich das meine Hoffe das er nicht alt so schlimm ist
Code: Alles auswählen
EnableExplicit
Structure Vector
x.f
y.f
z.f
EndStructure
Structure surface
xp.f : yp.f :image.i
scale.f
List vertex.Vector()
EndStructure
Structure Matrix3D
p11.f : p21.f : p31.f
p12.f : p22.f : p32.f
p13.f : p23.f : p33.f
EndStructure
OpenWindow(0,0,0,800,600,"Test Grafik ausgaben !",#PB_Window_SystemMenu |#PB_Window_ScreenCentered )
ImageGadget(0,0,0,800,600,0)
Define image=CreateImage(#PB_Any,800,600)
Define testm.Matrix3D,sur1.surface
sur1\scale=100 :sur1\xp=400 : sur1\yp=300
Procedure addvertex(*use.surface,x.f,y.f,z.f)
AddElement(*use\vertex())
*use\vertex()\x=x* *use\scale
*use\vertex()\y=y* *use\scale
*use\vertex()\z=z* *use\scale
EndProcedure
Procedure.i Draw_Rotate3D(*Use.Vector, *Source.Matrix3D)
Protected Buffer.Vector
CopyMemory(*Use, @Buffer, SizeOf(Vector))
*Use\Z = Buffer\z**Source\p33 + Buffer\Y**Source\p32 + Buffer\x**Source\p31
*Use\Y = Buffer\z**Source\p23 + Buffer\Y**Source\p22 + Buffer\x**Source\p21
*Use\X = Buffer\z**Source\p13 + Buffer\Y**Source\p12 + Buffer\x**Source\p11
ProcedureReturn *Use
EndProcedure
Procedure.i Rotation(*use.Matrix3D,x.f,y.f,z.f)
Protected CosZ.f = Cos(Z), CosY.f = Cos(Y), CosX.f = Cos(X)
Protected SinZ.f = Sin(Z), SinY.f = Sin(Y), SinX.f = Sin(X)
; *Use\p11 = CosY*CosZ : *Use\p12 = -CosY*SinZ : *Use\p13 = SinY
; *Use\p21 = SinX*SinY*CosZ+CosX*SinZ : *Use\p22 = -SinX*SinY*SinZ+CosX*CosZ : *Use\p23 = -SinX*CosY
; *Use\p31 = -CosX*SinY*CosZ+SinX*SinZ : *Use\p32 = CosX*SinY*SinZ+SinX*CosZ : *Use\p33 = CosX*CosY
With *use
\p11=CosZ*CosY : \p21=-SinZ : \p31=-SinY
\P12=SinZ : \p22=CosZ*CosX : \p32=-SinX
\p13=SinY : \p23=SinX : \p33=CosY*CosX
EndWith
ProcedureReturn *use
EndProcedure
Procedure draw(*this.surface)
Shared testm
Protected bx.f,by.f,x.f,y.f,z.f
Box(0,0,800,600,$000000)
bx=*this\vertex()\x : by=*this\vertex()\y
ForEach *this\vertex()
x=*this\vertex()\x : y=*this\vertex()\y
LineXY(*this\xp+bx,*this\yp+by,*this\xp+x,*this\yp+y)
bx=x : by=y
Draw_Rotate3D(*this\vertex(), testm)
Next
EndProcedure
addvertex(sur1,-1,1,0)
addvertex(sur1,1,1,0)
addvertex(sur1,1,-1,0)
addvertex(sur1,-1,-1,0)
Rotation(testm,0.01,0.0,0.002)
Repeat
If StartDrawing(ImageOutput(image))
draw(sur1)
StopDrawing()
EndIf
SetGadgetState(0,ImageID(image))
Until WindowEvent()=#PB_Event_CloseWindow
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander