Transform.World (Mesh Position)



  • Hi,

    Ich habe eine Frage zum Positionieren eines Meshes.

    // Draw the tall building.
                device.Transform.World = Matrix.Translation(.75f, -0.2f, -2.0f);
                wallMeshes[0].DrawSubset(0);
    
                // Draw the medium-sized buildings.
                device.Transform.World = Matrix.Translation(-1.0f, -0.9f, 0.0f);
                wallMeshes[1].DrawSubset(0);
                device.Transform.World = Matrix.Translation(0.0f, -0.9f, 0.0f);
                wallMeshes[1].DrawSubset(0);
    

    Ok, erst Transform.World..., dann das Mesh das Positioniert werden soll.
    Ich seh da nur keinen Zusammenhang, woher weiß der welches Mesh, welche Position
    bekommen soll?

    Danke Schonmal


  • Mod

    irgendjemand muss es mal gesetzt haben, entweder
    - coder im code (so wie in deinem beispiel)
    - graphiker in nem 3d programm
    - physic-engine nach nem simulationsdurchlauf
    - spielelogic z.b. nen gegner oder ein gewehr oder...



  • Ja, ok. Was ich nur meine ist:

    Verstehen würd ich sowas wie ka, Mesh.Position(x,y,z).
    Oder:
    Device.Transform.World = Matrix.Translation(MeshName, x,y,z,);

    1. device.Transform.World = Matrix.Translation(x,y,z);
    2. mesh.DrawSubset();

    Scheint ja eine feste Struktur zu sein, die aber nicht wirklich ersichtlich
    ist. Das verwirrt ein wenig, ich wäre nie auf die Idee gekommen, dass man
    ein Mesh so verschiebt.

    Gut ich werd es einfach so nutzen, wirklich verstehen tu ich es aber nicht. 🙂


  • Mod

    adonis schrieb:

    Ja, ok. Was ich nur meine ist:

    Verstehen würd ich sowas wie ka, Mesh.Position(x,y,z).

    ja, so wuerde man es sicht ablegen, bzw eine kontrollstruktur drueber z.b. "Object" welche auf ein mesh referenziert und eine transformatrionsmatrix enthaelt.

    Scheint ja eine feste Struktur zu sein, die aber nicht wirklich ersichtlich
    ist. Das verwirrt ein wenig, ich wäre nie auf die Idee gekommen, dass man
    ein Mesh so verschiebt.

    ich denke in dem fall wird der transformationsmatrix des devices, also der graka, vor dem zeichnen die transformation uebergeben, mit dem das aktuelle objekt gezeichnet werden soll.



  • adonis schrieb:

    Ja, ok. Was ich nur meine ist:

    Verstehen würd ich sowas wie ka, Mesh.Position(x,y,z).
    Oder:
    Device.Transform.World = Matrix.Translation(MeshName, x,y,z,);

    1. device.Transform.World = Matrix.Translation(x,y,z);
    2. mesh.DrawSubset();

    Scheint ja eine feste Struktur zu sein, die aber nicht wirklich ersichtlich
    ist. Das verwirrt ein wenig, ich wäre nie auf die Idee gekommen, dass man
    ein Mesh so verschiebt.

    Gut ich werd es einfach so nutzen, wirklich verstehen tu ich es aber nicht. 🙂

    Du setzt einfach die Transformations Matrizen und dann werden alle Vertices des Meshes durch die Pipeline gejagt. Das Mesh ist einfach ein Container für Vertices und Materialien.
    Sowas wie
    Device.Transform.World = Matrix.Translation(MeshName, x,y,z,);
    würde doch gar keinen Sinn ergeben - eine Matrix hat nichts mit einem Mesh zu tun.



  • OK, sagen wir:

    mesh1=haus
    mesh2=gegner
    mesh3=player

    was weiß ich....

    woher weiß der, dass die Translationsmatrix zum, sagen wir, Haus gehört
    und nich zum Gegner, ich sag ihm doch nirgendwo, das mesh ist gemeint,
    für dieses Mesh gilt diese Matrix.

    Mit dieser Form kann man ja anscheinend vershiedene Meshes positionieren:

    1. device.Transform.World = Matrix.Translation(x,y,z);
    2. mesh1.DrawSubset();

    1. device.Transform.World = Matrix.Translation(x,y,z);
    2. mesh2.DrawSubset();

    etc...

    this->that schrieb:

    Device.Transform.World = Matrix.Translation(MeshName, x,y,z,);
    würde doch gar keinen Sinn ergeben - eine Matrix hat nichts mit einem Mesh zu tun.

    Wenn die nix miteinander zu tun haben, dürfte es ja keine Auswirkungen auf das
    Mesh haben, aber es verändert ja anscheinend die position des Meshes im Raum.

    Oder verstehe ich da irgendwas Falsch?

    1. device.Transform.World = Matrix.Translation(x,y,z);

    scheint ja zu gucken welches das nächste Mesh sein soll, welches
    Transformiert werden soll, an so eine Form hätte ich halt nicht gedacht,
    hab nen bischen suchen müssen um rauszufinden, dass man so Meshes positioniert.
    Ich fand es einfach nur etwas verwirrend, weil ich keinen Bezug gesehen hab,
    zwischen der Matrix und dem Mesh. Um viel mehr ging es eigendlich nicht.


  • Mod

    adonis schrieb:

    woher weiß der, dass die Translationsmatrix zum, sagen wir, Haus gehört
    und nich zum Gegner, ich sag ihm doch nirgendwo, das mesh ist gemeint,
    für dieses Mesh gilt diese Matrix.

    wozu sollte den das interessieren wem die matrix gehoert? er macht doch nur was du ihm sagst.

    1. device.Transform.World = Matrix.Translation(x,y,z);

    scheint ja zu gucken welches das nächste Mesh sein soll,

    nein, das macht es nicht. es ist ihm komplett egal. DU legst wert drauf. er macht nur was du ihm sagst.

    Ich fand es einfach nur etwas verwirrend, weil ich keinen Bezug gesehen hab,
    zwischen der Matrix und dem Mesh. Um viel mehr ging es eigendlich nicht.

    Kommt dabei heraus wenn jemand OOP um eine Statemaschine wickelt.

    um es mal in deinem slang zu schreiben, machst DU folgendes:

    Device, Nimm Diese matrix als Transformationsmatrix.
    Device, Zeichne dieses Mesh mittels deiner aktuellen Transformationsmatrix.
    

    entsprechend kannst du auch:

    1. device.Transform.World = Matrix.Translation(x,y,z);
    2. mesh1.DrawSubset(0); 
    3. mesh1.DrawSubset(1); 
    4. mesh1.DrawSubset(2); 
    5. mesh1.DrawSubset(3); 
    6. mesh1.DrawSubset(4);
    

    schreiben, oder selbst transformieren ala

    1. device.Transform.World = Matrix.Identity();
    2. mesh1.Transform(Matrix.Translation(x,y,z));
    2. mesh1.Draw();
    

    btw. das ist alles pseudocode und muss deiner API nicht entsprechen.



  • Die Pipeline und DX arbeiten State-basierend, dass heißt zu jedem Zeitpunkt befindet sich die Pipeline in EINEM Zustand.

    Mit "nichts miteinander zu tun haben" meinte ich natürlich konzeptionell nichts mit einander zu tun haben. Eine Matrix ist einfach ein mathematisches Konzept und hat mal prinzipiell nichts mit einem Mesh zu tun. Die Matrix wird viel mehr benutzt, um bestimmte Transformationen auf die Vertices des Meshes elegant auszuführen.

    adonis schrieb:

    1. device.Transform.World = Matrix.Translation(x,y,z);

    scheint ja zu gucken welches das nächste Mesh sein soll, welches
    Transformiert werden soll, an so eine Form hätte ich halt nicht gedacht,

    Da wird nix geguckt;) Es wird einfach die World Matrix der Pipeline auf eine bestimmte Matrix gesetzt. Alle eingehenden Vertices werden jetzt so lange mit dieser Matrix transformiert, bis du eine neue setzt.

    Konzeptionell wird das Rendern eines Meshes also einfach das sein:
    1. Setze Transformationsmatrizen
    2. Mesh.Draw, was intern wohl nichts anderes machen wird als a) Index- und VertexBuffer setzen, Rasterizer/DepthStencil/Render States etc. setzen, Materialien setzen (bzw. bei der Programmable Pipeline die Technique) und am Ende device->render() aufrufen, dass dann die Vertices aus dem gesetzten VB rendern.

    Wie gesagt, es ist überhaupt nicht verwirrend, wenn du dir die Pipeline als einen riesigen State vorstellst.



  • Ok, danke euch Zwei.

    Also wie es sich anhört sollte, ich auf alle Fälle mir mal die
    Render Pipeline ganz genau angucken, nen Buch zum Thema linearer Algebra wäre
    auch nicht verkehrt oder?

    Wenn ich es richtig verstanden hab, macht die Matix nur ein Abbild,
    des Urbild, oder wie man es nennt.

    (Matrix Trans/Rot ect)*(Vertices aus dem Mesh(Urbild)) = Abbild

    So ungefär.

    rapso schrieb:

    um es mal in deinem slang zu schreiben, machst DU folgendes:

    Habe ich einen so schlimmen Slang?



  • Naja, so grob siehst du das schon richtig, nur formal mehr als schwammig;)
    Das Bild einer Abbildung f:A->B ist die Menge, die die Abbildungen aller Elemente aus A enthält, also {f(a); a Element A} und das Urbild einer Teilmenge M von B ist die Menge aller Elemente aus A, deren Bilder in M liegen, also {a Element A; f(a) Element M}.

    In deiner Schreibweise würde das also heißen, dass ein Vertex v aus A durch die Transformation f auf das Bild f(v) abgebildet wird.

    Aber der richtige Grund warum Matrizen so cool sind: Die wichtigsten Transformationen sind lineare Abbildungen und zu jeder Abbildung lässt sich eine Matrix finden (etwas formaler: Es gibt eine Bijektion zwischen der Menge aller Matrizen M(m x n,K) und der Menge der linearen Abbildungen f:K^n -> K^m)
    Dadurch kannst du die Komposition von linearen Abbildungen (zb 30 Rotationen, dann 2 Translationen und dann nach 100 Skalierungen) dank Matrixmultiplikation in einer einzigen Matrix M beschreiben und das Bild f(v) des Vertex v einfach bekommen durch: v' = v*M



  • Leider wird Vektor/Matrizen Rechnen im Abi nich mehr gelehrt, in Physik
    nicht, in Mathe auch nicht , was ich nicht wirklich Verstanden habe.

    Finde das sehr interessant und versuche es mit selbst ein wenig bei zu Bringen.

    Das Lösen von linaeren Gleichungen fand ich auch sehr faszinierend,
    in Matrix*Vector umschreiben und mit dem Gauss Algorythmus auflösen.

    Aber leider Findet es man sinvoller, von 3 Jahren Abi 2 Jahre nur Analysis zu
    machen. 😞


Anmelden zum Antworten