Aktuelle Zeit: 11.07.2020 07:23

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 66 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4, 5, 6, 7  Nächste
Autor Nachricht
 Betreff des Beitrags: Re: Drawing3D - Draw-Befehle für 3D-Szenen
BeitragVerfasst: 03.02.2013 22:29 
Offline
Admin
Benutzeravatar

Registriert: 29.08.2004 11:27
Danke @STARGÅTE :allright:

MfG Falko

_________________
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Drawing3D - Draw-Befehle für 3D-Szenen
BeitragVerfasst: 16.08.2014 13:54 
Offline
Benutzeravatar

Registriert: 06.07.2014 12:21
Schade Stargate auf PureBasic 5.2 läuft es leider nicht mehr

Code:
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 :allright:

gruss Silbersurfer

_________________
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Drawing3D - Draw-Befehle für 3D-Szenen
BeitragVerfasst: 16.08.2014 14:35 
Offline
Kommando SG1
Benutzeravatar

Registriert: 01.11.2005 13:34
Wohnort: Glienicke
du kannst glaube ich die ganze struktur auskommentieren, die wird in dieser Version die hier online ist eh nicht genutzt.

_________________
Bild
 
BildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Drawing3D - Draw-Befehle für 3D-Szenen
BeitragVerfasst: 16.08.2014 16:43 
Offline
Benutzeravatar

Registriert: 06.07.2014 12:21
jo das funzt... cool, Danke Stargate :allright:
Die Lib ist echt stark....

_________________
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Drawing3D - Draw-Befehle für 3D-Szenen
BeitragVerfasst: 19.08.2014 19:16 
Offline
Benutzeravatar

Registriert: 06.07.2014 12:21
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
Bild
Code:
With *use
      \p11=CosZ*CosY : \p21=-SinZ       : \p31=-SinY
      \P12=SinZ      : \p22=CosZ*CosX   : \p32=-SinX
      \p13=SinY      : \p23=SinX        : \p33=CosY*CosX
EndWith

dein Code hier
läuft sauber, nur kann Ich nicht ganz nachvollziehen warum
Code:
*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

meine Frage was übersehe Ich jetzt hier
gruss Silbersurfer

_________________
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Drawing3D - Draw-Befehle für 3D-Szenen
BeitragVerfasst: 19.08.2014 19:31 
Offline
Kommando SG1
Benutzeravatar

Registriert: 01.11.2005 13:34
Wohnort: Glienicke
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

_________________
Bild
 
BildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Drawing3D - Draw-Befehle für 3D-Szenen
BeitragVerfasst: 19.08.2014 20:01 
Offline
Benutzeravatar

Registriert: 06.07.2014 12:21
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

_________________
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Drawing3D - Draw-Befehle für 3D-Szenen
BeitragVerfasst: 19.08.2014 22:49 
Offline
Benutzeravatar

Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond
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.

_________________
Win8 32Bit / PB 5.10 / PB 5.20


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Drawing3D - Draw-Befehle für 3D-Szenen
BeitragVerfasst: 19.08.2014 22:56 
Offline
Kommando SG1
Benutzeravatar

Registriert: 01.11.2005 13:34
Wohnort: Glienicke
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.

_________________
Bild
 
BildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Drawing3D - Draw-Befehle für 3D-Szenen
BeitragVerfasst: 21.08.2014 11:17 
Offline
Benutzeravatar

Registriert: 06.07.2014 12:21
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
Zitat:
Also die Matrix die jetzt noch im Post von dir steht ist falsch.


ja aber was genau mache Ich da 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
Zitat:
Transformationsmatrix nach einigen Multiplikationen wieder "orthogonalisieren"

da Habe Ich das ganze Web durchsucht und auch viel gefunden nur leider wieder alles in der Mathesprache wo bei mir dann der Kopf Raucht
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:
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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 66 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4, 5, 6, 7  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye