Tworzenie sześcianów - OpenGL C++

0

Witam,

Mam problem z przenikaniem się ścian sześcianów. Pod różnym widokiem widać jakby brakowało co poniektórych ścian. Utworzyłem sobie kilka prostych procedur które tworzą mi sześciany. Następnie za pomocą tablicy produkuje jakiś kształt z tych sześcianów. Zauważyłem że gdy przestawiam sobie produkcje ścian w procedurze to zmienia mi się wygląd (tak jakby tutaj mógł tkwić problem).

user image

    //RYSOWANIE LINII POMOCNICZYCH
    void linie(void)
    {	
    	glLineWidth(1);

    	glBegin(GL_LINES);
    	glColor3f(0, 0, 0);
    	glVertex3f(0.0, 0.0, 0.0);
    	glVertex3f(100, 0, 0);
    	glVertex3f(0, 0, 0);
    	glVertex3f(0, 100, 0);
    	glVertex3f(0, 0, 0);
    	glVertex3f(0, 0, 100);
    	glVertex3f(0.0, 0.0, 0.0);
    	glVertex3f(-100, 0, 0);
    	glVertex3f(0, 0, 0);
    	glVertex3f(0, -100, 0);
    	glVertex3f(0, 0, 0);
    	glVertex3f(0, 0, -100);
    	glEnd();
    }


    // TWORZENIE NOWEGO SZESCIANU 1X1X1
    void nowySzescian() {

    	//front, czerwony
    	glColor3f(1.0f, 0.0f, 0.0f);
    	glBegin(GL_POLYGON);
    	glVertex3f(0.0f, 0.0f, 0.0f);
    	glVertex3f(1.0f, 0.0f, 0.0f);
    	glVertex3f(1.0f, 1.0f, 0.0f);
    	glVertex3f(0.0f, 1.0f, 0.0f);
    	glEnd();

    	//up, pomarancz
    	glColor3f(1.0f, 0.5f, 0.0f);
    	glBegin(GL_POLYGON);
    	glVertex3f(0.0f, 1.0f, 0.0f);
    	glVertex3f(1.0f, 1.0f, 0.0f);
    	glVertex3f(1.0f, 1.0f, 1.0f);
    	glVertex3f(0.0f, 1.0f, 1.0f);
    	glEnd();


    	//down, fiolet
    	glColor3f(1.0f, 0.0f, 1.0f);
    	glBegin(GL_POLYGON);
    	glVertex3f(0.0f, 0.0f, 0.0f);
    	glVertex3f(1.0f, 0.0f, 0.0f);
    	glVertex3f(1.0f, 0.0f, 1.0f);
    	glVertex3f(0.0f, 0.0f, 1.0f);
    	glEnd();

    	//zielony
    	glColor3f(0.0f, 1.0f, 0.0f);
    	glBegin(GL_POLYGON);
    	glVertex3f(1.0f, 0.0f, 0.0f);
    	glVertex3f(1.0f, 0.0f, 1.0f);
    	glVertex3f(1.0f, 1.0f, 1.0f);
    	glVertex3f(1.0f, 1.0f, 0.0f);
    	glEnd();

    	//niebieski
    	glColor3f(0.0f, 0.0f, 1.0f);
    	glBegin(GL_POLYGON);
    	glVertex3f(0.0f, 0.0f, 1.0f);
    	glVertex3f(1.0f, 0.0f, 1.0f);
    	glVertex3f(1.0f, 1.0f, 1.0f);
    	glVertex3f(0.0f, 1.0f, 1.0f);
    	glEnd();

    	//zolty
    	glColor3f(1.0f, 1.0f, 0.0f);
    	glBegin(GL_POLYGON);
    	glVertex3f(0.0f, 0.0f, 0.0f);
    	glVertex3f(0.0f, 1.0f, 0.0f);
    	glVertex3f(0.0f, 1.0f, 1.0f);
    	glVertex3f(0.0f, 0.0f, 1.0f);
    	glEnd();
    }

    //TABLICA SZESCIANOW KOPCA
    int tablica_kopca[10][10] = {
    	{ 1,2,1,2,1,2,1,2,1,2 },
    	{ 2,3,2,3,3,3,2,3,2,3 },

    	{ 1,3, 3,4,3,4,3,4, 1,2 },

    	{ 2,2, 5,4,5,4,5,3, 2,1 },
    	{ 1,3, 6,3,7,7,4,2, 1,2 },
    	{ 2,2, 6,5,7,6,5,3, 2,1 },
    	{ 1,3, 5,5,4,5,4,2, 1,2 },
    	
    	{ 2,2, 3,4,2,4,2,4, 2,1 },

    	{ 1,3,2,3,2,3,2,3,1,2 },
    	{ 2,1,2,1,2,1,2,1,2,1 },
    };

    //FUNKCJA BUDUJ KOPIEC Z POWYZSZEJ TABLICY
    void nowyKopiec() {

    	//rysowanie szescianow w osi Z
    	for (int z = 0; z < (sizeof tablica_kopca / sizeof tablica_kopca[0]) ; z++) {
    		//przesuniecie w osi Z
    		glTranslatef(0, 0, 1);

    		//rysowanie szescianow po osi X
    		glPushMatrix();
    		for (int x = 0; x < (sizeof tablica_kopca[0] / sizeof(int)); x++) {

    			glPushMatrix();
    			//tworzenie szescianow w osi Y
    			for (int y = 0; y < tablica_kopca[z][x]; y++) {
    				nowySzescian();
    				//przesuniecie w osi Y
    				glTranslatef(0, 1, 0);
    			}
    			glPopMatrix();

    			//przesuniecie w osi X
    			glTranslatef(1, 0, 0);
    		}
    		glPopMatrix();
    	}
    }




    // GLOWNE RYSOWANIE SCENY
    void RenderScene(void)
    {
    	// Clear the window with current clearing color
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    	// Umozliwienie obracania scena - NIEDZIALA CHYBA DOBRZE
    	glPushMatrix();
    	glRotatef(xRot, 1.0f, 0.0f, 0.0f);
    	glRotatef(yRot, 0.0f, 1.0f, 0.0f);

    	//linie pomocnicze
    	linie();

    	//budowanie kopca
    	glRotatef(45.0, 1.0, 1.0, 1.0);
    	nowyKopiec();

    }

Bardzo proszę o pomoc!

0

Włącz testowanie bufora głębokości.

glEnable(GL_DEPTH_TEST); 
0

Z tego co pamiętam tworzenie polygonów wymaga odpowiedniej kolejności ("skrętności") w celu uzyskania powierzchni. Niestety nie pamiętam teraz czy to było podawanie wierzchołków lewo- czy prawoskrętnie.

Być może w tym tkwi problem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1