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

1

20.02.2007, 15:10

Wieder einmal die Kollisionskontrolle!

Hallo!
Ich würde gerne ein ganz kleines spiel programmieren!
Ich hab schonmal den anfang geuploadet damit ihr seht wie es aussieht :D . *lol*
Naja jetzt zur frage!
Wie bekomme ich eine "gute" kollisionskontrolle hin (mit den wänden)??
Im moment stehe ich da ziehmlich auf dem schlauch, da alles variable ist.
Hier mal der upload:
http://floclan.fl.funpic.de/Kollision.rar
(Ich hoffe der upload klappt)

Bitte um hilfe

Gruß Flo

2

20.02.2007, 15:12

sry der upload kommt später cya

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

3

20.02.2007, 15:43

das archiv ist defekt

4

20.02.2007, 17:44

Jo Hier hab es in 2 Teile aufgeteilt!
Einfach alles in ein Ordner kippen:
Part1 http://floclan.fl.funpic.de/Neuer%20Ordner/Kollision1.rar
Part2 http://floclan.fl.funpic.de/Neuer%20Ordner/Kollision2.rar

Gruß Flo

5

20.02.2007, 17:53

Ich nochmal ein paar fragen zu dem programm.
1) Wie funktioniert das mit der Kollisionskontrolle?
2) Warum ist das Licht so "dumm"? Mal Hell mal dunkel?
3) Wie bekomme ich die Linien weg von der Skybox??


Gruß Flo

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

6

20.02.2007, 20:53

zu 2) und 3) könntest du ein bisschen quelltext zeigen ^^

7

21.02.2007, 15:03

Mit dem Licht habe ich mir es sehr einfach gemacht ;).

C-/C++-Quelltext

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
class tLight
{

public: GLfloat LightPosition[4];
        GLfloat LightDiffuse[4];
        GLfloat LightAmbient[4];


        
        tLight();
        void init(Vector3D Position, Color Farbe);
        void enable();
      
};


tLight::tLight()
{
LightPosition[0]=10.0f;                                                          //x

LightPosition[1]=10.0f;                                                          //y

LightPosition[2]=10.0f;                                                          //z

LightPosition[3]=1.0f;

LightDiffuse[0]=1.0f;  
LightDiffuse[1]=1.0f;  
LightDiffuse[2]=1.0f;  
LightDiffuse[3]=1.0f;  

LightAmbient[0]=1;      
LightAmbient[1]=1; 
LightAmbient[2]=1; 
LightAmbient[3]=1.0f;    

  
}

void tLight::init(Vector3D Position, Color Farbe)
{

LightPosition[0]=Position.x;                                                          
LightPosition[1]=Position.y;                                                         
LightPosition[2]=Position.z;                                                        

LightDiffuse[0]=Farbe.R;  
LightDiffuse[1]=Farbe.G;  
LightDiffuse[2]=Farbe.B;  

glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);                        

glEnable(GL_LIGHT1);       
}

void tLight::enable()
{
glEnable(GL_LIGHTING);     
}


Und die Skybox ist einfach ein Würfel, wo sich die Kamera immer in der Mitte befindet!:

C-/C++-Quelltext

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
class tSkybox
{

public: UINT Texturen[6];
        
public: void init();
        void draw(Vector3D Position);
};


void tSkybox::init()
{

BMP(Texturen, "Skybox/up.bmp", 0);
BMP(Texturen, "Skybox/down.bmp", 1);
BMP(Texturen, "Skybox/back.bmp", 2);
BMP(Texturen, "Skybox/front.bmp", 3);
BMP(Texturen, "Skybox/left.bmp", 4);
BMP(Texturen, "Skybox/right.bmp", 5);

}

