Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Tobiking

1x Rätselkönig

  • »Tobiking« ist der Autor dieses Themas
  • Private Nachricht senden

1

29.07.2003, 02:23

Map Format ???

Naja ich habe langsam D3D im Griff und will mal nen bisschen was einigermaßen anschauliches machen. Hab daran gedacht eine Map zu laden und dann die Kamera da irgendwie durchfliegen zu lassen. Mein Problem ist nur das ich nicht weiß was für ein Format ich nehmen soll. Wäre ideal wenn es eins von einem Spiel ist damit ich keine eigene noch bauen muss. Hab da sofort an Quake 3 gedacht da es auf www.gametutorials.com ein Tutorial darüber gibt. Es ist zwar alles verständlich beim einlesen aber sobald die Map gerendert werden soll dreh ich durch. Kann vielleicht daran liegen das es ja für OpenGL gedacht ist. Da reichen 3-4 Funktionen und es läuft aber das umzusetzen in D3D fand ich nen bisschen umständlich und kam auf keinen schnellen weg. Deswegen wollte ich wissen ob es ein vorhandenes einfacheres Format gibt oder es einen einfachen weg gibt Quake 3 Levels zu rendern.

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

2

29.07.2003, 09:12

hi,

also das Quake3(2) Format sollte kein problem sein wenn man das tut hat es auf D3D umzusetzen, jedoch sollte man eines beachten: Bei OpenGL ist die Z achse die Y achse bei Direct3D.

Klar, OpenGL bietet funktionen wie glLoadMD2(); und co glaube ich (jedenfalls irgendwo mal gelesen zu haben), weil OpenGL sehr stark mit ID Software zusammenarbeitet und anderen Firmen.

Aber das Quake3 Format kann man bei DX nur mit nem eigenen parser einlesen (was ich auch besser finde).

3

30.07.2003, 02:26

Ich rate dir ab ein bestehendes Levelformat von 3D Spielen zu nehmen. Weil die meist mit BSP oder anderen Rendertechniken Arbeiten. Die müsten dann erst einmal erlernt werden.

Man muss ja nicht gleich ein eigenes Levelformat aufbauen. Aber versuch doch einfach mal eine 8Bit Heightmap einzuladen und daraus dann eine Map zu machen. Daran kann man dann mit Techniken wie Quad Tree weiter machen. Ich denke das verspricht für den Anfang auch mehr erfolg.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

4

30.07.2003, 02:41

Was ist BPS?

5

30.07.2003, 02:55

Zitat von »"Gast"«

Was ist BPS?
Das kenne ich auch nett :wirbel:

BSP heißt Binary Space Partition. Es sagt vieleicht schon einiges. Grob gesagt, das Level wird in Konvexe Räume Partitioniert. Diese befinden sich dann in den Nodes des Baumes. Wenn man das Level hat wird eine Teilerebene gesucht. Diese Teilt das Level in zwei gleich große Teile. Diese Teile werden dann in den Baum (Hinter der Ebene und vor der Ebene) einsortiert. Dieser Vorgang wird dann für jede Hälte so lange wiederholt bis ein Konverxer Raum übrigbleibt.

Ist ein bissel schwer das ganze in ein zwei Sätzen zu erklären. Auf Zerbi's Seite gibt es dazu ein ausführlicheres Tutorial.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Tobiking

1x Rätselkönig

  • »Tobiking« ist der Autor dieses Themas
  • Private Nachricht senden

6

30.07.2003, 13:39

Mir ist ja erstmal auch die Geschwindigkeit egal ich will erstmal etwas vernünftiges zu sehen haben. BSP wird ja im ersten Teil des Quake 3 BSP tutorials auch noch nicht genutzt und ich werde es auch erstmal nicht nutzen aber bei bedarf mir die weiteren durchlesen. Ich habe nur immer noch ein Problem das richtig darzustellen. Da steht das ein "Face" aus einem Trianglefan besteht. Ich weiß wie viele Vertex ein Face hat und ich versuche die nachdem ich alle in eine SVertex (Vector für die Position, und DWORD für Farbe) structur kopiert habe mit DrawPrimitiveUP das hinzukriegen aber es kommt totaler müll raus. Beim laden sollte kein Fehler sein habs fast komplett übernommen. Die Y und Z koordinate wurden auch getauscht. Weiß jemand vielleicht noch was was da nicht stimmen könnte ?

7

30.07.2003, 15:56

