Klasse für Dreiecke?



  • Ist es sinvoll für ein 3D Spiel eine eigene Klasse für Dreiecke zu machen und jedes Dreieck als Objekt dieser klasse zu haben und dann damit größere Körper (Ein Haus, ein Auto etc) zusammenzusetzen?

    Oder ist es sinvoller nur größere Körper (Ein Haus, ein Auto etc) direkt anzulegen und die einzelnen Koordianten des Dreiecks z.B in einer Liste zu speichern?

    In eine Klasse Dreieck könnte man schön die Kollisionserkennung (z.B Dreick-Dreieck) einbauen. Und man hätte die drei Koordinaten schön zusammen.

    Allerdings würde man bei nem Haus Auto etc viele Koordianten doppelt speichern (weil ein Punkt der Eckpunkt mehrer Dreiecke ist) und die zusätzlichen aufrufe in der Klasse würden die Ausführungsgeschwindigkeit verringern.

    Ist eine Dreiecksklasse also sinnvoll oder nicht?



  • Kommt drauf an was du unter sinnvoll verstehst.
    Probiere doch selbst die beiden Möglichkeiten aus. Merkst dann selbst was besser geeignet ist.
    Einfach darüber zu philosophieren, bringt nicht viel. Weil die Realität ganz anders aussieht.



  • Kollisionserkennung auf Dreiecklevel ist für viele Dinge vielleicht schon übertrieben.

    Ich weiß nicht, was für ein Dateiformat du benutzen willst, oder ob du sogar selbst eins entwerfen möchtest, aber dafür kannst du dir dann eine Klasse anlegen.

    So könnte deine Klasse dann aussehen:

    class My3DObject {
    public:
       bool LoadFromFile(std::string path);
       void Release();
       void Render(float x, float y, float z);
    
    private:
       Vertex* vertices;
       int numVertices;
    
       Material* materials;
       int numMaterials;
    };
    


  • Hi,

    für das Rendern ist es überflüssig die Daten in einer Dreiecksstruktur zu halten. Aber für Kollisionsabfragen kann das unter Umständen sinnvoll sein. Wie bereits vom Vorposter erwähnt ist eine Dreiecks-genaue Abfrage zwar meistens nicht attratktiv, weil sie bei großen Modellen viel zu lange dauert und kaum mehr Informationen liefert als eine Bounding-Box Hierarchie für dasselbe Modell, aber trotzdem kann man in Spezialfällen solche Dreiecke gut gebrauchen.

    Sinnvoll wäre es aber ein Dreieck in der Art aufzubauen:

    class Triangle
    {
    public:
       Triangle();
       ~Triangle();
    
       SetIndices(uint i0, uinti1, uinti2) { m_i[0]=i0; m_i[1]=i1; m_i[2]=i2; }
       SetVertices(const Point3d *points) { m_Points=points; }
    
       const Points3d& GetPoint(uint i) { return m_Points[m_i[i]]; }
    
    private:
       const Point3d* m_pPoints;
       uint m_i[3];
    };
    

    Die Klasse Triangle erhält dann noch alle weiteren Methoden die man für seine Dreiecke braucht, beispielsweise Berechnung der Normalen, Kollisionsberechnungen usw. Der Vorteil hier ist, dass man wie beim Rendern die Dreiecke über Indices auf eine Vertexliste abbildet und keine redundanten Vertexdaten generieren muss.

    Ciao,
    Stefan


Anmelden zum Antworten