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
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() |
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; } |
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_ |
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); |
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »layle« (10.12.2014, 20:42)
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Hoppla ist mir gar nicht aufgefallen! Danke!Das ist übrigens kein Tetraeder. Das ist eine Pyramide und die hat nicht 4, sondern 5 Seiten.
Werbeanzeige