3D Library
Übersicht

![]() |
VertexBetreff: 3D Library |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi!
Ja, ich habe mal die 3D Library von blitzbase.de erweitert. Sie verwendet nun 4x4 Matrizen und 4 dimensionale Vektoren. CreateMatrix.matrix_t() Erstellt eine Matrix und gibt diese zurück FreeMatrix(m.matrix_t) Entfernt Matrix m aus dem Speicher MatrixIdentity(m.matrix_t) Macht aus Matrix m eine Einheitsmatrix MatrixRotateX(m.matrix_t, a#) Macht aus Matrix m eine X-Rotationsmatrix mit dem Winkel a MatrixRotateY(m.matrix_t, a#) Macht aus Matrix m eine Y-Rotationsmatrix mit dem Winkel a MatrixRotateZ(m.matrix_t, a#) Macht aus Matrix m eine Z-Rotationsmatrix mit dem Winkel a MatrixScale(m.matrix_t, sx#, sy#, sz#) Macht aus der Matrix m eine Skalierungsmatrix mit den Faktoren sx#, sy# und sz# MatrixTranslate(m.matrix_t, tx#, ty#, tz#) Macht aus Matrix m eine Verschiebungsmatrix mit den Faktoren tx#, ty# und tz# MatrixTranspose(m.matrix_t) Spiegelt Matrix m um ihre Diagonale aa-dd MatrixMultiplyMatrix(a.matrix_t, b.matrix_t, c.matrix_t) Multipliziert Matrix a mit b und weist die result. Matrix in Matrix c zu CreateVector.vector_t() Erstellt einen neuen Vektor und gibt diesen zurück FreeVector(v.vector_t) Entfernt Vektor v aus dem Speicher VectorDotProduct#(a.vector_t, b.vector_t) berechnet das Punktprodukt aus Vektor a mit b und gibt dieses zurück VectorLength#(v.vector_t) gibt die Länge des Vektors v zurück VectorScale(v.vector_t, s#) Skaliert den Vektor v mit dem Faktor s VectorNormalize(v.vector_t) Nomalisiert Vektor v VectorCrossProduct(a.vector_t, b.vector_t, c.vector_t) Berechnet das Kreuzprodukt aus Vektor a mit b und weist das Resultat Vektor c zu VectorAddition(a.vector_t, b.vector_t, c.vector_t) Addiert vektor a mit b und weisst das Ergebnis Vektor c zu VectorSubtraction(a.vector_t, b.vector_t, c.vector_t) Subtrahiert Vektor b von a und weisst das Ergebnis Vektor c zu VectorMultiplyMatrix(v.vector_t, m.matrix_t) Multipliziert Vektor v mit Matrix m MatrixCrossProduct(v.vector_t, m.matrix_t) Erstellt eine Matrix die multipliziert mit Vektor v das Kreuzprodukt von Vektor v ergibt und weisst sie Matrix m zu BlitzBasic: [AUSKLAPPEN] ; ----------------------------------------------------------------------- Ist noch ungetestet. Mache in laufe der Woche mal eine kleine 3D Wireframe Engine, wo man sehen kann, wie sie funktioniert. mfg olli |
||
vertex.dreamfall.at | GitHub |
lettorTrepuS |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger. | ||
walskiEhemaliger Admin |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Was genau meinst du mit Sätzen wie:
Zitat: Macht aus Matrix m eine X-Rotationsmatrix mit dem Winkel a Ich hatte leider keine Zeit mir das ganze in Ruhe anzugucken, also frag ich einfach mal ganz blöd: Ist die zurückgegebene Matrix das Bild der Matrix m gedreht um die x-Ache mit dem Winkel a oder ist m die Abbildungsvorschrift, die altM um die x-Achse mit dem Winkel a dreht? walski |
||
buh! |
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmm ich erklähr dir das mal an einem Beispiel:
Du hast in Blitz ein Mesh mit CreateCube erstellt. Jetzt kannst du ihn mit PositionEntity verschieben, mit ScaleEntity skalieren und mit RotateEntity rotieren. Dabei verändern sich nicht die lokalen Vertexkoordinaten. Für die Szene müssen diesen jedoch transformiert werden. Was macht man also? Man legt 5 Matrizen mit CreateMatrix an. CreateMatrix erstellt eine Einheitsmatrix, das bedeutet, wenn man sie mit einem Vektor multipliziert, kommt der selbe Vektor wieder heraus (bei einer Zeromatrix wäre dies z. B. nicht der Fall). Jetzt hast du also 5 Einheitsmatrizen. Aus der ersten machst du eine Verschiebungsmatrix mit MatrixTranslate, aus der zweiten eine Skalierungsmatrix mit MatrixScale und aus den letzten drei, drei Rotationsmatrizen mit MatrixRotateX, Y, und Z. Um nun den Cube richtig zu transformieren, erstellst du noch eine Einheitsmatrix, die sogenannte Modelviewmatrix eine Einheitsmatrix die jetzt via MatrixMultiplyMatrix mit der Verschiebunsgmatrix, Skalierungsmatrix und den 3 Rotationsmatrizen multipliziert wird. Jetzt hast du eine Bearbeitungsvorschrift für alle Vertices innerhalb des Cubes erstellt, das erspart ca. 4/5 Rechenaufwand. Vertices besitzten eine X, Y, und Z Koordinate was ein Vektor ergibt, zusätzlich noch einen Normalvektor NX, NY und NZ. Der W Index entfällt hier bei diesem Beispiel. Multiplizierst du jetzt jeden Vertex(also einen Vektor) und jeden Normalvektor via VectorMultiplyMatrix mit der Modelviewmatrix erhälst du nun die richtig tranformierten Vertexkoordinaten und Normalvektoren. Erst wenn das mit jedem Mesh bzw. Vertex wiederholt wurden ist, kann man beginnen die Szene zu rendern. Dies geschieht auch wieder durch Multiplikation von Frustummatrizen(zum bestimmen des Clippingbereichs und des Field Of View der Kamera), Projektionsmatrizen(zum projektzieren der fertigen 3D Koordinaten auf den Bildschirm) etc. mfg olli |
||
vertex.dreamfall.at | GitHub |
walskiEhemaliger Admin |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Man erhält also die Abbildungsviorschriften, nicht die fertigen Bilder?!
walski |
||
buh! |
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jup die Abbildungsvorschrift. Mit einer Matrix lässt sich jede lineare Abbildungsvorschrift definieren.
so, ich habe mal die Formeln für eine einfache 3D Wireframeengine augestellt ohne ZBuffer(fällt aber bei Wireframe auch nicht großartig auf): Modelspace ![]() PositionEntity(entity, tx, ty, tz) RotateEntity(entity, a, a, a) (wobei a zuerst pitch, dann yaw und dann roll Winkel ist) ScaleEntity(entity, sx, sy, sz) Cameraspace ![]() PositionEntity(camera, tx, ty, tz) RotateEntity(camera, a, a, a) (selbe wie bei Modelspace) 2d Projektion ![]() und ![]() x2d = projektzierte 2d x Koordinate y2d = projektzierte 2d y Koordinate x3d = X Koordinate des zu projektzierrenden 3d Punktes y3d = Y Koordinate des zu projektzierrenden 3d Punktes z3d = Z Koordinate des zu projektzierrenden 3d Punktes fov = field of view - brennweite der kamera (1/tan(fov/2) kann durch CameraZoom ersetzt werden) sw = screen width - Breite des Viewports sh = screen height - Höhe des Viewports Backfaceculling ![]() x1, y1 = 2d Koordinaten des ersten Eckpunktes im projektzierten Dreieck x2, y2 = 2d Koordinaten des zweiten Eckpunktes im projektzierten Dreieck x3, y3 = 2d Koordinaten des dritten Eckpunktes im projektzierten Dreieck Wenn cull = TRUE dan findet Culling statt, andernfalls nicht. |
||
vertex.dreamfall.at | GitHub |
walskiEhemaliger Admin |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hey,
vielen vielen Dank! Auch wenn das momentan nicht in mein Beschäftigungsfeld fällt, bin ich mir beinahe 100% sicher, dass das nochmal sehr nützlich sein wird ![]() Die Verformungsmatritzen hät ich vielleicht noch so hinbekommen, aber die 2D-Projektion sieht mir auf den ersten Blick einfach zu kompliziert aus ![]() Vielen Dank und nen schönen Abend noch! walski |
||
buh! |
lettorTrepuS |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger. | ||
![]() |
eXceptION |
![]() Antworten mit Zitat ![]() |
---|---|---|
@vertex: darf ich mal fragen, welche ausbildung hast du? nur neugierig... ![]() |
||
Norweger...
Spreche aber verdammt gut 8086 |
OJay |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
sowas lernt man mit sicherheit nicht in einer ausbildung...zumindest nicht in D ![]() studium oder selbststudium. und wenn das interesse da ist gehts sowieso alles 10mal leichter ![]() wenn vertex das sample fertig hat, werd ich mich auch mal an einem kleinen spielchen damit versuchen. prinzipiell sehr interessant das ganze! ![]() |
||
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
So, irgendwas ist noch bei MatrixMultiplyMatrix falsch, wenn ich das mit nem Vektor berechne, kommt bei y immer nur 0 raus.
Habe das ganze also mal umgestellt, das ich gleich die Modelviewmatrix als Viewmatrix benutze. Das kommt dabei heraus: ![]() (mein misslungener AudiTT ![]() Wer meint, das hier Triangles fehlen, der irrt. Ist BackFaceCulling wie es auch von Direct3D benutzt wird. Diese Triangles werden ja praktisch auch nicht im Smoothedshading Szene gezeichnet. Wenn die Multiplikation hinhaut, gebe ich dann auch den Code, aber bis jetzt ist das sinnlos. walski: Jup wie ST schon sagte, ist abgeleitet von x2d = x3d / z3d und y2 = y3d / z3d. Das kann man gut beobachten, wenn man z. B. mit nem Auto durch eine Landstraße fährt. Die Bäume an der Seite, die näher zum Betrachter sind, "bewegen" sich schneller, als die im Hintergrund. Dafür sorgt das / z3d. Je größer z3d ist, also je weiter der Baum vom Betrachter weg ist, desto kleiner wird x2d bzw. y2d. x2d = (x3d * (sw/2)) / z3d + (sw/ 2) bewirkt, dass die projektzierte Szene in Relation zum Viewport steht. x2d = (x3d * (sw/2) * camerazoom) / z3d + (sw/2) bewirkt, noch, das die ganze Szene um einen optischen Skalierungsfaktor vergrößert wird. Je größer dieser ist, desto größer wird die Szene, desto größer wird der betrachtete Ausschnitt, desto weniger siehst du von der Gesamtszene. Ist praktisch wie mit einem Fehrnglas. x2d = (x3d * (sw/2) * (1/tan(fov/2))) / z3d + (sw/2) Ist etwas schwer zu erklähren. http://vertex.art-fx.org/Basic...e/Tand.htm 1/ steht für das Reziproge. tan(fov/2) den Öffnungswinkel vom Objekt der Kamera. / 2 bedeutet, das die berechnete Öffnung ja beidseitig gilt, es aber so gesehen nur mit einer Seite gerechnet wird(klingt blöd, ich weiss). eXceptION: techn. Assistent für Informatik. Wie OJay schon sagte, das lernt man da nicht. Ist mehr HTML grims krams, aber man hats zumindest leicht ![]() mfg olli |
||
vertex.dreamfall.at | GitHub |
lettorTrepuS |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger. | ||
![]() |
Mattis_the_brain |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jo cool sowas hab ich auch schon geschrieben blos nicht ganz so umfangreich , bei mir gab es sowas wie Rotation um alle drei Achsen, Verschiebung, Scalierung und Backfaceculling. Das was mir noch nicht ganz gelungen war war das Flatshaden^^ | ||
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
Soooo....
Problem ist nun behoben, hatte die Zeilenvektoren mit den Spaltenvektoren falsch verrechnet. http://vertex.art-fx.org/3D/3DEngine.zip 15 KB ist die funktionierende Engine. Steuerung links, rechts, auf, ab für links, rechts, vorwärts, rückwerts und Taste C für Backfaceculling an oder aus. mfg olli |
||
vertex.dreamfall.at | GitHub |
CodeMaster |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Sehr geil, Respekt!
Wollte früher auch immer mal sowas machen, aber mir fehlt's leider an Fachwissen... Daher hast du meine umso größere Bewunderung ![]() |
||
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.
Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102 |
Timo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
sieht wirklich gut aus!!
wie hast du das eigentlich gelernt? hast du irgendwo ein paar tutorials gefunden? ich wollte nämlich über dieses Thema eine Facharbeit schreiben, habe aber noch davon keinen blassen dunzt. Vor allem fällt mir die Sache mit der matrix schwer. Könntest du mir da irgendwie tipps, tuts,etc. empfehlen? mfg Timo |
||
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi!
Nett, jetzt musst du aus der Wireframeengine eine Engine mit Textureunterstützung machen! ![]() @Timo: Vektoren, Matrizen... Teilweise sind das echt Mathegrundlagen... grüße |
||
Timo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
mit Vektoren hab ich auch keine Probleme, eher mit der Schreibweise von Matrizen und der Rechnung mit ihnen. Mag sein das das zu Mathe gehört, aber ich kanns nicht. Allerdings möcht ichs lernen, ich brauche nur jemanden, der es mir erklärt bzw. mir sagt wo ich's lernen kann (tuts, etc.). ![]() Ich glaub nicht das wir Matrizen noch in der Schule dran nehmen. Kurvendisskussion scheint das einzigste zu sein... |
||
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi!
Da gibts ja genug Infos... Zur Not frägst deinen Mathelehrer. ![]() http://www.gamedev.net/referen...cle877.asp http://www.geocities.com/Silic...ath3d.html http://www.makegames.com/3drotation/ http://kwon3d.com/theory/transform/transform.html http://easyweb.easynet.co.uk/~...trices.htm http://de.wikipedia.org/wiki/Matrix_(Mathematik) etc... grüße |
||
Timo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
a big thx!! ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group