Abstrakte vektoren :D



  • Azrael, il Meraz schrieb:

    @ keine Ahnung von C++: 😡 😡 😡 grrrrrrrr..... wenn ich "keine" Ahnung hätte, wüsste ich nicht was ne variable ist, geschweige denn eine abstrakte klasse. Mein Wissen ist beschränkt und ausbaufähig, aber gleich "keine Ahnung" ist echt erniedrigend 😞

    Haha. Naja. Keine Ahnung von C++ zu haben ist keine Schande, niemand kommt auf die Welt und hat automatisch eine Ahnung von C++. Dies bestätigt zu bekommen ist keine Schande, und schon gar kein Grund mit "😡" zu reagieren! (Btw, du hast keine Ahnung von abstrakten Klassen.)



  • geh mir weg mit deinem Provokativen OT...
    Ich will Hilfe zu Mathematikimplementierung in einer Selbstgeschriebenen 3D-Engine. Und keine kritik meiner programmierfähigkeiten.



  • Azrael, il Meraz schrieb:

    rapso schrieb:

    eine simple klasse nicht compiliert zu bekommen, grundsaetzliche designentscheidungen und c++ grundlagen sind nicht ganz das thema dieses unterforums.

    Einspruch -meine eigentliche Frage war, Wie ich die Mathematik in einer 3D-Engine implementieren sollte, was mit dem Thema der Spiele-/Grafikprogrammierung zu tun hat. Dass die leute mich zum Abdriften bewegen, indem sie mir meine Unfähigkeit zu beweisen versuchen, war nicht einkalkuliert.

    naja, du willst ueber designentscheidungen reden ohne die grundlagen zu verstehen. klar reden wir mit dir gerne darueber wie man ein haus baut, nur sagst du, dass saegen nutzlose werkzeuge sind weil du dich damit geschnitten hast.

    nichts fuer ungut. aber dir wird engine programmieren weit mehr spass machen wenn du deine c++ faehigkeiten ausbaust. sieh es nicht so sehr als 'du hast keine ahnung von c++', als viel mehr 'du hast wenig _erfahrung_ mit c++ und noch sooooviel wissen dass du dir aneignen kannst' 😉

    und ich hab den thread verschoeben, weil hier probleme sind, die weit vor dem schreiben einer engine geloest sein muessten. hier in c++ kann man dir vielleicht eher helfen, nicht jeder schaut sich alle unterforen an 😉

    und wenn du wirklich darauf bestehst wissen zu wollen wie man's richtig macht, schau dir mal ne open source engine an. so schlecht sind die garnicht 😉



  • *Cognitive dissonance is my friend.

    I care neither for Dunning nor Kruger.

    Also, what cognitive dissonance?

    Oh, the humanity!*

    (Sorry, I'll stop laughing now.)

    🙂



  • Sagt mal, wieso krieg ich eigentlich gesagt, ich würde die grundlagen von C++ nicht verstehen - nur weil ich versucht habe, eine Abstrakte Klasse als Rückgabewert zu verwenden? finix, wenn du schon so freundlich bist, mir zu sagen, ich hab keine ahnung, dann sag mir doch bitte, was ich denn in C++ beherrschen lernen soll...



  • Azrael, il Meraz schrieb:

    Sagt mal, wieso krieg ich eigentlich gesagt, ich würde die grundlagen von C++ nicht verstehen - nur weil ich versucht habe, eine Abstrakte Klasse als Rückgabewert zu verwenden? finix, wenn du schon so freundlich bist, mir zu sagen, ich hab keine ahnung, dann sag mir doch bitte, was ich denn in C++ beherrschen lernen soll...

    Es gibt nicht viele wesentlich schwierigere Dinge als ne eigene Grafikengine zu schreiben. Du brauchst zuallererst Erfahrung. Solche Fehler wie du sie machst, sollten nicht mehr als Tippfehler sein. Auch solltest du umfassende Kenntnisse im Software design haben(und demzufolge schon einige kleinere Projekte fertiggestellt haben), denn sonst wirst du dich zich mal mit Situationen rumschlagen müssen, in denen du merkst, dass irgendwas nicht so wirklich zusammenpasst, und du dann endlose Mengen Code umfrickeln musst(wodurch das Ergebnis auch nicht mehr besser wird).
    Templates sind auch keine schlechte Anlaufstelle, denn vieles ist mit templates einfacher zu handhaben als mit abstrakten Basisklassen, man muss nur wissen, wie.
    Auch solltest du schon Erfahrungen mit fortgeschrittenen Techniken haben(das experimentieren mit boost hilft da viel weiter), und du solltest mehr als nur die Grundlagen von Exceptions kennen(wie schreibt man exception sicheren Code?).



  • thanx.
    Dass mir Erfahrung fehlt weiß ich und möchtegerne etwas dagegen unternemen xD.
    Danke für die Tipps, Die boost libraries schaue ich mir mal genau an. Hast du auch gute links zum Thema Exceptions? Würde mich freuen.



  • finix schrieb:

    Mir ist klar dass ich den Betroffenen (und sonstigen Beiwohnenden) oftmals oder gar überwiegend nicht hilfreich erscheine. In Momenten wie diesem eher arrogant und fies, nicht wahr? Ätzend und kontraproduktiv? Das liegt an dir allein.

    Einspruch. Es liegt an dir, da du offenbar arrogant BIST.
    Deine nervigen Schachtelsätze, dein grauenhaftes Denglisch, deine peinlichen Zitate. All das wird ihm absolut nichts bringen und dient wohl eh nur deiner Profilierung. Sicher, dieses Posting hier wird ihm auch nix bringen, aber das musste mal gesagt werden.

    finix schrieb:

    Aber ich habe recht.

    🙄



  • Ich hab für dich mal was zusammengebastelt was man als 3D Vektor Klasse verwenden kann.

    #include <math.h>
    
    #pragma once
    
    class Vektor3D
    {
    public:					
        float x,y,z;
    public:
    	Vektor3D(const float x_,const float y_,const float z_): x(x_), y(y_), z(z_){};
    
    	Vektor3D():x(0),y(0),z(0) {};
    
    	Vektor3D(const Vektor3D& v): x(v.x), y(v.y), z(v.z) {} 
    
    	~Vektor3D(void){}
    
    	inline void set_Vektor(const float x_,const float y_,const float z_) {x=x_; y=y_; z=z_;}
    	inline const Vektor3D& operator =  (const Vektor3D& v)	{x = v.x; y = v.y; z = v.z; return *this;}
    	inline const Vektor3D& operator += (const Vektor3D& v)	{x += v.x; y += v.y; z += v.z; return *this;}
    	inline const Vektor3D& operator -= (const Vektor3D& v)	{x -= v.x; y -= v.y; z -= v.z; return *this;}
    	inline const Vektor3D& operator *= (const float f)		{x *= f; y *= f; z *= f; return *this;}
    	inline const Vektor3D& operator /= (const float f)		{if (f==0){throw "Division durch 0, class Vektor3D operator /= float";} 
                                                                   else {x /= f; y /= f; z /= f; return *this;}}
    	inline void Vektor3D::normalisiere() {float laenge_Kehrwert =1 / Vektor3D::laenge(); x*=laenge_Kehrwert; y*=laenge_Kehrwert; z*=laenge_Kehrwert;}
    	inline const float Vektor3D::laenge() {return sqrt(x*x + y*y + z*z);}
    	inline const float Vektor3D::nicht_Wurzel_laenge() {return (x*x + y*y + z*z);}
    
    };
    
    inline bool operator == (const Vektor3D& a, const Vektor3D& b)		{if(a.x != b.x) return false; if(a.y != b.y) return false; return a.z == b.z;}
    inline bool operator != (const Vektor3D& a, const Vektor3D& b)		{if(a.x != b.x) return true; if(a.y != b.y) return true; return a.z != b.z;}
    inline Vektor3D operator + (const Vektor3D& a,const Vektor3D& b)	{return Vektor3D(a) += b;}
    inline Vektor3D operator - (const Vektor3D& a,const Vektor3D& b)	{return Vektor3D(a) -= b;}
    inline Vektor3D operator - (const Vektor3D& a)					    {return Vektor3D(-a.x, -a.y, -a.z );}
    inline Vektor3D operator * (const Vektor3D& a, const float f)		{return Vektor3D(a)*=f;}
    inline Vektor3D operator * (const float f, const Vektor3D& a)		{return Vektor3D(a)*=f;}
    inline Vektor3D operator / (const Vektor3D& a, const float f)		{return Vektor3D(a)/f;}
    
    inline float skalarprodukt(const Vektor3D &v1,const Vektor3D &v2)
    {
    	return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z;
    }
    
    inline	Vektor3D kreuzprodukt(const Vektor3D& a,const Vektor3D& b) {return Vektor3D(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);}
    


  • Azrael, il Meraz schrieb:

    Danke bisher.
    Dass virtuelle vektoren ne schlechte Idee ist, hab ich mittlerweile bemerkt :p .
    Nun - Ihr gebt mir folgendes zum Auswählen:

    1. fertige Engine nutzen
    2. Schlechte Idee: Virtuelle Vektoren (pointer als rückgabe)

    Es wäre schön, ein paar mehr vorschläge zum thema "eigene engine" zu hören. Oder ist es mittlerweile so tabu, bei einer Engine anzufangen, dass ich es besser vergessen soll? 🙄

    Ich glaube ein Weg, der Lösung Deines Problems näher zu kommen, wäre: trenne zunächst den mathematischen Teil von einer plattform-unabhängigen API einer 3D-engine.

    Den mathematischen Teil kannst Du selbst schreiben oder auch nicht. Er sollte völlig unabhängig von der engine-API sein, und daher benötigt man dort auch keine abstrakten Basisklassen mit plattformabhängigen Implementierungen.
    So könnte z.B. eine Vektor-Klasse aussehen und der Hinweis auf das Paket Lineare Algebra von boost kam ja auch schon.

    Die engine-API wiederum muss vom mathematischen Teil abhängig sein. Ein einfaches 'ZeichneEineKugel' benötigt ja mindestens eine Position, die hoffentlich nicht durch drei Parameter x,y und z sondern durch einen Vektor angegeben ist.

    Gruß
    Werner


Anmelden zum Antworten