Witam, próbuje rozwiązać problem, który polega na usunięciu niewidocznych linii w elipsoidzie.
Wykorzystuje do tego bibliotekę GLUT oraz bufor głębokości (Z-bufor).
Czytałem na ten temat, znalazłem kawałek kodu w internecie, przerobiłem go na własne potrzeby, problem w tym, iż nie usuwa niewidocznych linii.
Czy ktoś zna temat i mógłby mi podsunąć jakąś informację? Gdzie leży błąd lub gdzie mogę się douczyć?
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <GL/gl.h>
#include <GL/glut.h>
#include <GL/glext.h>
#ifndef WIN32
#define GLX_GLXEXT_LEGACY
#include <GL/glx.h>
#define wglGetProcAddress glXGetProcAddressARB
#endif
#include "colors.h"
// stałe do obsługi menu podręcznego
#ifdef near
#undef near
#endif
#ifdef far
#undef far
#endif
// rozmiary bryły obcinania
const GLint left = - 5;
const GLint right = 5;
const GLint bottom = - 5;
const GLint top = 5;
const GLint near = - 5;
const GLint far = 5;
// kąty obrotu sceny
GLfloat rotatex = 0.0;
GLfloat rotatey = 0.0;
GLfloat angle = 0.0;
bool polygon_offset = true;
// wskaźnik naciśnięcia lewego przycisku myszki
int button_state = GLUT_UP;
// położenie kursora myszki
int button_x, button_y;
// funkcja generująca scenę 3D
void DisplayScene()
{
// kolor tła - zawartość bufora koloru
glClearColor( 1.0, 1.0, 1.0, 1.0 );
// czyszczenie bufora koloru i bufora głębokości
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
// wybór macierzy modelowania
glMatrixMode( GL_MODELVIEW );
// macierz modelowania = macierz jednostkowa
glLoadIdentity();
// obroty całej sceny
glRotatef( rotatex, 1.0, 0.0, 0.0 );
glRotatef( rotatey, 0.0, 1.0, 0.0 );
// włączenie bufora głębokości
glEnable( GL_DEPTH_TEST );
//wybor trybu bufora głębokości
glDepthFunc( GL_ALWAYS);
// kolor obiektu
glColor4fv( Green );
glPushMatrix();
angle += 0.2;
glRotatef( angle, 1.0, 1.0, 0.0 );
glColor3fv( DarkBlue);
if( polygon_offset )
glEnable( GL_POLYGON_OFFSET_FILL );
glPolygonOffset( 1.0, 1.0 );
glutWireSphere( 3, 20, 20 );
if( polygon_offset )
glDisable( GL_POLYGON_OFFSET_FILL );
glPopMatrix();
// skierowanie poleceń do wykonania
glFlush();
// zamiana buforów koloru
glutSwapBuffers();
}
// zmiana wielkości okna
void Reshape( int width, int height )
{
// obszar renderingu - całe okno
glViewport( 0, 0, width, height );
// wybór macierzy rzutowania
glMatrixMode( GL_PROJECTION );
// macierz rzutowania = macierz jednostkowa
glLoadIdentity();
// parametry bryły obcinania
glOrtho( left, right, bottom, top, near, far );
// generowanie sceny 3D
DisplayScene();
}
// obsługa przycisków myszki
void MouseButton( int button, int state, int x, int y )
{
if( button == GLUT_LEFT_BUTTON )
{
// zapamiętanie stanu lewego przycisku myszki
button_state = state;
// zapamiętanie położenia kursora myszki
if( state == GLUT_DOWN )
{
button_x = x;
button_y = y;
}
}
}
// obsługa ruchu kursora myszki
void MouseMotion( int x, int y )
{
if( button_state == GLUT_DOWN )
{
rotatey += 50 *( right - left ) /( float ) glutGet( GLUT_WINDOW_WIDTH ) *( x - button_x );
button_x = x;
rotatex -= 50 *( top - bottom ) /( float ) glutGet( GLUT_WINDOW_HEIGHT ) *( button_y - y );
button_y = y;
glutPostRedisplay();
}
}
int main( int argc, char * argv[] )
{
// inicjalizacja biblioteki GLUT
glutInit( & argc, argv );
// inicjalizacja bufora ramki
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );
// rozmiary głównego okna programu
glutInitWindowSize( 500, 500 );
// utworzenie głównego okna programu
glutCreateWindow( "test" );
// dołączenie funkcji generującej scenę 3D
glutDisplayFunc( DisplayScene );
// dołączenie funkcji wywoływanej przy zmianie rozmiaru okna
glutReshapeFunc( Reshape );
// obsługa przycisków myszki
glutMouseFunc( MouseButton );
// obsługa ruchu kursora myszki
glutMotionFunc( MouseMotion );
// wprowadzenie programu do obsługi pętli komunikatów
glutMainLoop();
return 0;
}