Ist es sicher das die Y und Z Achse vertauscht sind? Ich weis das OGL ein Right Hande Coordinate System verwendet, aber da sind nur die Vorzeichen der Z Achse gegenüber dem Left Handed System vertauscht.

Werden beim laden des Level's auch Matrizen verwendet? Wenn ja musst Du sie erst Transponieren. Eine weitere Fehlerquelle könnte sein, das du alle Trianglefans auf einmal Renderst. Das kann nicht gehen, da man nicht festlegen kann wie viele Elemente ein Trianglefan hat. Ich wüste jedenfalls nicht wie.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Tobiking

1x Rätselkönig

  • »Tobiking« ist der Autor dieses Themas
  • Private Nachricht senden

8

30.07.2003, 22:00

Also laut www.gametutorials.com:
// Since Quake has the Z-axis pointing up, we want to convert the data so
// that Y-axis is pointing up (like normal!) :)

Ist ebend nur Y und Z vertauscht weil da der liebe Carmack spaß dran hat. Ob jetzt Right oder Left handed sollte ja egal sein wird ja dann letztendlich nur gespiegelt. Und die Trianglefans alle einzelnd Rendern zu ich auch solange ich nichts falsch gemacht habe. Werde gleich mal nen bisschen Code posten.

Edit: Also hier mal die wichtigsten Stellen wo es um das Laden und anzeigen der Maps geht. Ich habe immer nur Teile raus genommen da es vielleicht sonst abschreckt.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
struct SVertex
{
    D3DXVECTOR3 vPosition;
    DWORD dwColor;
};

...

SVertex *g_Vertex;
int g_iNumOfVerts;     // Anzahl aller Vertizes
int g_iNumOfFaces;     // Anzahl aller Faces
SBSPVertex *g_pVerts;     // Hier werden alle Vertizes reingeladen
SBSPFace *g_pFaces;     // Hier werden alle Faces reingeladen
int iAktuell;

...

g_Vertex = new SVertex[g_iNumOfVerts];

...

for( int i = 0; i<g_iNumOfVerts; i++)
{
    g_Vertex[i].vPosition = g_pVerts[i].vPosition;
    g_Vertex[i].dwColor = D3DCOLOR_XRGB(0,0,0);
}

...

g_pD3DDevice->BeginScene();

    iAktuell = 0;
    for(int i = 0; i<g_iNumOfFaces;i++)
    {
        SBSPFace *pFace = &g_pFaces[i];

        g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, pFace->iNumOfVerts, &g_Vertex[iAktuell], sizeof(SVertex));
        iAktuell+=pFace->iNumMeshVerts;
    }
g_pD3DDevice->EndScene();


Also es müsste alles richtig geladen sein da g_iNumOfVerts und g_iNumOfFaces die richtigen Werte enthalten.

9

30.07.2003, 23:42

Ach so. Dann ist's klar. Ich dachte schon das es von OGL aus ging. Das hatte ich nämlich nett so in Erinnerung :)

Da die Daten Indiziert gespeichert werden, liegt der Fehler vieleicht an dieser Zeile

Quellcode

1
iAktuell+=pFace->iNumMeshVerts;
Probier mal dies hier

Quellcode

1
2
3
4
5
6
7
g_pD3DDevice->BeginScene();
for(int i = 0; i < g_iNumOfFaces; ++i)
{
  SBSPFace* pFace = &g_pFaces[i];
  g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, pFace->iNumOfVertex, &g_Vertex[pFace->vertexIndex], sizeof(SVertex));
}
g_pD3DDevice->EndScene();

Ich kann hier leider auch nur ein bissel Raten. Vieleicht musst du aber auch nicht diese Werte nehmen, sondern meshVertIndex und numMeshVerts ?
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Tobiking

1x Rätselkönig

  • »Tobiking« ist der Autor dieses Themas
  • Private Nachricht senden

10

31.07.2003, 00:17

Also so wird gar nichts angezeigt. Ich hab mir das so gedacht das ja in g_Vertex alle Vertizes sind aber ich fange je nicht jedes mal von 0 an sondern da wo das letzte "Face" aufgehört hat. Deswegen addiere ich immer die anzahl der Vertizes damit ich weiß wo ich bin. Kann ja sein das ich da komplett was falsch verstanden habe. Aber in OpenGL sieht das so einfach aus. Hmm obwohl. Irgendwie bin ich jetzt total verwirrt. Ist das was ich gemacht habe nicht theoretisch das gleiche. Nur das ich nicht aus der Face struktur den startvertex lese sondern selber mitzähle ?

Werbeanzeige