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

FrauBolaIstDumm

Treue Seele

  • »FrauBolaIstDumm« ist der Autor dieses Themas

Beiträge: 109

Wohnort: kralapp

Beruf: schüler

  • Private Nachricht senden

11

14.03.2004, 21:27

hallo

hallo.
hat sich erledigt.
so muss es heisen:
tbDirect3D::GetDevice()->DrawPrimitiveUP();
es funzt. blos das ganze teil ist schwarz. das kann aber viele gründe haben z.b: licht , keine textur. und noch eine frage wie kann ich .raw dateien erstellen geht das auch mit paint???
Frau Bola Ist Dumm
(Deutschlehrer)

12

15.03.2004, 01:50

Die kannst du z.B. mit TerraGen erstellen. Einfach danach mit google suchen. Das ist ein kleines aber sehr gutes Programm um Terrains zu erstellen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

FrauBolaIstDumm

Treue Seele

  • »FrauBolaIstDumm« ist der Autor dieses Themas

Beiträge: 109

Wohnort: kralapp

Beruf: schüler

  • Private Nachricht senden

13

15.03.2004, 14:24

hallo

hallo.
danke für eure hilfe.
und ich glaube ich weis jetzt warum das terrain schwarz ist , weil ich von unten draufschaue aber ich muss von oben draufgucken.
VielenVielenDank.
MFG FrauBola
Frau Bola Ist Dumm
(Deutschlehrer)

FrauBolaIstDumm

Treue Seele

  • »FrauBolaIstDumm« ist der Autor dieses Themas

Beiträge: 109

Wohnort: kralapp

Beruf: schüler

  • Private Nachricht senden

14

15.03.2004, 19:33

hallo

Hallo.
Es funktioniert schon sehr gut. *freu*
ich hab jetzt auch herausgefunden warum es schwarz war.
weil ich von unten draufgeschaut habe.
wenn mann es startet sieht man trotzdem nichts. weil die dreiecke
keine "oberfläche" haben wenn mann es aber in WIREFRAME umschaltet
sieht man ganz gut das es eine hügellandschaft ist.
so nun aber zu meiner frage.
TEXTURE wie kann ich jetzt über das ganze ding eine texture
zeichnen. ich komme absolut nicht weiter. wie ich das mit den texture-koordinaten machen muss.
Werde mal den code posten.
ich (wir) hab(en) das grundgerüst von Breakanoid genommen.
und der code steht in der datei Game.h + Game.cpp.
hier der code:
------------GAME.H-------------

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
// __________________________________________________________________
// Klasse für das Spiel
class CGame
{
public:

    // Variablen

// Terrain Vertex: Nur Position und Farbe
struct terrvertex {
   float x,y,z;
   DWORD color;
};
#define D3DFVF_TERRAIN (D3DFVF_XYZ|D3DFVF_DIFFUSE)

// 2D -> 1D Indexing
#define ind(x, z) ((x) + ((z) * 128))

   terrvertex   *aterr;
   short        *aheightmap;

    BOOL        m_bPaused;              // Ist das Spiel pausiert?
    BOOL        m_bGameOver;            // Ist das Spiel vorbei?
    char*       m_strCity;              // In welchem Level wir sind
    float       m_fLevelTime;           // Zeit, die für den Level gebraucht wird

    // Konstruktor
    inline CGame() {ZeroMemory(this, sizeof(CGame));}

    // Methoden
    tbResult    Init();                                         // Initialisierung
    tbResult    Exit();                                         // Herunterfahren
    tbResult    Load();                                         // Laden
    tbResult    Unload();                                       // Entladen
    tbResult    Move(float fTime);                              // Bewegen
    tbResult    Render(float fTime);                            // Rendern
    tbResult    InitLevel(int iLevel);                          // Initialisiert einen Level
};

// __________________________________________________________________

---------------------------GAME.CPP--------------------------

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
#include "kgames.h"
#include <fstream.h>

tbVector3               g_vCameraPos = tbVector3(0.0f, 10.0f, 0.0f);                // Kameraposition
float                   g_fCameraRot;               // Rotation der Kamera
float                   g_fCameraUpDown;            // Schaut die Kamera hoch oder runter?

// __________________________________________________________________
// Initialisiert den Spielzustand
tbResult CGame::Init()
{
    
    // Laden...
    if(Load()) TB_ERROR("Fehler beim Laden des Spielzustands!", TB_ERROR);

    
    return TB_OK;
}

// __________________________________________________________________
// Fährt den Spielzustand herunter
tbResult CGame::Exit()
{
    // Entladen...
    Unload();
g_pkgames->Exit();
        TB_SAFE_DELETE(g_pkgames);
    return TB_OK;
}

// __________________________________________________________________
// Lädt den Spielzustand
tbResult CGame::Load()
{
   ifstream file;
   unsigned char c;
   int num=0;

   aheightmap = (short*) malloc(128*128*sizeof(short));
   aterr = (terrvertex*) malloc(127*127*6*sizeof(terrvertex));

   file.open("heightmap.raw",ios::binary);
   for (int z=0; z < 128; z++) {
      for (int x=0; x < 128; x++) {
         file.get(c);
         aheightmap[ind(x,z)] = (short)c;
      }
   }
   file.close();

   for (z=0; z < 127; z++) {
      for (int x=0; x < 127; x++) {
         aterr[num].x = (float) x;
         aterr[num].z = (float) z;
         aterr[num].y = (float)aheightmap[ind(x,z)] / 25.6f;
         aterr[num].color = tbColor(0.0f, 0.5f, 1.0f);
         
         aterr[num+1].x = (float) x+1;
         aterr[num+1].z = (float) z;
         aterr[num+1].y = (float)aheightmap[ind(x+1,z)] / 25.6f;
         aterr[num].color = tbColor(1.0f, 0.5f, 0.0f);

         aterr[num+2].x = (float) x+1;
         aterr[num+2].z = (float) z+1;
         aterr[num+2].y = (float)aheightmap[ind(x+1,z+1)] / 25.6f;
         aterr[num].color = tbColor(0.5f, 0.0f, 1.0f);
/*
         aterr[num+3].x = (float) x;
         aterr[num+3].z = (float) z;
         aterr[num+3].y = (float)aheightmap[ind(x,z)] / 25.6f;
         aterr[num].color = tbColor(1.0f, (float) x, (float) z);

         aterr[num+4].x = (float) x+1;
         aterr[num+4].z = (float) z+1;
         aterr[num+4].y = (float)aheightmap[ind(x+1,z+1)] / 25.6f;
         aterr[num].color = tbColor(1.0f, (float) x, (float) z);

         aterr[num+5].x = (float) x;
         aterr[num+5].z = (float) z+1;
         aterr[num+5].y = (float)aheightmap[ind(x,z+1)] / 25.6f;
         aterr[num].color = tbColor(1.0f, (float) x, (float) z);*/
      
         num += 3;
      }
   }
    return TB_OK;
}

// __________________________________________________________________
// Entlädt den Spielzustand
tbResult CGame::Unload()
{

   free(aterr);
   free(aheightmap);
   
    return TB_OK;
}

// __________________________________________________________________
// Bewegt den Spielzustand
tbResult CGame::Move(float fTime)
{

    tbVector3 vCameraDir;

    // Tastatursteuerung...
    vCameraDir = tbVector3(sinf(g_fCameraRot) * cosf(g_fCameraUpDown),
                           sinf(g_fCameraUpDown),
                           cosf(g_fCameraRot) * cosf(g_fCameraUpDown));

    if(g_pbButtons[TB_KEY_LEFT])            g_fCameraRot -= 1.0f * fTime;
    if(g_pbButtons[TB_KEY_RIGHT])           g_fCameraRot += 1.0f * fTime;
    if(g_pbButtons[TB_KEY_UP])              g_fCameraUpDown -= 1.0f * fTime;
    if(g_pbButtons[TB_KEY_DOWN])            g_fCameraUpDown += 1.0f * fTime;
    if(g_pbButtons[TB_KEY_W])               g_vCameraPos += vCameraDir * 15.0f * fTime;
    if(g_pbButtons[TB_KEY_S])               g_vCameraPos -= vCameraDir * 15.0f * fTime;

    if(g_pbButtons[TB_KEY_X]) tbDirect3D::SetRS(D3DRS_FILLMODE, D3DFILL_WIREFRAME );
    if(g_pbButtons[TB_KEY_Y]) tbDirect3D::SetRS(D3DRS_FILLMODE, D3DFILL_SOLID );

    // P oder Pause hält das Spiel an oder setzt es fort.
    if(g_pbButtons[TB_KEY_P] || g_pbButtons[TB_KEY_PAUSE])
    {
        m_bPaused = !m_bPaused;
        tbDelay(100);
    }

    // Wenn das Spiel pausiert, gibt es nichts mehr zu tun.
    if(m_bPaused) return TB_OK;

    // ------------------------------------------------------------------

    //Spielfunktionen implementieren!!!

    // ------------------------------------------------------------------

    // Levelzeit erhöhen
    m_fLevelTime += fTime;

    // ------------------------------------------------------------------

    // Wenn die Escape-Taste gedrückt wird, geht's zurück ins Hauptmenü.
    if(g_pbButtons[TB_KEY_ESCAPE]) PostQuitMessage(0);

    return TB_OK;
}

