Specialfall mit max 20'000 Meshes



  • Hallo zusammen,

    Ich steh hier vor nem Problem. Ich hab die Aufgabe in einem 3D Raum zwischen 10 - 20000 Objekte darzustellen und diese auch noch logisch plazierbar.

    Ich habe bereits mehrere Methoden versucht und bin zu keinem Ergebnis gekommen welchesmir gefällt.

    Versucht habe ich es bis jetzt mit DirectX und C#. Hierbei hab ich bereits mehrere Meshes in einen Raum gesetzt. Ursprung dieser war entweder eine .x Datei oder ein primitiv type(Cylinder - welche ich später auch benötige). Bis dahin so weit so gut, wobei ich noch nicht weis wie er sich bei 20000 Meshes verhält. Das Problem jedoch besteht nachdem die Objekte gesetzt worden sind.

    Hier zu meinem grösten Problem. Wie kann ich per Maus-klick ein Mesh identifizieren ohne das ich eine Schleife erzeuge und mit einer ray auf 20000 meshes schiesse?

    und mein zweites Problem ist die Positionierung der Meshes. Muss ich das immer mit device.transform.world an den richtigen platz schieben? hat ein mesh keine eigenen Koordinaten?

    Hinzu kommt das ich mich noch nie tiefmit 3d programmierung beschäftigt habe, nur ein kleines Porjekt mit nem würfel....

    Ich hoff hier kann mir jemand helfen, Danke schonmal im voraus 🙂

    Gruss Trider


  • Mod

    d3d ist keine engine, die verwaltung von nicht fuers rendering notwendigen daten musst du selber uebernehmen oder eine engine benutzen.

    und ja, normalerweise muss man den transform pro objekt setzen, esseiden du verrechnest die transformation in die objekte.



  • Hier zu meinem grösten Problem. Wie kann ich per Maus-klick ein Mesh identifizieren ohne das ich eine Schleife erzeuge und mit einer ray auf 20000 meshes schiesse?

    Deile deinen Raum in bereiche auf darauf basierend die meshes als baum auf, nicht als liste für den ganze raum. Da gibts mehere ansätze, denke ein BSP-tree dürfte das machen was du willst. Oder womöglich reicht ein simpler octree ja auch schon (ist meist etwas weniger arbeit als ein BSP-tree 😉 ).

    http://www.iue.tuwien.ac.at/phd/sabelka/node34.html
    http://www.gamedev.net/reference/articles/article657.asp



  • Allgemein sind die beiden Antworten die ich bekommen hab sehr hilfreich, muss nur noch schaun wie ich das umgesetzt bekomm. Es wurde eine Engine angesprochen für grafikwerwaltung. Ich habe aber nur engines für spiele gefunden, die viel zu viel können. Ich muss das programm aber so performant und mit wenig speicherbedarf programmieren.

    Sollte ich dann eher einen Cylinder programmieren und den unter neuen Positionen immer neu zeichnen oder je cylinder ein objekt anlegen und die Position damit verrechnen, damit ich die Welt nicht immer drehen muss?

    Desweiteren gefällt mir die art der Kamera nicht. Ich will nicht die Welt drehen. Wenn das Programm fertig ist hat man nur 3 scrollleisten womit die objekte drehbar sind -> nur die kammera soll sich bewegen, den raum will ich auch unter performance gründen nicht drehen.

    Hier ist ein statischer ansatz von mir, aber irgendwie dreht er die welt nur wenn ich auf die Maus klick und nicht durchgehend. Der Code befindet sich wie auch bei dem Beispiel woher ich es habe in oder override OnPaint. wo liegt mein Fehler?

    camPos ist die aktuelle Position der Kamera als Vector3.

    Matrix m = new Matrix();
    m.RotateX(Geometry.DegreeToRadian(5));
    camPos.TransformCoordinate(m);
    device.Transform.View = Matrix.LookAtRH(camPos,
           new Vector3(0, 0, 0), new Vector3(0, 1, 0));
    

    rapso schrieb:

    esseiden du verrechnest die transformation in die objekte.

    wie kann ich die verrechnen? ich habe dazu nix im Internet gefunden. Hast du mir da nen kleinen Tip unter welchem befehl ich da nachschauen könnte?

    CMatt schrieb:

    denke ein BSP-tree dürfte das machen was du willst

    das mit dem Tree hört sich gut an, ich werd mich da mal schlau machen. Die Links von dir sind hilfreich, danke für den Hinweis.



  • Mach dir mal klar, wann WM_PAINT gesendet wird.



  • User-- schrieb:

    Mach dir mal klar, wann WM_PAINT gesendet wird.

    soweit ich weis bei jedem neu zeichnen befehl, oder sobald ein objekt des Raumes bearbeitet wurde. Genau da liegt aber mein Problem. Soll ich das mit nem Thread lösen der zeitgesteuert die Kameraposition neu zeichnet? dann bleibt aber noch ein zweites problem, die Kamera dreht sich meines erachtens nur von 0 - 90 Grad dann springt sie auf 180 und dreht bis 270 wieder. Dann springt sie wieder auf 0. Ich versteh das einfach nicht. FoV ist der Sichtwinkel und LookAtLH oder RH ist die art des koordinatensystems, von dem ausgegangen wird. Woher kommen aber diese sprünge?

    Weiterhin wurde gesagt das die Position des Meshes direkt in den Mesh hineingerechnet werden kann sodass ich die Welt nicht verschieben muss um den mesh zu plazieren. Ich habe keinen befehl in dieser richtung gefunden. Weis da jemand weiter?



  • Was ich dir beantworten kann: Threads solltest du nur verwenden, wenn du wirklich gut im Programmieren bist, da man eine Menge schwer zu findender Fehler machen kann.

    Die typische Schleife sieht immer so aus:

    while (true)
    {
      werte events aus
      aktualiere kameraposition/was sich durch die Events oder durch die Zeit geändert hat
      zeichne neu
    }
    

    Wenn du keinen guten Grund dazu hast, diese Reihenfolge zu ändern, halte dich daran.



  • ich muss auf das event onmousemove reagieren (später evtl auf einen scrollbalken von 0 - 360) und dann die distanz berechnen die die maus gefahren ist und die distanz mit einem Multiplikator die Rotation berechnen. Das ändert aber immer noch nix an dem problem das sich die kamera nur zwischen 0-90 Grad und 180-270 Grad bewegt. Der rest wird direkt übersprungen...


Anmelden zum Antworten