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.12.2014, 20:00

OpenGL C++ Würfel zu Tetraeder

Hallo wiedereinmal :D
Ich hab den Code für einen Würfel und scheitere die ganze Zeit den Code so zu ändern, dass es einen Tetraeder gibt.
kann mir da jemand helfen und vielleicht auch den Code demäntsprechend ändern aber Tips sind auch sehr willkommen.
Code:
Cube.cpp

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
//===========================================================================
// Dreidimensionale Körper
//===========================================================================

//===========================================================================
// includes
//===========================================================================

// Deklaration einbinden
#include "cube.h"

// GL Bibliothek einbinden (je nach Betriebssystem)

#ifdef WIN32
    #include <windows.h>
    #include <GL/gl.h>
#else
    #include <OpenGL/gl.h>
#endif

#include <stdlib.h> // rand(), RAND_MAX


//===========================================================================
// implementierung
//===========================================================================

CCube::CCube()
{
    // Attribute mit Standardwerten initialisieren
    m_divisions = 1;    // Anzahl Cubes
    m_rotation  = 0.0f;
    m_rotationTime = 30.0f;
}


CCube::~CCube()
{
    // nichts aufzuräumen
}


void CCube::update(float time)
{
    // Rotation des Objekls weiterbewegen (in Grad)
    m_rotation += 360.0f * time / m_rotationTime;
}


void CCube::render()
{
    // Körper rotieren
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glRotatef(m_rotation, 0.0f, 1.0f, 0.0f);

    // Linienzeichnen einleiten
    glBegin(GL_LINES);

    // Verschachtelte For-Schleifen, um das Rechteck
    // mit einer bestimmten Anzahl an Unterteiolungen
    // zu druchlaufen
    for (unsigned int j = 0; j <= m_divisions; j++)
    {
        // Unterteilungspunkt b zwischen -1 und 1 berechnen
        float b = float(j)/float(m_divisions)*2.0f - 1.0f;

        for (unsigned int i = 0; i <= m_divisions; i++)
        {
            // Unterteilungspunkt a zwischen -1 und 1 berechnen
            float a = float(i)/float(m_divisions)*2.0f - 1.0f;

            // Linie in x-Richtung zeichnen
            glVertex3f(-1, a, b);
            glVertex3f( 1, a, b);

            // Linie in y-Richtung zeichnen
            glVertex3f(a, -1, b);
            glVertex3f(a,  1, b);

            // Linie in z-Richtung zeichnen
            glVertex3f(a, b, -1);
            glVertex3f(a, b,  1);
        }
    }

    // Ende der Linien
    glEnd();

    // Alte Transformation wiederherstellen (Rotation löschen)
    glPopMatrix();

} // render()


main.cpp

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
//===========================================================================
// Dreidimensionale Körper
//===========================================================================

//===========================================================================
// includes
//===========================================================================

// GL und GLUT Bibliotheken einbinden (je nach Betriebssystem)

#ifdef WIN32
    #include <windows.h>
    #include <GL/gl.h>
    #include "GL/glut.h"
#else
    #include <GLUT/glut.h>
#endif

#include "cube.h"

#include <stdlib.h> // exit()


//===========================================================================
// Globale variablen
//===========================================================================

int   glutWindow = 0;
CCube cube;


//===========================================================================
// OpenGL Zeichenfunktion
//===========================================================================

void transform(unsigned int width, unsigned int height)
{
    // OpenGL Transformationen initialisieren...
    // Ausgabefenstergröße setzen
    glViewport(0, 0, (GLint)width, (GLint)height);

    // Transformationen für 3D-Koordinaten bearbeiten
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    // Kameraposition setzen
    gluLookAt(0.0, 0.0, 4.0,  // von wo
            0.0, 0.0, 0.0,  // nach wo
            0.0, 1.0, 0.0); // wo ist oben?

    // Perspektivische Projektion bearbeiten
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    // Verhältnis Breite zu Höhe (aspect) berechnen
    GLdouble aspect = (GLdouble)width / (GLdouble)height;
    
    // Kameraperspektive setzen
    gluPerspective(53,          // Öffnungswinkel vertikal (field of view)
                aspect,     // aspect ratio setzen
                0.001, 10.0); // nahe und ferne Begrenzungsebene setzen
}


//===========================================================================
// GLUT callback funktionen
//===========================================================================

void display(void)
{
    // Ausgabefenster in schwarz löschen
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // Transformationen vor dem Zeichnen setzen
    transform(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));

    // Würfelrotation aktualisieren (angenommen: 60Hz)
    cube.update(1.0f / 60.0f);

    // Zeichnen
    glColor3f(0.6f, 0.8f, 0.4f);
    cube.render();

    // Hintergrundpuffer anzeigen
    glutSwapBuffers();
}


void idle(void)
{
    // nochmaliges Zeichnen einleiten
    if (glutWindow != 0) glutPostRedisplay();
}


void keyboard(unsigned char key, int x, int y)
{
    // Fenster schließen
    glutDestroyWindow(glutWindow);
    glutWindow = 0;

    // Programm beenden (etwas unsauber)
    exit(0);
}


//===========================================================================
// Hauptroutine
//===========================================================================

int main(int argc, char* argv[])
{
    // GLUT initialisieren
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    // Fenster öffnen
    glutWindow = glutCreateWindow("Wuerfel");

    // GLUT Funktionen für Zeichnen, Leerlauf, Tastatur und Maus setzen
    glutDisplayFunc(display);
    glutIdleFunc(idle);
    glutKeyboardFunc(keyboard);

    // Vollbildmodus ohne Mauszeiger
    glutFullScreen();
    glutSetCursor(GLUT_CURSOR_NONE);

    // Tiefenpuffer-Test einschalten
    glEnable(GL_DEPTH_TEST);

    // Hauptschleife des Programms aufrufen
    glutMainLoop();

    // Bis hierhin kommt das Programm nicht
    return 0;
}


Cube.h

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
//===========================================================================
// Dreidimensionale Körper
//===========================================================================

// mehrfaches Einbinden durch Präprozessor verhindern
#ifndef _CUBE_H_
#define _CUBE_H_


//===========================================================================
// Klassendeklaration
//===========================================================================

// Würfelklasse
class CCube
{
  // Nachfolgende Elemente sind öffentlich
  public:

    /// Konstruktor
    CCube();

    /// Destruktor virtuell, d.h. alles bereit zum Ableiten
    virtual ~CCube();

    /// aktualisieren
    void update(float time);

    /// Zeichnen
    void render();

  // Nachfolgende Elemente sind geschützt
  protected:

    unsigned int m_divisions;   ///< Unterteilungen der Achsen
    float       m_rotation;     ///< Rotation des Würfels in Grad
    float       m_rotationTime; ///< Rotationszeit des Würfels in Sekunden

}; // Klassendeklaration auch mit Semikolon abschließen

#endif // _CUBE_H_

2

10.12.2014, 20:12

Hab ich auch herausgefunden... Poste den Code mit Erklärung gleich

Hier die Tabelle:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
// Linie in x-Richtung zeichnen
            glVertex3f(-1, 0.2, 0.2);
            glVertex3f(1, a, b);

            // Linie in y-Richtung zeichnen
            glVertex3f(a, -1, b);
            glVertex3f(a, 1, b);

            // Linie in z-Richtung zeichnen
            glVertex3f(a, b, -1);
            glVertex3f(a, b, 1);

Jedoch stehe ich nun vor einem anderen Problem:
Es hat noch ein Quadrat vor dem Tetraeder. Hab ein Bild davon hinzugefügt.
Wie krieg ich das Quadrat weg?
»layle« hat folgendes Bild angehängt:
  • PROBLEM SPIELPROGRAMMIERER.DE.JPG

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »layle« (10.12.2014, 20:42)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

10.12.2014, 20:59

Das ist übrigens kein Tetraeder. Das ist eine Pyramide und die hat nicht 4, sondern 5 Seiten.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

4

10.12.2014, 21:10

Das ist übrigens kein Tetraeder. Das ist eine Pyramide und die hat nicht 4, sondern 5 Seiten.
Hoppla ist mir gar nicht aufgefallen! Danke! :dash:

Werbeanzeige