Abstrakte vektoren :D
-
Hallo Leutz,
Ich wollt mich mal an einer simplen 3D-Engine versuchen und habe den Ansatz verfolgt, alles abstrakt anzulegen, um die Verwendung mehrerer APIs zu ermöglichen (Man hat Stefan Zerbst's Buch gelesen :D). Beim Renderer scheints keine Probleme zu machen. Nun bin ich aber beim Mathematischen teil - Ich hab mir überlegt, dass sich eigene Vektoren und Matrizen zu schreiben doch irgendwo unlogisch ist. Auf das Wissen, was da gerechnet wird wollte ich nicht verzichten - deswegen habe ich mir auch paar Algebrabücher geholt
. Das ist auch weniger das Problem - ich denke nur, dass ich es nicht hinkriegen würde alle Optimierungen, die in den mathematischen DirectX oder OpenGL Funktionen genutzt werden einzubauen. Außerdem würde ich gerne bis zum Sommer etwas auf die Beine stellen. Also hab ich mir überlegt, die Vektorklasse auch abstrakt anzulegen und dann in der Dll zu implementieren und dort die Funktionen der jeweiligen API dazu nutzen. Irgendwann hatte ich dann sowas bei mir stehen:// Vektorkapselung // ============================================================================================================== class VecClass { // anderes Zeug virtual VecClass operator * (float f) const =0; // Mehr anderes Zeug }; // ==============================================================================================================Da hat der Compiler gemeckert - das ginge nicht. Okay, hab ich mir schon gedacht.
Ich würde ja nun fragen, ob es nicht doch eine Möglichkeit gäbe, das so zu machen, allerdings fang ich an, an meinem Ansatz zu zweifeln - ist das denn Überhaupt Sinnvoll: Abstrakte Vektoren?
Die leute, die den Anfang schon länger hinter sich haben würde ich gerne fragen, Wie ich am besten verfahren soll - soll ich mir nun eigene Vektoren Schreiben oder soll ich die Idee der API-Unabhängigkeit ganz fallen lassen? Gibts eine fertige Mathematik Library für 3D-Grafik, die API-unabhängig arbeitet und upgedated wird, die ich lieber einsetzen sollte? Ich hab irgendwie keine Ahnung wie ich weitermachen soll^^.
-
Hast du den Fehler wirklich auf dieses Codestück eingegrenzt? Warum enthältst du uns die Meldung des Compilers vor?
Zum Thema abstrakte Vektoren allgemein sind deine Zweifel sind durchaus berechtigt. Selbst wenn nicht, sehe ich keinen Grund warum diese von OGL oder D3D wissen müssten.
Und auch wenn du nicht gefragt hast: Nein, aller Wahrscheinlichkeit nach macht es keinen Sinn überhaupt eine 3D-Engine zu schreiben.
-
Fehlermeldung:
error C2259: 'VecClass' : cannot instantiate abstract class due to following members: 'VecClass VecClass::operator *(float) const' : is abstractAbstrakte Klassen können wohl keine Funktionen haben, die die Klasse als rückgabewert haben. Ne häßliche Idee wärs, als Rückgabetyp void* zu verwenden und dann bei Anwendung auf (VecClass*) casten und dereferenzieren (oder dereferenzieren und dann in (VecClass) umcasten). aber irgendwie bin selbst ich nicht krank genug dafür
(Werde aber ganz sicherlich ausprobieren, wenn ich ma zuviel Zeit hab)Selbst wenn nicht, sehe ich keinen Grund warum diese von OGL oder D3D wissen müssten.
Ich verstehe nicht ganz, was du damit meinst
Sag mir nicht direkt, es macht keinen Sinn. Das würde ja heißen, all die tollen Bücher über Spieleprogrammierung, die die Programmierung einer Engine erklären wären sinnlos. Aber auch wenn sie das sind würde ich dann gerne eine Alternative hören, wie ich das Erlernen dieses Gebietes anpacken soll :).
-
Klar bekommst du einen Fehler wenn du versuchst eine abstrakte Klasse zu instanzieren - ein wenig C++ Grundlagen würden da helfen dass du das selber verstehst.
Davon abgesehen halte ich es für kontraproduktiv virtuelle Funktionen in einer Vektorklasse zu haben, da der Compiler dadurch weniger optimieren kann.
Abstrakte Klassen können wohl keine Funktionen haben, die die Klasse als rückgabewert haben.
Das ist logisch, da keine Instanzen von abstrakten Klassen existieren können. Nen?
-