// __________________________________________________________________
// Rendert den Spielzustand
tbResult CGame::Render(float fTime)
{
    tbMatrix            mProjection;
    tbMatrix            mCamera;
    tbMatrix            mWorld;
    tbVector3           vCameraDir;
    D3DLIGHT9   Light;


    //Puffer Leeren
    tbDirect3D::Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, tbColor(1.0f, 1.0f, 1.0f), 1.0f, 0);
    tbDirect3D::BeginScene();

    mProjection = tbMatrixProjection(TB_DEG_TO_RAD(60.0f), tbDirect3D::GetAspect(), 0.1f, 300.0f);
    tbDirect3D::SetTransform(D3DTS_PROJECTION, mProjection);


    // Kameramatrix erstellen und einsetzen
    vCameraDir = tbVector3(sinf(g_fCameraRot) * cosf(g_fCameraUpDown),
                           sinf(g_fCameraUpDown),
                           cosf(g_fCameraRot) * cosf(g_fCameraUpDown));
    mCamera = tbMatrixCamera(g_vCameraPos, g_vCameraPos + vCameraDir);
    tbDirect3D::GetDevice()->SetTransform(D3DTS_VIEW, (D3DMATRIX*)(&mCamera));
    //RENDERANWEISUNGEN

    //END-RENDERANWEISUNGEN
    //Welt
    
    mWorld = tbMatrixTranslation(g_vCameraPos);
    tbDirect3D::SetTransform(D3DTS_WORLD, mWorld);


    // Ein Richtungslicht erstellen mit der Richtung der Kamera
    ZeroMemory(&Light, sizeof(D3DLIGHT9));
    Light.Type = D3DLIGHT_DIRECTIONAL;
    Light.Diffuse = tbColor(0.5f, 0.5f, 0.5f);
    Light.Ambient = tbColor(0.5f, 0.5f, 0.5f);
    Light.Specular = tbColor(0.5f, 0.5f, -5.5f);
    Light.Direction = vCameraDir;
    tbDirect3D::GetDevice()->SetLight(0, &Light);
    tbDirect3D::GetDevice()->LightEnable(0, TRUE);


    // Linearer schwarzer Nebel!
    tbDirect3D::SetRS(D3DRS_FOGENABLE,      TRUE);
    tbDirect3D::SetRS(D3DRS_FOGVERTEXMODE,  D3DFOG_LINEAR);
    tbDirect3D::SetRS(D3DRS_RANGEFOGENABLE, TRUE);
    tbDirect3D::SetRS(D3DRS_FOGCOLOR,       tbColor(0.0f, 0.0f, 0.2f));
    tbDirect3D::SetRSF(D3DRS_FOGSTART,      300.0f);
    tbDirect3D::SetRSF(D3DRS_FOGEND,        500.0f);
    //tbDirect3D::SetRS(D3DRS_FILLMODE, D3DFILL_WIREFRAME );

    // Weltmatrix zurücksetzen
    tbDirect3D::GetDevice()->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&tbMatrixIdentity()));
//RENDERN TERRAIN
    tbDirect3D::SetFVF(D3DFVF_TERRAIN);
    tbDirect3D::GetDevice()->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 127*127*2, aterr, sizeof(terrvertex));
    tbDirect3D::EndScene();
    return TB_OK;
}

// __________________________________________________________________
// Initialisiert einen Level
tbResult CGame::InitLevel(int iLevel)
{

    m_bPaused = FALSE;
    m_bGameOver = FALSE;

    // Zeit zurücksetzen
    m_fLevelTime = 0.0f;

    return TB_OK;
}

wie man texturen benutzt weis ich aber über ein terrain????????????????????????
VielenVielenVielenVielenDank.
(Ihr sollt nicht den code dazuschreiben, wenn ihr aber wollt dann auch gut ;D)
MFG FrauBola
[/code]
Frau Bola Ist Dumm
(Deutschlehrer)

15

15.03.2004, 19:44

