#1 22.10.2011 16:24:33

Peter-Pascal
Member
Registriert: 26.02.2007
Beiträge: 63

Speicher von Modellen

Hallo

ich habe mal wieder eine Anfängerfrage und zwar zum Speichern von Modellen bzw. Scenen.

Bislang speichere ich von einem einzelnen Mesh den Vertexbuffer und was ich sonst zum Anzeigen noch brauche, wie zB. den PrimitiveTyp. Jetzt versuche ich ein ganze Scene aufzubauen: Mit Terrain und verschiedene andere Mesh.

Nun folgende Frage: Wenn ich die Mesh durch Transformieren an eine andere Stelle bringe eventuell die Größe verändere, verändern sich dann auch die Positionsdaten im Vertexbuffer?

Transformieren heißt doch, wenn ichs richtig verstanden haben, die Weltmatrix wird verändert und dadurch die Position des Mesh verändert, aber nicht die Position aller Vertices der Mesh (VertexBuffer), die eine eigene Matrix hat um den Nullpunkt? Oder?

Wie kann ich dann eine Scene aus mehreren zusammengestellten Objecten (Mesh) abspeichern?

Gruß Peter


Heute ist nicht alle Tage – ich komm wieder, keine Frage

Offline

 

#2 22.10.2011 17:21:25

Gnietschow
ProMember
Ort: Berlin
Registriert: 20.06.2007
Beiträge: 237

Re: Speicher von Modellen

Zitat:

Wenn ich die Mesh durch Transformieren an eine andere Stelle bringe eventuell die Größe verändere, verändern sich dann auch die Positionsdaten im Vertexbuffer?

Nein, der Vertexbuffer bleibt die ganze Zeit unangetastet. Wenn du die Weltmatrix setzt und das Mesh zum rendern schickst, wird in der Grafikkarte (bei der Renderingpipeline im Vertexshader) diese Matrix auf jeden Vertex draufgerechnet und für die weitere Berechnung genutzt. Das ist auch viel performanter, da auf der GraKa viele Vertices gleichzeitig transformiert werden können, als die CPU es vermag. Außerdem ist es immer aufwendig Sachen vom Arbeitsspeicher in die Grafikkarte zu schieben, da ist es besser nur eine Transformationsmatrix rüberzuschieben, als einen Vertexbuffer mit vll tausenden Vertices.

Zitat:

Weltmatrix wird verändert und dadurch die Position des Mesh verändert

Die Weltmatrix kann noch viel mehr beinhalten als die Position, so wie Drehung, Skalierung, usw.

Zitat:

Wie kann ich dann eine Scene aus mehreren zusammengestellten Objecten (Mesh) abspeichern?

Am besten indem du für jedes Mesh den relativen Dateipfad (absolute Pfade machen viele Probleme wink ) zur Modelldatei und die verwendete Weltmatrix abspeicherst (wenn du nur Translationen hast reicht auch die Position direkt). Wenn du selbst erzeugte Modelle hast, müsstest du den gesamten Vertexbuffer abspeichern.

MfGnietschow


Es gibt 10 Gruppen von Menschen - die die das Binärsystem verstehen und die anderen.  :-)
Vegetarier essen meinem Essen das Essen weg ;)
-------------------------------------------------------------------------------------------------------------------
Der Community-Hub für Videospiele: gameloop.io

Offline

 

#3 22.10.2011 18:20:24

Peter-Pascal
Member
Registriert: 26.02.2007
Beiträge: 63

Re: Speicher von Modellen

Das habe ich noch nicht ganz verstanden:

Ich wollte nicht den VertexBuffer regelmäßig zur GraKa rüberschieben, sondern hatte mir überlegt, den durch die GraKa veränderten VertexBuffer wieder auszulesen und abzuspeichern? Oder verändert der sich auch nicht?

Ich entwickel um den Nullpunkt Modelle (bislang nur geometrische Modelle, die ich ein wenig veränder kann), den VertexBuffer kann ich in einer Datenbank bzw. per TFileStream auch auf Platte speichern.

