Archiv verlassen und diese Seite im Standarddesign anzeigen : 3D Engine
Bibolorean
21.04.2003, 19:07
Hi Leute!
Ich hab vorhin schon ein wenig im Forum gesucht und auch im Net.. hab aber nicht gerade viel brauchbares gefunden, bin mir aber auch nicht sicher, dass ich alles wichtige glesen hab.. Darum sorry, falls es ein doppelposting sein sollte..
Nun zum "Problem":
Ich wollte letztens mal ein kleines 3D Spiel coden.. Vielleicht kennt ihr das 3D 4 Gewinnt? es sollte ganz einfach gehalten werden, weil ich ein absoluter Anfänger bin in 3D und auch sonst nicht gerade der beste Coder..
Später dacht ich, die KI des gegnerischen Spielers und die Kamera Bewegung (und einige andere "Kleinigkeiten") könnten echt schwer werden, darum code ich erst mal etwas nicht-interaktives -> Ein ScreenSaver..
Es sollte ein grosses B sein, welches mit dem 3DS Max erstellt und als .3ds exportiert wurde.
Gecodet wird mit C++ zusammen mit DirectX..
Nun zur Frage: Gibt's ne Engine (oder was auch immer) mit der man ne .3ds Datei einlesen kann und sie dann sozusagen direkt in den VertexBuffer kopieren kann? So als TriangleList oder so..? :confused:
Schlussendlich möcht ich einfach dieses B (nicht umbedingt texturiert, sondern einfach ne Farbe..) und ne Kamera, welche dieses B ständig umkreist. Sollte also eigentlich nicht so schwierig sein!? mir fehlt hald irgendwie der Anfang (und später wahrscheinlich der Rest *g*)...
Hab ne Engine für Caligari TrueSpace gefunden, mit der bin ich aber irgendwie nicht so zufrieden, da diese hauptsächlich für VB und andere Sprachen ist..
Nunja.. ich hoff ihr könnt 'nem Neuling in diesem Bereich helfen :)
Ich zähl auf euch! *g*
Grosses Danke im Voraus!
Greetz Bìbòlorean
FireBird2002
22.04.2003, 09:25
Ich hab da nen Loader für OpenGL, vielleicht kannst du ihn für DirectX umschreiben (nach meiner Erinnerung ist nur der Aufruf umzuschreiben). Ich geh jetzt einfach mal davon aus, dass du das ganze in C++ schreiben willst:
http://www.levp.de/3d/
andere Resourcen zum Thema 3D-coden wären:
http://www.gametutorials.com
http://www.gamedev.net
Ich kenn mich leider nicht mit DirectX aus, da mir Platformunabhängigkeit wichtig ist und MS suckt!
Bibolorean
22.04.2003, 17:13
Thx a lot! Ich bastle gerade ein wenig dran rum..
so wie ich's bis jetzt sehe (is nicht gerade der kürzeste Code) muss ich nich viel ändern.. toll! :D
Falls es nicht klappen sollte, meld ich mich sicher wieder ;)
Greetz Bìbòlorean
Edit:
Gecodet wird mit C++ zusammen mit DirectX.. ;)
oder schnapp dir eine nahezu beliebige engine (z.b. reality factory, unter anfängern sehr beliebt), und konvertiere diese 3ds-datei mit hilfe von milkshape in das passende format:
http://www.swissquake.ch/chumbalum-soft/
Bibolorean
23.04.2003, 19:34
Am basteln bin ich - mittlerweilen auch am verzweifeln :(
Ich hab nich alles selber gecodet, dass würd ich noch nich schaffen. (vielleicht nach Anleitung.. *g*) Ich hab darum ein Beispiel Projekt genommen und dies dann ein wenig abgeändert.
(ohne änderungen lief es!)
Nun ich habe folgendes Problem:
Beim Beispielprojekt konnte während der "Programmier"-Zeit genau eingegeben werden, wie der CustomVertex gefüllt werden soll:
/*CustomVertex TriangleVertices[] =
{
{ -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0xFFFF0000, -1.0f, -1.0f },
{ 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0xFF00FF00, 0.0f, 1.0f },
{ 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0xFF0000FF, 1.0f, -1.0f }
};
nun, da ich ja per l3ds.loadFile eine .3ds Datei einlese und dann über Zeiger darauf zugreifen kann (gab bislang noch keine Fehler, bzw. jetzt gibt es keine mehr! ;))
muss ich mein CustomVertex während der Laufzeit befüllen.. Das erste Problem war, dass ich diesen CustomVertex nicht während der Laufzeit initialisieren konnte.. vonwegen nicht dynamisch. Ihr merkt, ich hab's nicht so mit dem coden :)
Darum gleich ne einfachere Frage: wie geht das schon wieder??
während der Laufzeit zum Beispiel:
CustomVertex CV[mesh.GetVertexCount()];
:confused: :confused: :confused:
Nun zu der anderen Frage:
(ich hab mit nem Tool herausgefunden, wieviele Triangles dass es hat, und hab dies dann einfach mit 3 multipliziert.)
"Ich" habe die CustomVertex Struktur so definiert:
struct CustomVertex{
FLOAT x, y, z; // die Position des Knoten (Vertex)
FLOAT nx, ny, nz; // Normale für die Lichtberechnung
DWORD color; // die Farbe an diesem Knoten
FLOAT tu, tv; // die Texturkoordinaten
};
Nun wollte ich während der Laufzeit diesen fix definierten CustomVertex Array befüllen..
CustomVertex CV_B[89040];
if(!L3DS2CV(CV_B[0], l3ds, 0xFFFF0000)) Das stimmt wohl nicht so ganz!
{
Error("öpis mit minere Funktion stimmt ned!");
};
--------------------------------
BOOL L3DS2CV(CustomVertex &CV, L3DS &l3ds, DWORD color)
{
LMesh &mesh = l3ds.GetMesh(0);
int icvz = 0;
LTriangle2 LT;
for (uint i=0; i < mesh.GetTriangleCount(); i++)
{
LT = mesh.GetTriangle2(i);
for (int z=0; z<3; z++)
{
CV[icvz] = {LT.vertices->x; LT.vertices->y; LT.vertices->z;
LT.vertexNormals->x; LT.vertexNormals->y; LT.vertexNormals->z;
color;
LT.textureCoords->x; LT.textureCoords->y};
icvz++;
};
};
return 1;
}
Ich sag mal vorlaut, dass es nichts mit dem L3DS an und für sich zu tun hat - was ich damit meine ist folgendes: Beim kompilieren giebt er nur Fehler bezüglich, dass dieser Operator (=) in der Struktur CustomVertex nicht definiert ist! Oder so.. :)
Nun ja.. das war's im Moment!
Entweder könnt ihr mir helfen, oder ich begrab mein jahrelanger Traum vom "eignen" ScreenSaver :cool:
Thx & greetz
Bìbòlorean
FireBird2002
23.04.2003, 23:08
CustomVertex CV[mesh.GetVertexCount()];
So funzt das nicht. Du initialisierst hiermit nur ein statisches Array.
In den [] muß eine Zahl bzw. eine (symbolische) Konstante stehen.
Ersetz bitte die zeile durch diese 2:
CustomVertex *CV;
CV=new CustomVertex[mesh.GetVertexCount()];
ich hab mit nem Tool herausgefunden, wieviele Triangles dass es hat, und hab dies dann einfach mit 3 multipliziert.)
Denkfehler. Ein Triangle hat zwar 3 Vertices (Wer häts gedacht), aber im normalfall sind alle Verices mehrfach in Benutzung. Schau mal ins 3d Studio, oder sonst irgendein 3d-Prog und laß mal die Vertices zählen.
Operator (=) in der Struktur CustomVertex nicht definiert ist
Du mußt ne Klasse draus machen und den = Operator überladen.
Bibolorean
24.04.2003, 19:19
Ich hab auch schon dran gedacht, ne Klasse daraus zu machen.. wollte es aber nicht.. (kein Grund.. hald einfach so :))
Hab aber herausgefunden (im Buch nachgelesen), dass dies auch mit Strukturen geht. Nun ja, nicht den Operator überladen (geht vielleicht auch, weiss ich nicht) aber ich hab nun eine Funktion implementiert, mit der ich die Zuweisung vornehmen kann.
-> Kein Fehler beim kompilieren, jedoch bei der Ausführung:
First-chance exception at 0x00402118 in Light.exe: 0xC0000005: Access violation writing location 0x01048000.
Unhandled exception at 0x00402118 in Light.exe: 0xC0000005: Access violation writing location 0x01048000.
The program '[5484] Light.exe: Native' has exited with code 128 (0x80).
Ich denk es hat mit dem Aufruf meiner Funktion zu tun (wo sonst soll der Fehler liegen? Vielleicht an meiner Funktion selbst *g* die Funktion ist übrigens ausgelagert -> L3DS2CV.cpp)
if(!L3DS2CV(CV_B[0], l3ds, 0xFFFF0000)) <-- Das stimmt wohl nicht so ganz!
Ich hab mal das ganze Projekt hier hingepackt. Vielleicht kann und will mir ja jemand helfen? :rolleyes:
2 Hinweise: Ich hab ein paar MessageBoxes hineingetan, so zur Fehlersuche :D nunja.. es genügt - meistens :)
der andere Hinweis wäre, dass man die B.3ds Datei zum Progi schaufeln sollte, da er die sonst nicht öffnen kann. (hat zwar nicht gemotzt, als ich's nicht tat.. Warum? Irgend eine Idee?)
Greetz
Bìbòlorean
Bibolorean
24.04.2003, 19:21
nach der Vorschau sollte man die Datei nochmals auswählen.. *schäm*
sorry!
FireBird2002
24.04.2003, 21:54
Ich glaube dein (dynamisches)CV-Array in der Fuktion L3DS2CV läuft über. Grund: der selbe Denkfehler wie oben.
a) Du gehst davon aus, das jeder Vertex nur 1 einziges Mal verwendet wird. Die Polygone die beeinander liegen haben aber meißt 2 gemeinsame Vertices.
b) Du gehst davon aus, dass Polygone immer 3 Ecken haben. Es gibt aber auch Vierecke.
Du mußt also mit GetVertex(...) arbeiten.
P.S.: Wär nett wenn du die Sources immer mal wieder posten könntest.
Bibolorean
24.04.2003, 22:08
Ich hoff nicht, dass das ein Denkfehler ist! Sorry, ich hab darauf noch nicht geantwortet..
folgendes:
DirectX "will" eine TriangleList von mir.. und somit MUSS ich 3 Vertexe zu einem Dreieck zusammenfassen.
Im übrigen gibt mir
LT = mesh.GetTriangle2(i)
eine Struktur mit diesen Werten:
struct LTriangle2
{
LVector4 vertices[3];
LVector3 vertexNormals[3];
LVector2 textureCoords[3];
LVector3 faceNormal;
uint materialId;
};
wobei die LVector Strukturen wie folgt deklariert sind:
struct LVector4
{
float x;
float y;
float z;
float w;
};
struct LVector3
{
float x;
float y;
float z;
};
struct LVector2
{
float x;
float y;
};
ich bekomm also von l3ds (dieser included library) schöne Dreiecke, die ich mit meiner Funktion "nur" in de VertexBuffer kopieren wollte..
Naja, das wars für's erste.. ich geh jetzt schlafen und suche Morgen noch ein wenig nach Fehlern!
Danke trotzdem! Vielleicht packt dich ja die Neugierde und du liest den ganzen Code? :D
Greetz & big thx!!
Bìbòlorean
Edit:
Nachtrag:
if(mesh.GetVertexCount() == mesh.GetTriangleCount()*3)
{
MessageBox(0,"Jooo! Es stimmt!!", "Dreiecke", MB_OK);
}
klappt nicht! :(
Bibolorean
25.04.2003, 15:22
OK, ich habs begriffen! Bzw. ich hab mein Fehler bemerkt.
Ich muss ja die Triangles för DirectX mit je 3 Vertices haben. Jedoch muss
3dsMax diese nicht so speichern. Folglich sollte mir l3ds eine Triangle
Structur zurückgeben, die auf die richtigen 3 Vertices zeigt..
somit "sollte" ich CV mit
CV = new CustomVertex[mesh.GetTriangle()*3];
initialisieren, korrekt?
hab ich Heut Morgen kurz ausprobiert -> access violation at 0x000000 hmm..
scheint ein Zeiger auf Null zu sein?
Fehlersuche geht weiter :)
Greetz
Bìbòlorean
-------------------------------------------------
->
BYTE* VBStart; //Vertex Buffer Zeiger
lpD3DDevice->CreateVertexBuffer(
sizeof(CV_B),
D3DUSAGE_WRITEONLY,
D3D_CUSTOMVERTEX,
D3DPOOL_MANAGED,
&VB); //VB=VertexBuffer
VB->Lock(0,0,&VBStart,0);
MessageBox(0,"VB","VB",MB_OK);
memcpy(VBStart, CV_B, sizeof(CV_B));
VB->Unlock();
Die MessageBox erscheint nicht, bis da läuft das Prog...
Idee?
Bibolorean
25.04.2003, 20:11
So.. ich habs noch versucht, aber NIX mehr herausgefunden! Würde mich super doll freuen, wenn mir jemand helfen könnte!
Ich packs nochmals hierhin, der Fehler muss irgendwie was mit dem
VB->Lock(...); zu tun haben.
Ich raff einfach nicht warum! :(
Greetz Bìbòlorean
Bibolorean
29.04.2003, 17:41
Toll.. ich habs nun auch noch so versucht.. wollte es zumindest.
Doch dem Milkshape ist mein "B" zu gross.. es hat anscheinend zu viele Triangles und oder Vertexe in der Datei. Aber weniger kann ich fast nicht mehr speichern, ansonsten sieht das B nicht mehr nach B.
Hmm... hab auch noch andere Engines bzw. 3ds loader gesucht. Erfolglos! :(
Warum motzt auch der blöde Compiler bei VB-Lock(...); *grml*
Greetz Bìbòlorean
Bibolorean
30.04.2003, 19:14
Hallo Jungs und Mädels :)
Ich bin mittlerweilen weiter gekommen bei meiner Fehlersuche!
Folgendes:
Ich hab mir den VertexBuffer in ne Datei Ausgeben lassen. Da hab ich gemerkt, dass jeder Vertex 3mal vorkam. Daraus resultierte eine Verbesserung / Korrektur meiner "selbsgebauten" Umwandlungsfunktion. Den hab ich beseitigt.
Weiter gings mit
if(FAILED(lpD3DDevice->CreateVertexBuffer(..)))
{
Error("CreateVertexBuffer->FAILED!!");
}
und das is auch so! FEHLGESCHLAGEN.
Mir blieb beim durchlesen eines Buches mal was hangen. Ich habs nochmals nachgelesen, weil ich mir nicht mehr ganz sicher war:
Die Reihenfolge der Werte dieser CustomVertex-Struktur ist NICHT beliebig!?!
Nun, in der Datei die ich mir ausgeben lassen hab, sah ich, dass der Farbwert IMMER am Ende stand. Also auch nach den Texturkoordinaten tu und tv.
Allerdings sollte jener VOR den Textur Koordinaten sein. Kann mir jemand sagen, wie ich in C++ eine solche Reihenfolge "einprogrammieren" kann?
Greetz Bìbòlorean
Edit:
Beachten Sie Bitte, dass die Reihenfolge, in der Sie die Elemente angeben nicht beliebig sind. Die DirectX 8 Hilfe enthält eine beschreibung, in welcher Reihenfolge die Werte angegeben werden müssen.
ich hab die Struktur des CustomVertex ja so definiert:
struct CustomVertex{
FLOAT x, y, z; // die Position des Knoten (Vertex)
FLOAT nx, ny, nz; // Normale für die Lichtberechnung
DWORD color; // die Farbe an diesem Knoten
FLOAT tu, tv; // die Texturkoordinaten
}
aber gespeichert wurden die Daten eines Vertexes in dieser Reihenfolge:
----
ouu.. ok, das war dumm! Hab gerade gemerkt, dass ich daran Schuld bin.. nunja.. Hmm.. aber warum giebt DirectX den Fehler bei CreateVertex? *grml*
scheisse... <-- Sorry! :rolleyes:
ich geh nachdenken....
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.