Kommt ganz darauf an was für eine Textur ihr benutzt. In einem Terrain habe ich nur eine Textur benutzt. Diese wird dann einfach 12 mal oder so über das Terrain gespannt. Eine andere Möglichkeit ist die Textur 1mal über das gesamte Terrain zu spannen und dann eine Detailmap drüber zu klatschen.

Je nach dem must du(ihr) die Texturkoordinaten entsprächend berechnen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

16

15.03.2004, 20:47

Noch ne andere (bessere) Methode is das Splatting, wenn du nich weisst was das ist, schau dir mal Warcraft3 an (besonders den (Land)Editor).

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

17

15.03.2004, 22:30

Du must auf jeden Fall deinem D3DFVF_TERRAIN noch D3DFVF_TEX0 hinzufügen und wenn du zwei Texturen übereinander (Detail Map von DragonMaster) haben willst auch noch D3DFVF_TEX1.

Dann musst du noch die terrvertex-Struktur um 2 (bzw. 4) float-Werte erweitern (zB: u0, v0, u1, v1).

Diese berechnest du einfach in jedem Durchlauf der grossen Schleife. Bei der Detailmap nimmst du immer die Koordinaten von 0 bis 1 auf beiden Achsen für ein Viereck und für die grosse Textur rechnest du in etwa sowas:

u= x/127
v= z/127

Eine Detailmap ist besonders zu empfehlen wenn du mit der Kamera oft nah am Boden bist. Ist das ganze zum Beispiel für eine Flugsimulation lohnt sich die Detailmap nicht unbedingt.

Beim rednern renderst du alle Vertices in einem bestimmten Umkreis mit Detailmap und alle anderen ohne (spart Rechenleistung ;) )
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

18

16.03.2004, 10:40

Zitat



Eine Detailmap ist besonders zu empfehlen wenn du mit der Kamera oft nah am Boden bist. Ist das ganze zum Beispiel für eine Flugsimulation lohnt sich die Detailmap nicht unbedingt.



Leider kann man auch mit einem Flugzeug tief fliegen oder gar starten oder landen ;)

Es ist wesentlich einfacher das Terrain aus großer Höhe gut aussehen zu lassen als von kurz drüber und gerade die großen Unterschiede sind schwierig in den Griff zu bekommen. Eine Detail Texture würde ich für jeden FluSi empfehlen.

Ghandi

Treue Seele

Beiträge: 218

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

19

16.03.2004, 11:54

Wie genau funktioniert das mit der Detail-map, is das eine riesiggrosse textur die über das Terrain gespannt wird (1 zu 1) oder is das irgendwas besonderes.

Das ist nämlich mein aktuelles Terraintexturing Problem, entweder ich nehm ne kleine TExtur die ich gannz oft "Tile", das sieht jedoch eintönig aus, oder ich nehm eine riessengrosse Textur, die ich 1 zu 1 drüberklatsche, was aber bei grossen Terrains bald schon an unmöglichkeit Grenzt, da so grosse texturen ganz schön am Speicher saugen, wie genau muss man das also machen.

Sorry das ich hier so den Thread poste, aber das passt hier nunmal ganz gut.
Alles ist gut so wie es ist, am besten ist jedoch das niemand dies akzeptiert.

error C2039: 'DerSinn' : ist kein Element von 'CLeben'

20

16.03.2004, 14:10

Eine Detailmap ist eigentlich nichts besonderes. Sie ist ebenfalls eine ganz normale Textur im 8Bit Graustufenformat. Die größe der Textur ist nicht so relevant. Sie sollte aber die 512x512 Gränze nicht überschreiten.

Ihre Aufgabe ist es Grobe Pixelbildung zu vermeiden und zusätzliche Details ins gelände zu bringen. Meist ist es. Man hat eine Grundtextur 512x512 z.B. die über das komplette Terrain gespannt wird. Dadurch entstehen natürlich grosse Pixel. Also spannt man die Detailmap darüber. Z.B. 12 mal. Dadurch werden die Pixel nicht mehr ganz so deutlich sichtbar.

Die Detailmap kann man z.B. mit ADDSIGNED mit der Basistextur verknüpfen.

@Terrain:
Battlefield macht das mit seinem Terrain so. Es werden 16 Basistexturen erzeugt. Jede 512x512 Pixel groß. Dadurch kommt es nicht zu so einer starken Pixelbildung bei den doch recht großen Terrains vo BF. Darüber wird dann noch mal eine Detailmap gespannt.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige