OpenGL- trójkąt który nie jest trójkątem

OpenGL- trójkąt który nie jest trójkątem
EV
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:25
0

Cześć,
mam taki program który wyświetla trójkąt z teksturą. Trójkąt można obrócić za pomocą myszki. Jednak gdy na samym początku uruchomimy program, to trójkąt wygląda tak jak w załączniku. Dopiero po kliknięciu myszką i obracaniu go przyjmuje kształt trójkąta.. dlaczego tak jest?

Kopiuj
 /* System */
#include<windows.h>
#include<stdio.h>
#include<math.h>
/* Główna bibloteka OpenGL */
#include<GL/gl.h>
/* Biblioteka GLUT */
#include<GL/glut.h>


/* Deklaracje funkcji narzędziowych */
void MouseMotion(GLsizei x, GLsizei y);
void MouseFunc(int button, int state, int x, int y);

GLbyte *LoadTGAImage(const char *FileName, GLint *ImWidth, GLint *ImHeight, GLint *ImComponents, GLenum *ImFormat);
/* Funkcja do rysowania */
void DrawScene(void);
/* Prototyp fukcji rysujšcej osie ukłšdu */
void DrawSceneAxes(void);

/* Funkcja do inicjacji OpenGLa */
void InitOpenGL(void);

/* Funkcja wywoływana w momentach zmiany rozmiarów okna */
void ReshapeWindow(int width, int height);

/* Deklaracja globalnych zmiennych */

GLfloat theta = 0.0f;   
GLfloat fi = 0.0f;     
GLfloat r = 20.0f;      
GLfloat zoom = 0.0f;   

    
GLfloat rotx = 5.0f;
GLfloat roty = 5.0f;
GLfloat rotz = 5.0f;
GLint lbutton_status = 0; 
GLint rbutton_status = 0;   
GLfloat pixelsangle = 0.0; 

GLint x_last_pos = 0;
GLint y_last_pos = 0;
GLint x_delta = 0;
GLint y_delta = 0;

// Pozycja obserwatora
GLfloat viewer_pos[] = { 0.0, 0.0, 20.0 };

/* Globalny identyfikator głównego okna programu */
int mainWindow;

/* Funkcja main */
int main(int argc, char **argv)
{
	// Inicjujemy bibliotekę GLUT
	glutInit(&argc, argv);
	// Inicjujemy: format koloru, dwa bufoy ramki
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
	// Ustawiamy poczštkowe wymiary okna
    glutInitWindowSize(800, 600);
	// Ustawiamy pozycję okna - lewy górny narożnik
	glutInitWindowPosition(150,150);
	// Tworzymy główne okno programu
    mainWindow = glutCreateWindow("Lab4");
    

	// Sprawdzamy powodzenie operacji
	if(mainWindow == 0){
		puts("Nie mozna stworzyc okna!!!\nWyjscie z programu.\n");
		exit(-1);
	}
	// Czynimy aktywnym okno główne programu
	glutSetWindow(mainWindow);

	// Tutaj rejestrujemy funkcje narzędziowe - tzw. callbacks
	glutDisplayFunc(DrawScene);
	glutReshapeFunc(ReshapeWindow);
	glutMouseFunc(MouseFunc);      
    glutMotionFunc(MouseMotion);
	
	// Ustawienia poczštkowe
	InitOpenGL();

	// Włšczamy mechanizm usuwania niewidocznych powierzchni
	glEnable(GL_DEPTH_TEST);

	// Wej?cie do pętli programu
	glutMainLoop();
	
	return(0);
}

/* W tej funkcji okre?lamy to co ma byc narysowane na ekranie.
 * Jest wywoływana zawsze wtedy, gdy trzeba przerysować ekran - bufor ramki.
 */
 
 // Obsluga myszy
void MouseFunc(int button, int state, int x, int y)
{
    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
    {
        x_last_pos = x;
        y_last_pos = y;
        lbutton_status = 1;
    }
    else
    {
        lbutton_status = 0;
    }
    
    if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
    {
        y_last_pos = y;
        rbutton_status = 1;
    }
    else
    {
        rbutton_status = 0;
    }
}

void MouseMotion(GLsizei x, GLsizei y)
{
    x_delta = x - x_last_pos;
    y_delta = y - y_last_pos;
    x_last_pos = x;
    y_last_pos = y;
    glutPostRedisplay();
}