Jetzt möchte ich eine Scene mit Terrain und abgespeicherten Modellen erstellen. Das heißt ich lade zB. eine Kugel und beweg die, usw. bis die Scene fertig ist. ZB. eine Planetensimulation, wo alle Kugeln einen festen Ausgangspunkt haben. Oder eine Stadt, wo alle Häuser (Rechecke) stehen.

Und diese fertige Scene möchte ich abspeichern, getrennt von den anderen Modellen. Da hatte ich gehofft, den durch die GraKa veränderten VertexBuffer auslesen zu können und abzuspeichern. Aber das geht wohl nicht?

Was meinst Du mit relativen Dateipfaden? Wie bekomme ich die Daten der Weltmatrix zum speichern?

Vielen Dank Gnietschow.

Gruß Peter


Heute ist nicht alle Tage – ich komm wieder, keine Frage

Offline

 

#4 23.10.2011 09:37:44

Gnietschow
ProMember
Ort: Berlin
Registriert: 20.06.2007
Beiträge: 237

Re: Speicher von Modellen

Also grundsätzlich verändert sich dein Vertexbuffer nur dann, wenn du ihn selbst veränderst. Die Grafikkarte rechnet zwar damit, aber lässt die Finger davon. smile

Du solltest dir mal ein wenig zu Objektkoordinaten und Weltkoordinaten durchlesen, ich denke mal das ist genau das, worüber du sprichst.

Alle Modelle die du um den Nullpunkt entwickelst, befinden sich in Objektkoordinaten. Dabei ist der Nullpunkt der Ankerpunkt des Modells. Um das Modell dann in deine Szene zu stellen, rechnest du eine Matrix auf die Vertices die sie z.B. verschiebt. Das ist dann die Transformation deines Modells in Objektkoordinaten zu dem Modell in Weltkoordinaten. Der Vorteil dieser Darstellungsweise ist, dass du dein Modell beliebig verschieben drehen kannst und mehrfach überall hinstellen kannst.

Soweit ich das verstanden hab, baust du jetzt mit den Modellen eine fertige Szene und möchtest nun alle Modelle in Weltkoordinaten exportieren, damit du die fertige Szene später wieder laden kannst.
Vom Prinzip her ist das ja kein Problem, du müsstest nur die jeweiligen Objektmatrizen auf den jeweiligen Vertexbuffer anwenden und die transformierten Vertices speichern . Allerdings erzeugst du damit eine sehr statische Szene, welche du später nicht mehr verändern kannst und auch speicherineffizient ist. Falls du ein Modell mit 1000 Dreiecken 1000mal in der Szene hast, müsstest du 1 Mio Dreiecke speichern. Wenn du dir das Modell einmal in Objektkoordinaten speicherst und die 1000 Matrizen dazu, dann brauchst du viel weniger Platz.

Das wäre dann auch der übliche Weg: Jedes Modell was in deiner Szene vorkommt wird einmal in Objektkoordinaten gespeichert (ob nun auf der Platte oder in einer Datenbank ist dir überlassen smile ).
Deine Szene speicherst du dann, indem du zu jedem Objekt was du platziert hast speicherst:
- die Referenz auf das jeweilige Modell in Objektkoordinaten
- die Matrix mit der es in der Welt steht

Zitat:

Was meinst Du mit relativen Dateipfaden?

Ich dachte du hast Modell-Dateien, welche du lädst. Aber ist ja doch anders smile

Zitat:

Wie bekomme ich die Daten der Weltmatrix zum speichern?

Jedes Objekt in deiner Szene wird wahrscheinlich eine eigene Weltmatrix haben. Du müsstest nur diese 16 single-Werte speichern und laden.

Warum nutzt du eigentlich keine Modell-Dateien? Bei komplexeren Modellen wirst du um ein Modellierungsprogramm, wie z.B. Blender, nicht herumkommen. Dann müsstest du nur noch die Modelle laden und keine Vertexbuffer durchiterieren smile

MfGnietschow


Es gibt 10 Gruppen von Menschen - die die das Binärsystem verstehen und die anderen.  :-)
Vegetarier essen meinem Essen das Essen weg ;)
-------------------------------------------------------------------------------------------------------------------
Der Community-Hub für Videospiele: gameloop.io