void tSkybox::draw(Vector3D Position)
{

glPushMatrix();            
glBindTexture(GL_TEXTURE_2D, Texturen[0]);

glTranslatef(Position.x,Position.y,Position.z);    

glDisable(GL_LIGHTING);
glBegin(GL_QUADS);

glTexCoord2f(1.0f, 1.0f); glVertex3f(-500,500,500); 
glTexCoord2f(1.0f, 0.0f); glVertex3f(500,500,500); 
glTexCoord2f(0.0f, 0.0f); glVertex3f(500,500,-500); 
glTexCoord2f(0.0f, 1.0f);  glVertex3f(-500,500,-500); 

glEnd();
glEnable(GL_LIGHTING);

glPopMatrix();
//---------------Fornt----------------------------------------------------------

glPushMatrix();            
glBindTexture(GL_TEXTURE_2D, Texturen[3]);

glTranslatef(Position.x,Position.y,Position.z);    

glDisable(GL_LIGHTING);
glBegin(GL_QUADS);

glTexCoord2f(1.0f, 1.0f);  glVertex3f(-500,500,500); 
glTexCoord2f(0.0f, 1.0f);glVertex3f(500,500,500); 
glTexCoord2f(0.0f, 0.0f); glVertex3f(500,-500,500); 
glTexCoord2f(1.0f, 0.0f); glVertex3f(-500,-500,500); 

glEnd();
glEnable(GL_LIGHTING);

glPopMatrix();
     
//---------------Back-----------------------------------------------------------

glPushMatrix();            
glBindTexture(GL_TEXTURE_2D, Texturen[2]);

glTranslatef(Position.x,Position.y,Position.z);    

glDisable(GL_LIGHTING);
glBegin(GL_QUADS);

glTexCoord2f(0.0f, 1.0f); glVertex3f(-500,500,-500); 
glTexCoord2f(1.0f, 1.0f); glVertex3f(500,500,-500); 
glTexCoord2f(1.0f, 0.0f); glVertex3f(500,-500,-500); 
glTexCoord2f(0.0f, 0.0f); glVertex3f(-500,-500,-500); 

glEnd();
glEnable(GL_LIGHTING);

glPopMatrix();     

//---------------Links-----------------------------------------------------------

glPushMatrix();            
glBindTexture(GL_TEXTURE_2D, Texturen[4]);

glTranslatef(Position.x,Position.y,Position.z);    

glDisable(GL_LIGHTING);
glBegin(GL_QUADS);

glTexCoord2f(0.0f, 1.0f); glVertex3f(-500,500,500); 
glTexCoord2f(1.0f, 1.0f); glVertex3f(-500,500,-500); 
glTexCoord2f(1.0f, 0.0f); glVertex3f(-500,-500,-500); 
glTexCoord2f(0.0f, 0.0f); glVertex3f(-500,-500,500); 

glEnd();
glEnable(GL_LIGHTING);

glPopMatrix();  

//---------------Rechts---------------------------------------------------------

glPushMatrix();            
glBindTexture(GL_TEXTURE_2D, Texturen[5]);

glTranslatef(Position.x,Position.y,Position.z);    

glDisable(GL_LIGHTING);
glBegin(GL_QUADS);

glTexCoord2f(1.0f, 1.0f);  glVertex3f(500,500,500); 
glTexCoord2f(0.0f, 1.0f);  glVertex3f(500,500,-500); 
glTexCoord2f(0.0f, 0.0f);  glVertex3f(500,-500,-500); 
glTexCoord2f(1.0f, 0.0f);  glVertex3f(500,-500,500); 

glEnd();
glEnable(GL_LIGHTING);

glPopMatrix();  




glPushMatrix();            
glBindTexture(GL_TEXTURE_2D, Texturen[1]);

glTranslatef(Position.x,Position.y,Position.z);    

glDisable(GL_LIGHTING);
glBegin(GL_QUADS);

glTexCoord2f(1.0f, 0.0f); glVertex3f(-500,-500,500); 
glTexCoord2f(1.0f, 1.0f); glVertex3f(500,-500,500); 
glTexCoord2f(0.0f, 1.0f); glVertex3f(500,-500,-500); 
glTexCoord2f(0.0f, 0.0f);  glVertex3f(-500,-500,-500); 

glEnd();
glEnable(GL_LIGHTING);

glPopMatrix();

}


Dann die sehr unglückliche kollisionskontrolle:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool tPlayerCam::kollision(t3Dmap Map)
{

for (int i=0; i<500; i++)
{

if (!Map.Objekte[i].free && Map.Objekte[i].typ==1)
{
    
if (distanz(Position,Map.Objekte[i].Position)<4)
{
return true;         
}
         
}
    
}

return false;     
}


Nur ein Ausschnitt aus der Klasse ;)

Gruß Flo

Firefly

Alter Hase

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

8

21.02.2007, 17:44

diese Kollision ist doch total...resourcenlastig:
Als Tipp würd ich dir zwei Sachen empfehlen:
1.) du könntest einfach mal die betreffenden Polygone durch ein Viewfrustrum heraussortieren, und dann einen Kollisionstest mit obigen machen
2.) (schwieriger, und ich weiß auch nicht ob für dein spiel geeignet), du implementierst a) einen Octree oder b) einen BSP-Baum

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

9

21.02.2007, 19:50

ich denke für das labyrinth reicht der brute-force ansatz ^^ :D

10

21.02.2007, 21:00

Glaub ich auch ;).
Also nochmal mein problem mmit der Kollision:
1) Kollisionsüberprüfung an einer strecke
2) "Abstoßen" von dem Block in die richtige richtung! (man soll also nicht einfach in den Block hinein kommen! sondern dran entlang sliden!)

Gruß Flo

Werbeanzeige