void DrawScene(void)
{
	// Czy?cimy okno aktualnym (domy?lnym) kolorem oraz resetujemy bufor głębi 
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	// Resetujemy bieżšcš macierz
	glLoadIdentity();

	// Definiujemy położenie obserwatora
	gluLookAt(rotx+zoom,roty,rotz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 
	// Rysujemy osie układu
	DrawSceneAxes();	

	// Zamieniamy bufory ramki
	glutSwapBuffers();

}

/* Ta funkcja jest wywoływana przez funkcję DrawScene.
 * Jej zadaniem jest rysowanie konkretnych obiektów osi układu 
 * współrzędnych.
 */
void DrawSceneAxes(void)
{
	// Definiujemy nowy typ jako tablicę 3-elementowš
	typedef float pt3d[3];

	// Poczštek i koniec osi X
	pt3d x_beg = { -10.0f, 0.0f, 0.0f };
	pt3d x_end = {  10.0f, 0.0f, 0.0f };

	// Poczatek i koniec osi Y
	pt3d y_beg = { 0.0f, -10.0f, 0.0f };
	pt3d y_end = { 0.0f,  10.0f, 0.0f };

	// Poczštek i koniec osi Z
	pt3d z_beg = { 0.0f, 0.0f, -10.0f };
	pt3d z_end = { 0.0f, 0.0f,  10.0f };

    if (lbutton_status == 1)
    {
        theta += (y_delta*pixelsangle)*(0.01);
        fi+= (x_delta*pixelsangle)*(0.01);
        
        //Obroc
        rotx = r*cos(theta)*cos(fi);
        roty = r*sin(theta);
        rotz = r*cos(theta)*sin(fi);
    }
    if (rbutton_status == 1)
    {
        zoom += y_delta*(0.01);
    }
    
   	glColor3f(1.0f, 1.0f, 1.0f);
   	glBegin(GL_TRIANGLES);
        glTexCoord2f(0.0f, 0.0f);
        glVertex3f( -5.0f, -5.0f, 0.0f);
        glTexCoord2f(0.0f, 1.0f);
        glVertex3f( 5.0f, -5.0f, 0.0f);
        glTexCoord2f(1.0f, 1.0f);
        glVertex3f( 5.0f, 5.0f, 0.0f);
        glTexCoord2f(1.0f, 0.0f);
    glEnd();
  //  glutSolidTeapot(4.0); 
  //  glEnd();
}

/* Ta funkcja służy do wstępnej konfiguracji OpenGLa.
 * Zanim co? narysujemy musimy wywołać tę funkcję.
 */
void InitOpenGL(void)
{
    GLint ImHeight, ImWidth, ImComponents;
    GLenum ImFormat;
    GLbyte *pBytes;

    //Teksturowanie bÍdzie prowadzone tyko po jednej stronie úciany
    glEnable(GL_CULL_FACE);
   // glCullFace(GL_FRONT);
    //Przeczytanie obrazu tekstury z pliku o nazwie tekstura.tga
    pBytes = LoadTGAImage("tekstura.tga", &ImWidth, &ImHeight, &ImComponents, &ImFormat);
    //Zdefiniowanie tekstury 2-D
    glTexImage2D(GL_TEXTURE_2D, 0, ImComponents, ImWidth, ImHeight, 0, ImFormat, GL_UNSIGNED_BYTE, pBytes);
    //Zwolnienie pamiÍci
    free(pBytes);
    //W??czenie mechanizmu teksturowania
    glEnable(GL_TEXTURE_2D);
    //Ustalenie trybu teksturowania
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    //Okreúlenie sposobu nak?adania tekstur
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    
    
	// Ustawiamy domy?lny, czarny kolor tła okna - bufor ramki malujemy na czarno
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
	
    GLfloat mat_ambient[] = {1.0, 1.0, 1.0, 1.0}; //wspolczynniki ka =[kar,kag,kab] dla swiatla otoczenia
    GLfloat mat_diffuse[] = {1.0, 1.0, 1.0, 1.0}; //wspolczynniki kd =[kdr,kdg,kdb] swiatla rozproszonego
    GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0}; // wspolczynniki ks =[ksr,ksg,ksb] dla úswiatla odbitego
    GLfloat mat_shininess = {20.0}; // wspolczynnik n opisujący polysk powierzchni
    
    // Definicja zrodla swiatla
    GLfloat light_position[] = {0.0, 0.0, 10.0, 1.0}; //polozenie zrodla
    //skladowe intensywnosci swiecenia zrodla swiatla otoczenia - Ia = [Iar,Iag,Iab]
    GLfloat light_ambient[] = {0.1, 0.1, 0.1, 1.0};
    //skladowe intensywnoúci swiecenia zrodla swiatla powodujacego odbicie dyfuzyjne Id = [Idr,Idg,Idb]
    GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0};
    //skladowe intensywnoúci swiecenia zrodla swiatla powodujacego odbicie kierunkowe Is = [Isr,Isg,Isb]
    GLfloat light_specular[]= {1.0, 1.0, 1.0, 1.0};
    //skladowa stala ds dla modelu zmian oswietlenia w funkcji odleglosci od zrodla
    GLfloat att_constant = {1.0};
    //skladowa liniowa dl dla modelu zmian oswietlenia w funkcji odlegosci od zrodla
    GLfloat att_linear = {0.05};
    //skladowa kwadratowa dq dla modelu zmian oswietlenia w funkcji odleglosc od zrodla
    GLfloat att_quadratic = {0.001};

    // Ustawienie patrametrUw materialu
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialf(GL_FRONT, GL_SHININESS, mat_shininess);
    
    // Ustawienie parametrow zrodla
    glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, att_constant);
    glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, att_linear);
    glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, att_quadratic);
    
    // Ustawienie opcji systemu oswietlania sceny
    glShadeModel(GL_SMOOTH);// wlaczenie lagodnego cieniowania
    glEnable(GL_LIGHTING);//wlaczenie systemu oúwietlenia sceny
    glEnable(GL_LIGHT0);    // wlaczenie zrodla o numerze 0
    glEnable(GL_DEPTH_TEST);     //wlaczenie mechanizmu z-bufora
}

/*Ta funkcja ustawia perspektywę - jej odpowiednikiem w starszych implementacjach openGL jest gluPerspective
*/
void perspectiveGL( GLdouble fovY, GLdouble aspect, GLdouble zNear, GLdouble zFar )
{
    const GLdouble pi = 3.1415926535897932384626433832795;
    GLdouble fW, fH;
    
    fH = tan( fovY / 360 * pi ) * zNear;
    fW = fH * aspect;

    glFrustum( -fW, fW, -fH, fH, zNear, zFar );
}

/* Tę funkcję wywołuje system w momencie gdy użytkownik zmieni myszš
 * rozmiar głównego okna. jej zadaniem jest zachowanie proporcji wymiarów
 * rysowanych obiektów niezależnie od wymiarów okna.
 */ 
void ReshapeWindow(int width, int height)
{
	pixelsangle = 360.0f/(float)width;     
	// Ustawiamy układ współrzędnych obserwatora
    glMatrixMode(GL_PROJECTION); 

	// Resetujemy macierz projkecji 
    glLoadIdentity();

	// Ustawiamy perspektywę
	perspectiveGL(80.0, 1.0, 1.0, 100.0);
    
	// Korekta  
    if(width <= height)
		glViewport(0, (height - width)/2, width, width);  
     else
		glViewport((width - height)/2, 0, height, height); 
 
	// Ustawiamy macierz modelu
    glMatrixMode(GL_MODELVIEW);
    
	// Resetujemy macierz modelu
    glLoadIdentity();
	
}

GLbyte *LoadTGAImage(const char *FileName, GLint *ImWidth, GLint *ImHeight, GLint *ImComponents, GLenum *ImFormat)
{
    // Struktura dla nag?Uwka pliku TGA
#pragma pack(1)
    typedef struct
    {
        GLbyte idlength;
        GLbyte colormaptype;
        GLbyte datatypecode;
        unsigned short colormapstart;
        unsigned short colormaplength;
        unsigned char colormapdepth;
        unsigned short x_orgin;
        unsigned short y_orgin;
        unsigned short width;
        unsigned short height;
        GLbyte bitsperpixel;
        GLbyte descriptor;
    }TGAHEADER;
#pragma pack(8)
    
    FILE *pFile;
    TGAHEADER tgaHeader;
    unsigned long lImageSize;
    short sDepth;
    GLbyte *pbitsperpixel = NULL;
    
    // Wartoúci domyúlne zwracane w przypadku b?Ídu
    *ImWidth = 0;
    *ImHeight = 0;
    *ImFormat = GL_BGR_EXT;
    *ImComponents = GL_RGB8;
    
    pFile = fopen(FileName, "rb");
    if (pFile == NULL)
        return NULL;
    
    // Przeczytanie nag?Uwka pliku
    fread(&tgaHeader, sizeof(TGAHEADER), 1, pFile);
    // Odczytanie szerokoúci, wysokoúci i g?Íbi obrazu
    *ImWidth = tgaHeader.width;
    *ImHeight = tgaHeader.height;
    sDepth = tgaHeader.bitsperpixel / 8;
    
    // Sprawdzenie, czy g?Íbia spe?nia za?ooone warunki (8, 24, lub 32 bity)
    if (tgaHeader.bitsperpixel != 8 && tgaHeader.bitsperpixel != 24 && tgaHeader.bitsperpixel != 32)
        return NULL;
    // Obliczenie rozmiaru bufora w pamiÍci
    lImageSize = tgaHeader.width * tgaHeader.height * sDepth;
    // Alokacja pamiÍci dla danych obrazu
    pbitsperpixel = (GLbyte*)malloc(lImageSize * sizeof(GLbyte));
    if (pbitsperpixel == NULL)
        return NULL;
    if(fread(pbitsperpixel, lImageSize, 1, pFile) != 1)
    {
        free(pbitsperpixel);
        return NULL;
    }
    // Ustawienie formatu OpenGL
    switch (sDepth)
    {
        case 3:
            *ImFormat = GL_BGR_EXT;
            *ImComponents = GL_RGB8;
            break;
        case 4:
            *ImFormat = GL_BGRA_EXT;
            *ImComponents = GL_RGBA8;
            break;
        case 1:
            *ImFormat = GL_LUMINANCE;
            *ImComponents = GL_LUMINANCE8;
            break;
    };
    
    fclose(pFile);
    return pbitsperpixel;
}

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)