DirectX: Modelle bzw. Objekte in der Welt platzieren

  • Allgemein

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Arby.

    DirectX: Modelle bzw. Objekte in der Welt platzieren

    Ich hab ja schon angedeutet, dass ich mich nun ein bisschen mit DirectX (bzw. in erster Linie Direct3D) auseinandersetzen möchte. Ich möchte mich dabei gerne auf DirectX 9 beschränken, da es mir vorerst nicht um größte Effizienz, Portabilität (XBox, Smartphones, etc.) und solche Dinge geht, sondern ich einfach eine kleine nicht-Resourcen-Hungrige Anwendung zum Ziel habe, die möglichst auch auf betagteren Rechnern, die noch kein DirectX 10 oder höher unterstützen, lauffähig sein soll.

    Ich habe jetzt die vergangenen 48 Stunden intensiv damit zugebracht, Tutorials zu finden und zu lesen, nachzubauen, dazu das DirectX SDK von Microsoft und SharpDX 2.5.0 installiert und hauptsächlich mit dem Beispiel "MiniCube" herumgespielt, z.B. Form und Farbe verändert, die zeitabhängige Rotation in eine statische Rotation geändert, die durch Mausbewegungen des Benutzers beeinflusst werden kann, die Ausgabe nicht in eine Form sondern ein Control (hier: Panel) vorgenommen, und weitere solcher "Kleinigkeiten".

    Soweit ich aber insbesondere das MiniCube-Beispiel und die meisten Einsteiger-Tutorials verstehe, wird hier ein Objekt mit seinen Koordinaten in Form eines VertexBuffers erzeugt und die Darstellung wird rotiert, indem einfach die "gesamte Welt" (durch Anwenden der entsprechenden Transformation) rotiert wird.

    Mein nächster Schritt sollte es sein, mehr als ein Objekt darzustellen. Für den Anfang also zum Beispiel zwei Würfel, die ruhig zunächst identisches Aussehen haben können. Doch genau da komme ich nicht weiter. Mir fehlt irgendwie der Schritt von "ein Objekt" zu "ein oder mehrere Objekte in einer Welt". Insbesondere möchte ich ja auch Kontrolle über jedes einzelne Objekt in dieser Welt haben, d.h. jedes Objekt (also zunächst jeden der beiden identischen Würfel) separat an eine bestimmte Position veschieben (Translation) und dort ausrichten (Rotation).

    Ein späterer Schritt soll z.B. sein, Objekte mit identischer Form mit unterschiedlichen Farben und/oder Texturen zu versehen, aber das nur als Zusatzinfo für den Fall, dass das ggf. schon Einfluss darauf haben kann, wie ich nun weiter vorgehen kann.

    Sind Vertices und VertexBuffer überhaupt geeignet um einzelne Objekte zu modellieren? Oder gibt es für platzierbare Objekte eigene Klassen, mit deren Hilfe ich nur noch Welt-Position und Rotation (und ggf. Skalierung - die ich nicht unbedingt bräuchte) des Objekts festzulegen bräuchte?
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Welt transformieren
    VertexBuffer zeichnen
    Welt anders transformieren
    VertexBuffer nochmal zeichnen

    und schon hast ein und dasselbe Objekt an ner anderen Position/anders rotiert.

    Unterschiedliche Texturen->Textur einfach vorm Rendern auswechseln...
    Unterschiedliche Farben jenachdem: für einzelne vertices: neuer VB oder eine Möglichkeit diese zu speichern(Textur) und mit einem Shader zeichnen. Gesamtes Objekt einfärben, bzw. einzelne SubMeshes(=mehrere VertexBuffer), mit Shadern oder über DirectX eingebautem Lightning...
    Unterschiedliche Formen->Unterschiedliche VertexBuffer

    Einfachere Möglichkeit Objekte aufzubauen: Meshes-> verwenden intern einen VertexBuffer...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Zugegeben, sehr stichpunktartig... Ich werd mich da mal durchwuseln und mich zunächst auf Meshes stürzen, das hört sich am ehesten nach dem an was ich suche.

    Aber... kann es sein, dass Meshes in SharpDX nur über das Toolkit zur Verfügung stehen und das SharpDX-Toolkit aber ausschließlich für DirectX 11 zur Verfügung steht? Das wäre blöd, da ich ja bei DirectX 9 bleiben will.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Ja, da scheine ich durcheinander gekommen zu sein. Allerdings stell ich mich grad scheinbar wirklich blöde an. Was aber zum Teil auch an der katastrophalen Dokumentation von SharpDX liegt.

    Wo krieg ich denn nun ein Mesh her?

    To obtain the SharpDX.Direct3D9.Mesh interface, call either the SharpDX.Direct3D9.D3DX9.CreateMesh(System.Int32,System.Int32,System.Int32,SharpDX.Direct3D9.VertexElement,SharpDX.Direct3D9.Device,SharpDX.Direct3D9.Mesh@) or SharpDX.Direct3D9.D3DX9.CreateMeshFVF(System.Int32,System.Int32,System.Int32,SharpDX.Direct3D9.VertexFormat,SharpDX.Direct3D9.Device,SharpDX.Direct3D9.Mesh@) function.

    Alles gut und schön, aber SharpDX.Direct3D9.D3DX9 gibt es scheinbar gar nicht. Überhaupt finde ich nirgends eine Funktion CreateMesh (eingebundene Verweise SharpDX, SharpDX.Direct3D9, SharpDX.Toolkit, selbst SharpDX.D3DCompiler und SharpDX.DXGI habe ich probeweise noch mit in die Verweise aufgenommen.

    jvbsl schrieb:

    Unterschiedliche Texturen->Textur einfach vorm Rendern auswechseln...
    Unterschiedliche Farben jenachdem: für einzelne vertices: neuer VB oder eine Möglichkeit diese zu speichern(Textur) und mit einem Shader zeichnen. Gesamtes Objekt einfärben, bzw. einzelne SubMeshes(=mehrere VertexBuffer), mit Shadern oder über DirectX eingebautem Lightning...
    Unterschiedliche Formen->Unterschiedliche VertexBuffer

    Nur damit ich weiß dass ich die richtige Richtung einschlage: Ich möchte stilisierte Fahrzeuge darstellen, ähnlich einem Autoscooter. Es sollen mehrere davon dargestellt werden, aber es können alle identisch aussehen (möglichst mit Textur - das wird spannend ;)). In den Fahrzeugen sollen Figuren "sitzen", auch diese brauchen zunächst nur stilisiert dargestellt zu werden, ähnlich einem Brettspielpöppel. Die Formen sind auch hier immer gleich, jedoch sollen die Farben variieren. Es kann bis zu 8 verschiedenfarbige Figuren geben (evtl. auch irgendwann mehr).
    Ich würde also zwei VertexBuffer erzeugen, je einen für Fahrzeug und Figur, und bei dem für die Figur je Darstellung jeweils die Farbinformationen ändern.
    Wenn ich das richtig verstehe, kann ich entweder für jede Farbe einen eigenen Buffer erzeugen und in der Render-Methode auf den entsprechenden Buffer wechseln, oder ich nehme nur einen Buffer für die Figur und änder in der Render-Methode jeweils für jede Darstellung die Farbe.
    Die Modelle selbst werden voraussichtlich so modelliert sein, dass ihrer Körper sich in der Darstellung schneiden, aber das sollte kein Problem sein, zumindest technisch?
    Zusätzlich vereinfachend käme hinzu, dass das ganze auf einer ebenen Fläche stattfindet, die zudem nur von schräg oben betrachtet wird, d.h. die Welt (bzw. die Sicht darauf) wird nur um Y rotiert, gezoomt, ggf. in kleinen Grenzen verschoben und mit viel gutem Willen vielleicht noch im Bereich 30-60° gekippt.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Arby“ ()

    Arby schrieb:

    Wenn ich das richtig verstehe, kann ich entweder für jede Farbe einen eigenen Buffer erzeugen und in der Render-Methode auf den entsprechenden Buffer wechseln, oder ich nehme nur einen Buffer für die Figur und änder in der Render-Methode jeweils für jede Darstellung die Farbe.

    Nein, da du die Farbe des gesamten Objekts austauschen willst, bleibt der Buffer derselbe, dann musst du aber mit Lightning, oder Shadern arbeiten.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hallo

    ich wollte mich eigentlich schon vor 4 Monaten mit der Grafikprogrammierung im 3D-Raum auseinandersetzen. (Mir ist etwas dazwischengekommen :D)
    Damals habe ich mir auch überlegt, dass ich SharpDX verwende. Mir wurde aber als Programmiersprache C# empfohlen.
    Die Programmiersprache ist mir aber jetzt mal egal.

    Bevor ich jetzt anfange wie wild zu googlen wollte ich dich einfach mal fragen, ob du irgendwelche Ratschläge an mich hast, die ich unbedingt beachten soll? 8o
    Du scheinst ja den Einstieg geschafft zu haben. :thumbup:

    Schonmal größten Dank im voraus.

    EDIT:
    Sollte man so etwas eher per Private Nachricht schreiben?

    phil schrieb:

    Du scheinst ja den Einstieg geschafft zu haben. :thumbup:

    Nicht wirklich. Meine bisherigen "Erfolge" beschränken sich zunächst auf die Modifikation eines Beispiels, das mit SharpDX installiert wird.

    Mir fehlen leider immer noch sehr viele Grundlagen, mir ist das Prinzip, das hinter Direct3D steckt, immer noch nicht ganz klar. Wenn von Pipelines, SwapChains und Co. geredet wird, verstehe ich nur Bahnhof. Leider bin ich auf der Suche nach geeigneter Literatur noch immer nicht recht fündig geworden, ich bekomme die Tage aber mal leihweise ein Buch (noch keine Ahnung, welches) - mal sehen ob das etwas meinen Schleier lüften kann...

    Nachtrag:
    Okay, ich hab jetzt schon einen guten Teil des Tutorials auf riemers.net/eng/Tutorials/DirectX/Csharp/series1.php durchgearbeitet und bin einiges schlauer. Allerdings muss ich dazu sagen, dass das Tutorial einige unschöne Fehler hat, aber zum Glück hab ich bereits einige andere Tutorials gelesen, die zwar nicht so in die Tiefe gingen, aber von der Codestruktur her wesentlich durchdachter (und für mich angenehmer) waren, so dass ich - zum Teil auch um mit der Materie vertrauter zu werden - da ein paar Modifikationen vornehmen konnte.

    Insbesondere hat es mittlerweile "Klick" gemacht, was die Positionierung mehrerer Objekte angeht, weil mir jetzt endlich klar geworden ist, was es mit Projection, View und World auf sich hat.

    Auch wenn ich diese Schritte jetzt doch erstmal mit Framework 2.0 und dem Microsoft-DirectX durchgeführt habe, markier ich mein Anliegen in diesem Thread erstmal als "erledigt", ich denke, dass eine spätere Umarbeitung auf SharpDX wesentlich einfacher von der Hand gehen sollte.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Arby“ ()