Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

C-Kurs/DreiD/Musterlösung

< C-Kurs‎ | DreiD
Version vom 17. September 2010, 09:47 Uhr von AndyF (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include "screen.h"


/* Rotationsgeschwindigkeiten (frei wählbar) */

#define ROT_V_ALPHA 0.1f

#define ROT_V_BETA 0.03f

#define LIGHT_V_ALPHA 0.0f

#define LIGHT_V_BETA 0.0f
/* Drahtgitter-Modus: 1=an, 0=aus */
#define WIREFRAMES_MODE 1



/* 3x3-Matrix-Repräsentation als 2-dimensionales Array */

typedef float Matrix[3][3];


/* Aktuelle Transformation */

Matrix transform;


/* Aktuelle Zeichenfarbe mit Werten zwischen 0 und 1 */

float color_r;

float color_g;

float color_b;


/* Aktueller Lichtvektor */

float lgt_x;

float lgt_y;

float lgt_z;



/* --- Prototypen --- */

/* Gibt eine 3x3-Matrix aus und beendet das Programm */
void print_matrix(Matrix matrix);
/* Gibt einen Vektor, bestehend aus 3 floats, aus und beendet das Programm */

void print_vector(float x, float y, float z);




/*
Bildet aus zwei Winkeln die resultierende Transformationsmatrix
*/

void refresh_transformation_matrix(float alpha, float beta)

{


     /* Rotationsmatrizen */

     Matrix rot_x = {

                     {     1.0f    ,    0.0f    ,    0.0f    },

                     {     0.0f    ,  cos(beta) , -sin(beta) },

                     {     0.0f    ,  sin(beta) ,  cos(beta) }

                    };

     
     //... (rot_y)
                    
     /* Matrix-Multiplikation */


     //...
     
     

}


/*
Rotiert den gegebenen Vektor, bestehend aus 3 Floats, entsprechend der aktuellen transform-Matrix
*/

void apply_transform(float * x,float * y,float * z)

{
    float h_x = *x;
    float h_y = *y;
    float h_z = *z;
    /* Transformation anwenden */

    *x = h_x;

    *y = h_y;

    *z = h_z;

}


/*
Zeichnet ein dreidimensionales Dreieck auf die zweidimensionale Fläche entsprechend der aktuellen transform-Matrix
*/

void render_primitive(float x1,float y1,float z1, float x2,float y2,float z2, float x3,float y3,float z3)

{

    /* Koordinaten transformieren */

    apply_transform(&x1,&y1,&z1);

    apply_transform(&x2,&y2,&z2);

    apply_transform(&x3,&y3,&z3);
    

    /* Culling */
    

    //...

    
    /* Dreiecke zeichnen */

    set_color(color_r, color_g, color_b);    
    if(WIREFRAMES_MODE)
    {
        draw_line(x1,y1, x2,y2);
        draw_line(x2,y2, x3,y3);
        draw_line(x3,y3, x1,y1);
    }else

        draw_triangle(x1,y1, x2,y2, x3,y3);

}






/* ----------------Ab hier alles Vorlage---------------- */




/* Aktuelle Rotationen */

float trf_alpha = 0;

float trf_beta = 0;

float lgt_alpha = 0;

float lgt_beta = 0;
/* Anzahl der bisher gezeichneten Frames */
int c_time = 0;


/*
Gibt eine 3x3-Matrix aus und beendet das Programm
*/
void print_matrix(Matrix matrix)

{

     printf("%f  %f  %f\n",matrix[0][0],matrix[0][1],matrix[0][2]);

     printf("%f  %f  %f\n",matrix[1][0],matrix[1][1],matrix[1][2]);

     printf("%f  %f  %f\n",matrix[2][0],matrix[2][1],matrix[2][2]);

     system("PAUSE");

     exit(EXIT_SUCCESS);

}


/*
Gibt einen Vektor, bestehend aus 3 floats, aus und beendet das Programm
*/

void print_vector(float x, float y, float z)

{

     printf("%f  %f  %f\n",x,y,z);

     system("PAUSE");

     exit(EXIT_SUCCESS);

}


/*
Setzt die aktuelle Farbe für nachfolgende render_* Aufrufe
*/

void refresh_color(float r,float g, float b)

{

     color_r = r;

     color_g = g;

     color_b = b;

}

/*
Rendert dreidimensionale viereckige Fläche (bestehend aus zwei Dreiecken) 
*/
void render_face(float x1,float y1,float z1, float x2,float y2,float z2, float x3,float y3,float z3, float x4,float y4,float z4)

{

    render_primitive(x1,y1,z1,x2,y2,z2,x3,y3,z3);

    render_primitive(x1,y1,z1,x3,y3,z3,x4,y4,z4);

}


/*
Komplette Ausgabe
*/
void output()

{
    /* Transformation aktualisieren */

    refresh_transformation_matrix(trf_alpha,trf_beta);


    /* Licht-Vektor setzen */

    lgt_x = cos(lgt_beta);

    lgt_y = sin(lgt_beta);

    lgt_z = sin(lgt_alpha)*lgt_x;   
    lgt_x = cos(lgt_alpha)*lgt_x;
        

    /* Szene rendern */ 

    begin_scene();

    refresh_color(1,0,0);

    render_face(-1,-1,1, 1,-1,1, 1,1,1, -1,1,1); //Front
    render_face(1,-1,-1, -1,-1,-1, -1,1,-1, 1,1,-1); //Back
    refresh_color(1,1,0);

    render_face(-1,-1,1, -1,1,1, -1,1,-1, -1,-1,-1); //Left

    render_face(1,1,1, 1,-1,1, 1,-1,-1, 1,1,-1); //Right

    refresh_color(1,0.5,0);

    render_face(1,-1,1, -1,-1,1, -1,-1,-1, 1,-1,-1); //Top
    render_face(-1,1,1, 1,1,1, 1,1,-1, -1,1,-1); //Bottom 

    end_scene();

}



int main(void)

{
    /* Fenster initialisieren */

    if(create_window(400,400,0x220000) != 0){

        printf("Fehler beim Fenster Erstellen. Bitte wende dich an einen Tutor.\n");

        return EXIT_FAILURE;

    }

    /* Startwerte setzen */
    zoom = 0.5;

    trf_alpha = M_PI/2;

    trf_beta = M_PI/3;

    lgt_alpha = M_PI*2/3;

    lgt_beta = -M_PI/4;


    /* Figur wiederholt rendern */

    while(1)

    {
        trf_alpha += ROT_V_ALPHA;

        trf_beta += ROT_V_BETA;
        lgt_alpha += LIGHT_V_ALPHA;

        lgt_beta += LIGHT_V_BETA;

    	output();
    	c_time++;

    	usleep(50000);

    }



    /* Programmende */    

    close_window();

    return EXIT_SUCCESS;

}