Offline

 

#5 23.10.2011 11:53:14

Peter-Pascal
Member
Registriert: 26.02.2007
Beiträge: 63

Re: Speicher von Modellen

Erstmal vielen Dank für Deine ausführliche Antwort. Wieder bin ich ein Stück weiter gekommen. Allerdings ist es so, bei einer Antwort fallen mir prompt weitere Fragen ein.

Zitat:

mehrfach überall hinstellen kannst

Ich hoffe da jetzt nichts falsches verstanden zu haben: Einmal den VertexBuffer (SetStreamSource) zur Karte gesendet, kann ich dann mit Transformationen zb. eine Kugel vier oder fünf mal "kopieren"? Ich hätte jetzt den gleichen Vertexbuffer fünf mal gesendet.

Zitat:

Du solltest dir mal ein wenig zu Objektkoordinaten und Weltkoordinaten durchlesen, ich denke mal das ist genau das, worüber du sprichst.

Ist es und mache ich. Leider gibt es wenig Literatur darüber oder es ist einfacher als ich annehme. Bislang habe ich nichts gefunden was mir WorldMatirs(0..7) erläutert. Wozu die anderen da sind, habe ich nur gelesen für Überblendeffeckte.


Zitat:

Soweit ich das verstanden hab, baust du jetzt mit den Modellen eine fertige Szene und möchtest nun alle Modelle in Weltkoordinaten exportieren, damit du die fertige Szene später wieder laden kannst.
Vom Prinzip her ist das ja kein Problem, du müsstest nur die jeweiligen Objektmatrizen auf den jeweiligen Vertexbuffer anwenden und die transformierten Vertices speichern . Allerdings erzeugst du damit eine sehr statische Szene, welche du später nicht mehr verändern kannst und auch speicherineffizient ist. Falls du ein Modell mit 1000 Dreiecken 1000mal in der Szene hast, müsstest du 1 Mio Dreiecke speichern. Wenn du dir das Modell einmal in Objektkoordinaten speicherst und die 1000 Matrizen dazu, dann brauchst du viel weniger Platz.

so war es gedacht, leuchtet aber ein, dass es ineffizient ist.

Zitat:

Das wäre dann auch der übliche Weg: Jedes Modell was in deiner Szene vorkommt wird einmal in Objektkoordinaten gespeichert (ob nun auf der Platte oder in einer Datenbank ist dir überlassen smile ).
Deine Szene speicherst du dann, indem du zu jedem Objekt was du platziert hast speicherst:
- die Referenz auf das jeweilige Modell in Objektkoordinaten
- die Matrix mit der es in der Welt steht

Das kling gut. Ich habe es so verstanden: ich lade meine Modell, im einfachsten ein VertexBuffer, er hat am Anfang die Koordinaten (0,0,0) dann verschiebe ich das Modell z.B nach (15,20,30) speichere diese Daten und die veränderte Größe. Bekomme ich aus den beiden Transfomationen eine Matrix und ist das dann die Weltmatrix?

Zitat:

Warum nutzt du eigentlich keine Modell-Dateien? Bei komplexeren Modellen wirst du um ein Modellierungsprogramm, wie z.B. Blender, nicht herumkommen. Dann müsstest du nur noch die Modelle laden und keine Vertexbuffer durchiterieren smile

Doch ich möchte selber modellieren. Mein Programm kann bereits errechnete Geometrische Figuren erstellen und jeden einzelnen Vertex verändern. Für jeden VertexBuffer habe ich ein Object geschrieben, dass wiederum ein Object für Texturen enthält und für Material. Und durch Schalter kann ich alles Steuern. Ist natürlich noch rudimentär aber ich habs nicht eilig. Meine Überlegung ist, dass alle Objecte in der Natur auf geometrischen Formen zurückzuführen sind. Die muss ich dann nur noch anpassen, eigentlich. Tja, da wird wohl noch Zeit zu investieren sein.
Aber es macht Spaß. Und dann werden diese Modelle in einer Scene geladen. Wie gesagt bis dahin ist noch ein weiter weg. Leider kann ich mich nicht den ganzen Tag darum kümmern.