Azrael, il Meraz schrieb:
Ich wollt mich mal an einer simplen 3D-Engine versuchen
Azrael, il Meraz schrieb:
Sag mir nicht direkt, es macht keinen Sinn. Das würde ja heißen, all die tollen Bücher über Spieleprogrammierung, die die Programmierung einer Engine erklären wären sinnlos. Aber auch wenn sie das sind würde ich dann gerne eine Alternative hören, wie ich das Erlernen dieses Gebietes anpacken soll :).
Versuch erst eine fertige Engine zu nutzen.
http://www.c-plusplus.net/forum/viewtopic-var-t-is-203218.htmlDas ist eine abstracte Klasse du kannst
davon keine Objekte erstellen " VecClass a; " du kannst
aber Pointer darauf erstellen " VecClass *b; ".class VecClass { // Eine function kann einen Pointer zurück liefern virtual VecClass* operator * (float f) const =0; };
-
Danke bisher.
Dass virtuelle vektoren ne schlechte Idee ist, hab ich mittlerweile bemerkt :p .
Nun - Ihr gebt mir folgendes zum Auswählen:- fertige Engine nutzen
- 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?

-
Azrael, il Meraz schrieb:
Fehlermeldung:
error C2259: 'VecClass' : cannot instantiate abstract class due to following members: 'VecClass VecClass::operator *(float) const' : is abstractAha. Damit kann man doch schon mal was anfangen. Scheint als wäre der Fehler "erstaunlicherweise" doch nicht ganz wo du ihn vermutest.
Azrael, il Meraz schrieb:
Abstrakte Klassen können wohl keine Funktionen haben, die die Klasse als rückgabewert haben.
Keine Funktion, keine Methode kann eine Klasse als Rückgabewert haben.
Azrael, il Meraz schrieb:
Ne häßliche Idee wärs, als Rückgabetyp void* zu verwenden und dann bei Anwendung auf (VecClass*) casten und dereferenzieren (oder dereferenzieren und dann in (VecClass) umcasten).
Nicht nur in der Tat hässlich, sondern auch zum Scheitern verurteilt.
Azrael, il Meraz schrieb:
Selbst wenn nicht, sehe ich keinen Grund warum diese von OGL oder D3D wissen müssten.
Ich verstehe nicht ganz, was du damit meinst
Das war mir schon klar.
Azrael, il Meraz schrieb:
Sag mir nicht direkt, es macht keinen Sinn. Das würde ja heißen, all die tollen Bücher über Spieleprogrammierung, die die Programmierung einer Engine erklären wären sinnlos. Aber auch wenn sie das sind würde ich dann gerne eine Alternative hören, wie ich das Erlernen dieses Gebietes anpacken soll :).
Deine Logik ist vollkommen kaputt.
Aber, nichtsdestotrotz, habe ich mich wohl geirrt. Wenn dein Endziel ist, einfach nur über 3D-Engines und deren Implementation etc. bescheid zu wissen, macht es natürlich Sinn zu Lernzwecken einige 3D-Engines zu schreiben und zu studieren. Wobei ich mit Sicherheit sagen kann dass dieses Unterfangen um einiges effektiver wäre würdest du wenigstens die Grundlagen der Sprache deiner Wahl beherrschen.
-
habe den Ansatz verfolgt, alles abstrakt anzulegen, um die Verwendung mehrerer APIs zu ermöglichen
denkst du denn, dass direct3d auf anderen mathematischen grundlagen aufbaut als opengl?!
-
@finix: Super, du hast mir jetzt gesagt, dass ich keine Ahnung von C++ hab, nicht in der Lage bin, dich zu verstehen, meine Idee komplett schwachsinnig ist, aber mein Ansatz stimmt. Vielen Dank für den konstruktiven Beitrag.
-
hellihjb schrieb:
habe den Ansatz verfolgt, alles abstrakt anzulegen, um die Verwendung mehrerer APIs zu ermöglichen
denkst du denn, dass direct3d auf anderen mathematischen grundlagen aufbaut als opengl?!
Nö. Wiederum was äußerst konstruktives.....
Wenn ich jetzt DirectX-Vektoren und matrizen verwende, muss ich doch DirectX-header einbinden? = kein API-Unabhängigkeit.
-
Naja, Azrael, man sieht aber dass du keine Ahnung von C++ hast

Was deine Vektor-Klasse angeht: die meisten Engines haben eigene Vektor-Klassen, die intern keine OpenGL oder Direct3D Funktionen verwenden. Oft sind diese Vektor-Klassen sogar komplett inline implementiert. Und es gibt normalerweise auch nur eine Version z.B. eines 3D oder 4D Vektors pro Engine, unabhängig davon welches Backend verwendet wird.
Die Vektorklassen von Engines werden ja auch nicht verwendet um damit während eines Spiels oder einer Animation die zig- oder hunterttausenden Vertices zu manipulieren aus denen irgendwelche Objekte zusammengesetzt sind, das wäre unnötig langsam, ganz egal wie die Vektorklasse jetzt implementiert ist. Diese Vektorklassen verwendet man vielleicht zum Laden von Vertexdaten, bevor man die auf die Grafikkarte überträgt, oder zum manipulieren von Position/Ausrichtung/... von einigen wenigen hundert oder tausend Objekten in einer Szene.
-
Wenn ich jetzt DirectX-Vektoren verwende, muss ich doch DirectX-header einbinden?
Kann man, muss man aber nicht:
typedef struct _D3DVECTOR { float x, y, z; } D3DVECTOR;...und das ist gar nicht mal so unterschiedlich von dem was OpenGL fuer einen Vektor haelt

Bei Matrizen sieht's aehnlich aus (beachte zeilen/spalten-layout)
-
Letztlich haste grob wohl 2 Möglichkeiten:
- Selber schreiben. Du lernst viel dabei, wirst jedoch wohl nicht die Effizient von OGL und D3DX Code erreichen.
- Fertiges Zeug benutzen, z.B. einfach über einige #defines und typedefs.
-
@hustbaer: danke, also doch eigene und mit eigener Implementation. Hmmm, höchstwahrscheinlich werde ich zuvor etwas mit einer fertigen Engine versuchen. Da ich danach aber die Engine zum Funktionieren bringen will, noch eine frage: Wenn ich die Vektoren/Matrizenoperationen in C++ umsetze und nicht in inline-assembler mit SSE und whatever, ist das dann am ende gravierend? nicht dass ich dann eine einfache kugel mit 3 fps auf nem highend-rechner rendern kann...
@ 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 
@this->that: punkt 2 etwas genauer. Wäre sehr dankbar. bzw. was soll "fertiges zeug" sein?
-
eine simple klasse nicht compiliert zu bekommen, grundsaetzliche designentscheidungen und c++ grundlagen sind nicht ganz das thema dieses unterforums.
-
Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
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.
-
Azrael, il Meraz schrieb:
@finix: Super, du hast mir jetzt gesagt, dass ich keine Ahnung von C++ hab, nicht in der Lage bin, dich zu verstehen, meine Idee komplett schwachsinnig ist, aber mein Ansatz stimmt. Vielen Dank für den konstruktiven Beitrag.
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.
Aber ich habe recht. Vielleicht nicht in der Weise wie ich mit dir umgehe -- das steht sicherlich zur Debatte --, aber mit dem Urteil was ich (vorläufig) über dich fälle. Frag z.B. hustbaer; der nutzt jede Gelegenheit mit mir nicht übereinzustimmen, aber, auch wenn er loads more politically correct ist, jede Gelegenheit nutzt mir an den Karren zu fahren, etc., wird er (in seinem innerstem
) meinem Urteil zustimmen; was er eigentlich sogar schon (mehrfach) getan hat, du hast es nur nicht entziffern können (Hint: hustbaers Posts).Denke ich dass du keine Ahnung von C++ hast? Ja. (Hint: das hast du mit deinem Post bewiesen. Denkst du die anderen haben nur zufällig dein ganz konkretes und spezifisches Problem nicht erraten, sondern mit an Sicherheit grenzende Wahrscheinlichkeit haargenau definieren können?).
Denke ich dass du mich nicht verstehst (Hint: im Gegensatz zu "nicht in der Lage bist")? Ja. (Hint: "Ansatz verfolgt, alles abstrakt")
Denke ich dass deine Idee [eine 3D-Engine zu schreiben] komplett schwachsinnig ist? Ja. Sofern du nicht, wie oben beschrieben, ganz abstrakt oder, aus welchen Gründen auch immer, praktisch, einen Einblick in die Programmierung einer Engine erhalten willst, halte ich deine Idee für schwachsinnig.
(Hint: du hast über keinen meiner Hints sinniert, oder?)
-
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.