Wie kann ich mehrere Meshes laden?



  • Hallo

    Ich bin daran einen Engine-Editor zu programmieren. Doch nun bin ich dran am programmieren mit dem Laden der Objekte. Ich will, dass wenn man auf den Menu-Button Sphere klickt eine Kugel gerendert wird. Das habe ich auch geschafft. Doch nun die Frage, wenn ich nochmals draufklicken will, sollte nochmals eine Kugel gerendert werden, also eine zweite. Dann immer weiter, also ich will das ich unendlich viele Kugeln reinladen kann. Doch ich weiss nicht wie. Ich habe angefangen mit einem Index. Immer wenn ich auf den Button Sphere klicke, dann wird der Index um eins erhöht. Und dann prüfe ich in der Render-Funktion, wo der Index steht. Ich prüfe mit der if-Anweisung. Doch wenn ich das immer überprüfe ist das eine sehr aufwendige Lösung.

    Kann mir jemand einen besseren Weg zeigen, wie ich Meshes beliebig viel rendern kann? Oder kennt jemand ein Tutorial über dieses Thema?

    Gruss Patrick



  • Geht es dir nun speziell darum eine Kugel zu rendern oder mehrere Kugeln nebeneinander zu rendern?

    Ahja: Was für ein Index!?



  • Also mir geht es darum mehrere Kugeln zu rendern. Aber nicht auf einmal. Das könnte ich problemlos. Ich will die Kugel dann rendern wenn ich auf den Menü-Button Sphere klicke rendern. Und jedes mal wenn man drauf klickt, kommt wieder eine Kugel. Doch ich habe mühe mit dem programmieren, wenn ich mehrmals auf den Sphere-Button klicke.

    Ich will es so wie hier machen, dass ich beliebig viele Objekte rendern kann.

    http://www.youtube.com/watch?v=4NNDaf9tTkE

    Ich habe einen Index gemacht, also eine Variable, die immer um eins erhöht wird, wenn man auf den Sphere-Button klickt.



  • Bin mir nicht ganz sicher, was Du genau willst, aber vielleicht kann ich ja helfen...

    Du könntest Dir eine Klasse KugelObjekt erstellen, die einen Zeiger auf einen Mesh (die Kugel) und einen Index beinhaltet. Der Zeiger auf die Kugel ist "statisch", die Kugel muss ja nur einmal im Speicher vorliegen. Wenn Du nun auf Deinen Button klickst, wird ein neues Objekt von der Klasse KugelObjekt erstellt, der Index hochgezählt und im neuen Objekt der KugelObjekt Klasse gespeichert. Außerdem speicherst Du einen Zeiger auf Dein Objekt in einem std::vector.
    Beim Rendern gehst Du nun in einer Schleife über jeden Eintrag und zeichnest dann halt so viele Kugeln, wie im std::vector gespeichert sind.

    ..allerdings rate ich Dir zu ein paar kleineren Übungen bevor Du Dich an Projekte dieser größe wagst - wenn Du nicht einmal mit diesem Problemchen fertig wirst... 😉



  • Hallo

    Ich habe nun mich mit dem Thema vectoren auseinandergesetzt. Doch nun, ich weiss nicht genau wie ich das programmieren soll, was iop geschrieben hat. Könntest du vielleicht ein kleines Codebeispiel zeigen, wie du das meinst?

    Gruss Patrick



  • He

    hm, mal schaun ob Dir folgendes hilft.. wie Du siehst, es ist nur ein Ansatz (übrigens kompilierbar) - wie Du alles verpackst, sortierst und designst musst Du Dir selbst überlegen. Einige Sachen wie zB den Meshzeiger und was dazu gehört habe ich auskommentiert, das wäre erstens zu viel Code gewesen für das Beispiel und zweitens musst Du wie gesagt selber wissen, ob und wie Du Deine Zeiger verpackst...

    #include <iostream>
    #include <vector>
    
    class meineKugel
    {
    	public:
    		//Konstruktor, sollte natürlich auch einen Zeiger auf Deinen Mesh übergeben bekommen
    		//Ob der jetzt in eine Klasse eingepackt ist oder nicht... das musst Du dann
    		//selbst "designen" :)
    		meineKugel(int _index){index = _index;};
    		void drawMe(){std::cout << index << std::endl;}
    
    	private:
    		int index;
    		//mesh *zeigerAufMesh;
    
    		//dann noch zB
    		//matrix translateMat;
    		//matrix rotateMat;
    		//matrix scaleMat;
    		//matrix comleteMat;
    };
    
    int main()
    {
    	//Der Zähler
    	int index = 0;
    
    	//Hier der Vector
    	std::vector<meineKugel *> vec;
    
    	//Das passiert jedesmal wenn auf den Knopf gedrückt wurde
    	vec.push_back(new meineKugel(index/*, und natürlich der Zeiger auf den Mesh*/));
    	index++;
    
    	//Das "rendern", hier zur Ansicht nur ne Standardausgabe..
    	size_t len = vec.size();
    	for(size_t i = 0; i < len; i++)
    		vec[0]->drawMe();
    
    	std::cin.get();
    
    	return 0;
    }
    

    Spass haben 🙂



  • Warum speicherst du Zeiger in dem Vektor? So hast du nämlich das Löschen der Kugel vergessen.



  • warum sollte man zeiger nicht in einem Vector speichern? Zum verwalten mehrerer Objekte is das doch i.o.

    Nur wie heißt es so schön, "Wo ein Zeiger ist, ist hoffentlich auch ein Destruktor." Oder so ähnlich, habs vergessen.

    Also natürlich sollten die Zeiger am Ende wieder aufgeräumt werden, aber darum gehts ja in dem Post nicht hauptsächlich, das sollte man auch so wissen, wenn man mit Zeigern hantiert.

    size_t len = vec.size();
        for(size_t i = 0; i < len; i++)
            SAFE_DELETE(vec[i]);
    

    Dann musst Du in deinem Klassen objekt, im Destruktor, nur noch die Meshes und anderen kram freigeben.



  • KPC schrieb:

    Warum speicherst du Zeiger in dem Vektor? So hast du nämlich das Löschen der Kugel vergessen.

    el_presidente schrieb:

    darum gehts ja in dem Post nicht hauptsächlich, das sollte man auch so wissen, wenn man mit Zeigern hantiert.

    Ich dachte mir nur, dass Eglifisch1 das schon selbst merken müsste, wenn er die Sprache lernen will... das und noch einiges mehr, was auch nicht in meinem Post steht.



  • jo, da stimme ich Dir voll zu. Also man sollte wenigstens Grundkenntnisse in der Nutzung von Klassen haben.

    Das is richtig. Wollte deinen Beitrag nur ergänzen ^^



  • Naja wenn ich einem Anfänger einen kurzen Beispielcode zeige, dann sollte der doch wenigstens korrekt sein. Die zwei Zeilen mehr hätten sicherlich nicht geschadet und es besteht nicht die Gefahr, dass jemand denkt man kann auf deletes verzichten, weil das Betriebssystem wird schon aufräumen.
    Hätte der TE Ahnung von Klassen/Programmierung im Allgemeinen, dann gäb es jetzt sicherlich nicht diesen Thread.



  • Ich würde mal behaupten, dass ich kein Anfänger bin in C++. Ich habe meistens nur das Problem mit dem Umsetzen. Also mir fehlt eher die Erfahrung.


  • Mod

    Eglifisch1 schrieb:

    Ich würde mal behaupten, dass ich kein Anfänger bin in C++. Ich habe meistens nur das Problem mit dem Umsetzen. Also mir fehlt eher die Erfahrung.

    erfahrung macht aus einem anfaenger einen profi 😉
    deine probleme klingen fuer mich irgendwie garnicht wirklich graphik bezogen, sondern der mangel an grundlegenem wissen, sodass sogar deine anfangsfrage nur erahnen laesst worauf du hinaus willst.
    es waere also vielleicht von vorteil fuer dich, wenn du erstmal mit der sprache umgehen lernst anhand von einfachereren herausforderungen.

    ich wuerde das hier fast schon in den c++ bereich unseres forums verschieben.


Log in to reply