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

10.01.2007, 20:36

2D->3D

Hallo!
Ich brauche hilfe!
Ich habe nun rausgefunden dass wenn die Kamera die Position (0,0,-40) hat und er Blickpunkt (0,0,0) ist, dass das Quadrat den Bildschirm völlig füllt diese Vektoren haben muss:

C-/C++-Quelltext

1
2
3
4
5
6
7
#define Screenx 20.7
#define Screeny 16.58

glVertex3f(-Breite, Hoehe, 0.0f);       // Top Left

glVertex3f( Breite, Hoehe, 0.0f);       // Top Right

glVertex3f( Breite,-Hoehe, 0.0f);       // Bottom Right

glVertex3f(-Breite,-Hoehe, 0.0f);       // Bottom Left


Das kommt ziehmlich genau bei einer Auflösung von 1280*1024 raus.

Jetzt zwei fragen:
1. Wie kann ich das unabhängig von der Auflösung hinbekommen?
2. (die wichtigere) wie kann ich nun nicht nur ein Hintergrund zeichnen sondern auch ein Quadrat mit einem 2D Positionvektor (z.B. 200 px, 100 px)??

Das ist das einzige was ich zustande gebracht habe:

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
#define Screenx 20.7
#define Screeny 16.58

class t2D
{
      
      private: UINT textur[1];
               tVertex2D Pos;
               GLfloat b,h;
               bool bg;
      
      public: void init(char *filename, tVertex2D p, GLfloat breite, GLfloat hoehe);
              void init(char *filename);
              void draw(GLfloat e);
      
      };


void t2D::init(char *filename, tVertex2D p, GLfloat breite, GLfloat hoehe){  //Ein Quadrat


BMP_Texture(textur, filename, 0);     
b=breite;
h=hoehe;
Pos=p;
bg=false;
}


void t2D::init(char *filename){ //Einfach der Hintergrund


BMP_Texture(textur, filename, 0); 
bg=true;
     
}

void t2D::draw(GLfloat e){ //Die Ebene (sehr klein!!! z.B. 0.0001f


if (bg){
GLfloat Breite=Screenx;
GLfloat Hoehe=Screeny;

glBindTexture(GL_TEXTURE_2D, textur[0]);
glTranslatef(0.0f,0.0f,0.0f+e);     
glBegin(GL_QUADS);          
    glTexCoord2f(0.0f, 1.0f); glVertex3f(-Breite, Hoehe, 0.0f);     // Top Left

     glTexCoord2f(1.0f, 1.0f);glVertex3f( Breite, Hoehe, 0.0f);     // Top Right

    glTexCoord2f(1.0f, 0.0f); glVertex3f( Breite,-Hoehe, 0.0f);     // Bottom Right

    glTexCoord2f(0.0f, 0.0f); glVertex3f(-Breite,-Hoehe, 0.0f);     // Bottom Left

 glEnd();
}


}

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

2

10.01.2007, 20:50

Wenn du das Buch von David hast: Schau mal unter "transformierte Vertices"

Andere Möglichkeit:
Setz die Projektionsmatrix auf die Identitätsmatrix und dann kannst du auflösungsunabhängig im Bereich -1 <= x <= 1 , -1 <= y <= 1 , 0 <= z <= 1

Mit der z-Koordinate kannst du dann bestimmen, welche Bilder "weiter oben" (also über den anderen) liegen.

EDIT: Sehe gerade dass das ja OpenGL ist. Da hab ich keine Ahnung aber die haben sicher auch Projektionsmatrizen und dann sollte das genau gleich funktionieren...
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.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

10.01.2007, 21:04

alle matritzen auf identity setzen, dann kannst du direkt in device koordianten zeichnen (wie von big_muff erwähnt, nur dass z in ogl afaik auch von -1 bis 1 geht).
ich bin mir sicher, dass es auch in ogl die möglichkeit gibt, mit transformierten vertices zu zeichnen. notfalls kann man sich das auch einfach nachbauen, wenn man die abmessungen des viewport kennt.

sonst solltest du dich mal auf http://nehe.gamedev.net umsehen, ich kann mir nicht vorstellen, dass es dort kein tutorial dazu gibt ;)

4

11.01.2007, 15:37

So weit ich geguckt habe habe ich da nichts gefunden.
Gruß Flo
ps: bei opengl habe ich noch nicht mit einer matrix gearbeitet, da es gute hilfs funktionen gibt für rotieren, skalieren und transformieren!

[HINZU]
Das ist dann mal die Perspective:
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,1.0f,1000.0f);

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

5

17.01.2007, 20:18

Zitat von »"F-Wölkchen"«


Das ist dann mal die Perspective:
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,1.0f,1000.0f);

1000.0f als entfernung für die far clipping plane anzugeben ist nicht so gut.

um ein rechteck mit 2d-coordinaten zu erstellen, dass auch ins viewport raster passt, verwende anstatt gluPerspective() glOrtho() oder auch gluOrtho2D().

void glOrtho(left, right, bottom, top, near, far)
(alle paramter als double)

anstatt einer perspektivischen erstellst du so eine parallele projektion.
mit den paramtern (left, right, bottom, top) legst du die größe der clipping planes fest, deren entfernung zum viewport du mit near und far angibst.
die planes werden dann auf deinen viewport gemappt.

mit glVertex2*(...) kannst du dann dein rechteck malen.

Werbeanzeige