Gruß Peter


Heute ist nicht alle Tage – ich komm wieder, keine Frage

Offline

 

#6 24.10.2011 17:13:50

DragonFlyOfGold
ProMember
Ort: Berlin
Registriert: 09.11.2005
Beiträge: 139

Re: Speicher von Modellen

Zitat:

... kann ich dann mit Transformationen zb. eine Kugel vier oder fünf mal "kopieren"? Ich hätte jetzt den gleichen Vertexbuffer fünf mal gesendet.

Es gibt da eine Technik die heißt Hardware-Instancing, ist aber für den Anfang viel zu kompliziert und lohnt sich auch erst ab mehreren hunderten gleichen Modellen. Was ich damit meine ist eben, dass was du sagtest. Du kannst fünfmal den gleichen Vertexbuffer hinschicken. Wenn du die Modelle in Weltkoordinaten hättest, dann müsstest du fünf verschiedene Vertexbuffer haben.

Zitat:

Bislang habe ich nichts gefunden was mir WorldMatirs(0..7) erläutert. Wozu die anderen da sind, habe ich nur gelesen für Überblendeffeckte.

Genau mit Gewichten die du in die Vertices speicherst könntest du zwischen den verschiedenen Matrizen blenden, aber ich denke mal das brauchst du nicht. Für dich reicht es immer die 0te Weltmatrix zu setzen. Diese transformiert dann deine Vertices an die gewünschte Stelle in der Welt.


Zitat:

Leider gibt es wenig Literatur darüber

Schau dir mal das Buch "DirectX in Delphi" von Martin Pyka an (http://www.amazon.de/DirectX-9-Delphi-Martin-Pyka/dp/3833408359). Ich denke das wird dir viiel mehr helfen, als wenn du versuchst dir alles übers Internet und hier im Forum beizubringen bzw. beizubringen lassen. Da sind auch die ganzen Grundlagen drin, welche dir die meisten deiner bisherigen Fragen beantworten dürften smile

Offline

 

#7 24.10.2011 20:09:01

Peter-Pascal
Member
Registriert: 26.02.2007
Beiträge: 63

Re: Speicher von Modellen

Danke DragonFlyOfGold,

jedesmal komme ich ein Stück im Verständnis weiter.

Das Buch von Martin habe ich übrigens. Ohne wäre ich nicht ansatzweise so weit, das hätte ich gar nicht probiert oder irgendwann frustriert aufgegeben. Es sind sehr viele Themen gut erklärt und mit Beispielen versehen. Ich versuche nun daraus alles in einem Programm zusammenzusetzten. Nun da ich überhaupt kein Fan von Spielen bin, fehlt mir teilweise völlig die Vorstellung. Was mache ich dann bei der Spieleprogrammierung? Nun DirectX läßt sich schließlich für alle Arten der Animation einsetzen (Technik, reale Ereignisse, Geschichte). Und ich habe Spaß an den 3D-Möglichkeiten. Die Ergebnisse sind oft verblüffend und einfach faszinierend.

Vieles funktioniert bereits, bin selbst überrascht.


Gruß und nochmals Dank
Peter

Beitrag geändert von Peter-Pascal (24.10.2011 20:10:50)


Heute ist nicht alle Tage – ich komm wieder, keine Frage

Offline

 

#8 03.11.2011 09:07:09

Peter-Pascal
Member
Registriert: 26.02.2007
Beiträge: 63

Re: Speicher von Modellen

Sorry, ich glaube da habe ich an einer Stelle noch einen Knoten im Hirn.

Ich weiß nicht, wie ich an die Weltmatrix komme, um sie zu speichern:

Zitat:

Jedes Objekt in deiner Szene wird wahrscheinlich eine eigene Weltmatrix haben. Du müsstest nur diese 16 single-Werte speichern und laden.

Zitat:

Die Weltmatrix kann noch viel mehr beinhalten als die Position, so wie Drehung, Skalierung, usw.

Ich lade fertige Objekte (im Einfachsten nur ein Vertexbuffer) und möchte die in meine neue Welt einfügen durch zB.: D3DXMatrixScaling (Matrix,x,y,z). Mit SetTransform (D3DTS_WorldMatrix(0),Matrix) setzte ich die Matrix. Jetzt habe ich aber mehrere Matrizen, um mein Object in die neue Welt anzupassen. Muss ich jetzt jede Matrix speichern? Im Zweifel also jede pro Transaktion?

Ich sollte noch erwähnen, jede Transformation geht bei mir menügesteuert. Und nun sollen die Veränderungen gespeichert werden.

Gruß Peter


Heute ist nicht alle Tage – ich komm wieder, keine Frage

Offline

 

#9 03.11.2011 09:23:31

Gnietschow
ProMember
Ort: Berlin
Registriert: 20.06.2007
Beiträge: 237

Re: Speicher von Modellen

Ich vermute mal, dass du alle Objekte mit Matrizen skalierst, drehst und positionierst. Diese Matrizen wirst du dann aufmultiplizieren, um sie dann mit einem einzelnen SetTransform (D3DTS_WorldMatrix(0),Matrix) setzen zu können, damit dein Objekt an der geswünschten Position ist. Diese letzte Matrix beinhaltet durch die Multiplikation ja alle Transformationen und damit müsste das die einzige sein die du speicherst. Oder was meinst du mit Transaktion? Verschiebst du die Objekte an verschiedene Stellen und möchtest den Verlauf speichern?


Es gibt 10 Gruppen von Menschen - die die das Binärsystem verstehen und die anderen.  :-)
Vegetarier essen meinem Essen das Essen weg ;)
-------------------------------------------------------------------------------------------------------------------
Der Community-Hub für Videospiele: gameloop.io

Offline

 

#10 03.11.2011 10:17:20

Peter-Pascal
Member
Registriert: 26.02.2007
Beiträge: 63

Re: Speicher von Modellen

Transaktion war falsch, meinte Transformation. (verwechselt mit SAP-Befehl, bzw. Datenbank)

Habe ich Dich richtig verstanden:
Kann ich alle Matrizen, der Reihe nach mit D3DXMatrixMultiply (outMatrix,matrix1,Matrix2) multiplizieren und mir dann die letzte merken? Das wärs dann ja schon. So wird es dann ganz einfach. Beim positionieren des neuen Objects merke ich mir dann die Matrizen und multipliziere sie der Reihe nach und speichere die letzte ab. Wenn ich dann das Object wieder lade, gebe ich ganz einfach mit SetTransform die letzte Matrix an D3DX. So richtig? Das wäre einfach.

vielen dank Gnietschow


Heute ist nicht alle Tage – ich komm wieder, keine Frage

Offline

 

#11 03.11.2011 13:57:37

Gnietschow
ProMember
Ort: Berlin
Registriert: 20.06.2007
Beiträge: 237

Re: Speicher von Modellen

So müsste es gehen smile Du musst nur darauf aufpassen, dass Matrizenmultiplikation nicht kommutativ ist, also A*B <> B*A. Aber das wirst du schnell genug merken, wenns komisch aussieht wink


Es gibt 10 Gruppen von Menschen - die die das Binärsystem verstehen und die anderen.  :-)
Vegetarier essen meinem Essen das Essen weg ;)
-------------------------------------------------------------------------------------------------------------------
Der Community-Hub für Videospiele: gameloop.io

Offline

 

#12 03.11.2011 14:07:19

Peter-Pascal
Member
Registriert: 26.02.2007
Beiträge: 63

Re: Speicher von Modellen

Danke,

das werde ich merken, so bin ich halt bislang immer vorgegangen, ausprobieren. Aber jetzt habe ich eine klare Vorstellung, wie ich vorgehen muss. Im Einzelnen muss ich es noch ausarbeiten, bin bereits dabei.

Nochmals vielen Dank. Ohne die Hilfe würde ich trotz der vielen Bücher immer mal hängen bleiben.

Gruß Peter


Heute ist nicht alle Tage – ich komm wieder, keine Frage

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson