Rysowanie prostych figur 2d za pomocą GLUT'a.

0

Witam, dostałem ostatnio od prowadzącej laborki z Podstaw programowania dość ambitne zadanie, mianowicie narysować za pomocą biblioteki "glut" drzewko rekurencyjne identyczne z tym: http://www.zskorzenna.ayz.pl/grfi/lgm/lgorkr_11.gif
Problem w tym, że gdy usiłuję narysować prostą linię/punkt czy cokolwiek innego program wyświetla mi tylko puste tło.
oto kod:

#include <GL/glut.h>    // Header File For The GLUT Library
//#include <GL/gl.h>        // Header File For The OpenGL32 Library
//#include <GL/glu.h>        // Header File For The GLu32 Library
/* The number of our GLUT window */
int window;
/* A general OpenGL initialization function.  Sets all of the initial parameters. */
void InitGL(int Width, int Height)                // We call this right after our OpenGL window is created.
{
  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);       // This Will Clear The Background Color To Black
  glClearDepth(1.0);                           // Enables Clearing Of The Depth Buffer
  glDepthFunc(GL_LESS);                                // The Type Of Depth Test To Do
  glEnable(GL_DEPTH_TEST);                        // Enables Depth Testing
  glShadeModel(GL_SMOOTH);                        // Enables Smooth Color Shading
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();                                // Reset The Projection Matrix
 
  gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);        
  glMatrixMode(GL_MODELVIEW);
}
 
 
void ReSizeGLScene(int Width, int Height)
{
  if (Height==0)       
     Height=1;
 
  glViewport(0, 0, Width, Height);                
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
 
  gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
  glMatrixMode(GL_MODELVIEW);
}

void DrawGLScene()
{
glutSetWindow(window);                                   
 
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);        
  glLoadIdentity();                                
  glBegin(GL_LINES); 
  glColor3f(0.0f,1.0f,0.0f);
glVertex2f(0.0f, 0.0f); 
glVertex2f(50.0f, 50.0f); 
glEnd(); 

  glutSwapBuffers();
}
 
int main(int argc, char **argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);
  glutInitWindowSize(640, 480);
  glutInitWindowPosition(0, 0);
  window = glutCreateWindow("Drzewko rekurencyjne");
  glutDisplayFunc(&DrawGLScene);
  glutIdleFunc(&DrawGLScene);
  glutReshapeFunc(&ReSizeGLScene);
  InitGL(640, 480);
  glutMainLoop();
  glutDestroyWindow(window);
 
  return 1;
}

a to jest to co z niego wychodzi:
http://zapodaj.net/e620f02dcb842.jpg.html

Jak nie trudno się domyślić bazowałem na kodzie z tutorialu pod linkiem:
Kurs programowania GLUT
ale nie mam pojęcia czego mi brakuje do zobaczenia jakichkolwiek rezultatów.
Uprzejmie proszę o chociaż parę wskazówek, w którą stronę iść, żebym mógł samemu wykonać to zadanie.

dodanie znacznika <code class="cpp"> i usunięcie znacznika <quote> - fp

0

a to jest to co z niego wychodzi:

user image

0

Poprawione.

1
  1. Zacznijmy od tematu:

Rysowanie prostych figur 2d za pomocą GLUT'a.

Nie rysuje się za pomocą GLUT-a. GLUT ci tylko otwiera okienko z obsługą myszy i klawiatury.
Rysuje się za pomocą OpenGL-a.
GLUT to tylko nieobowiązkowy dodatek do OpenGL-a.

  1. Poprawiłem wszystko co mi się nie podobało.
    Czego brakowało to wywołania gluLookAt. Poczytaj co ta funkcja robi.
#include <GL/glut.h>    // Header File For The GLUT Library

/* A general OpenGL initialization function.  Sets all of the initial parameters. */
void InitGL(int Width, int Height)                // We call this right after our OpenGL window is created.
{
  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);       // This Will Clear The Background Color To Black
  glClearDepth(1.0);                           // Enables Clearing Of The Depth Buffer
  glDepthFunc(GL_LESS);                                // The Type Of Depth Test To Do
  glEnable(GL_DEPTH_TEST);                        // Enables Depth Testing
  glShadeModel(GL_SMOOTH);                        // Enables Smooth Color Shading
}

void ReSizeGLScene(int Width, int Height)
{
  if (Height==0)       
     Height=1;
 
  glViewport(0, 0, Width, Height);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();                                // Reset The Projection Matrix
  gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);        

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  gluLookAt(0,0,50, 0,0,0, 0,1,0);
}
 
void DrawGLScene()
{
  glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);        
  glColor3f(0.0f,1.0f,0.0f);
  glBegin(GL_LINES); 
    glVertex2f(0.0f, 0.0f); 
    glVertex2f(50.0f, 50.0f); 
  glEnd();
  glutSwapBuffers();
}
 
int main(int argc, char **argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);
  glutInitWindowSize(640, 480);
  glutInitWindowPosition(0, 0);
  glutCreateWindow("Drzewko rekurencyjne");
  glutDisplayFunc(&DrawGLScene);
  glutIdleFunc(&DrawGLScene);
  glutReshapeFunc(&ReSizeGLScene);
  InitGL(640, 480);
  glutMainLoop();
 
  return 0;
}
0

Wielkie dzięki Azarien za rozwiązanie i przede wszystkim za wskazówki, poczytam i poszperam na ten temat.

0

Znowu ściana, nie mogę doprowadzić do sytuacji, w której po naciśnięciu klawisza nastąpi kolejne wywołanie funkcji. Próbowałem z getch(),system("pause"),przy pomocy ifa, efekt jest ten sam, obraz w obrębie okna nie odświeża się a w cmd wszystko zdaje się działać poprawnie (tj. po naciśnięciu klawisza, program odlicza kolejne wywołania.
Poniżej fragment kodu, który modyfikowałem:

gluLookAt(0,0,50, 0,50,0, 0,1,0);
}
float linia(float x0,float y0, float xk,float yk,int i){
  glBegin(GL_LINES); 
    glVertex2f(x0,y0); 
    glVertex2f(xk,yk); 
  glEnd();
  x0=xk;
  y0=yk;
  system("pause");
  i++;
  printf("%i\n",i);
  linia(x0,y0,x0-20,yk+20,i);
return 0; 
}
void DrawGLScene()
{
  glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);        
  glColor3f(0.0f,1.0f,0.0f);
	float x0=0.0f,y0=0.0f,xk=0.0f,yk=40.0f;
	linia(x0,y0,xk,yk,0);
  glutSwapBuffers();
}

zamiana znacznika <quote - fp> na

1

Bo samo nic nie będzie się odrysowywało, bo po co.

glutPostRedisplay do tego służy, możesz go dodać pod koniec twojego DrawGLScene.
W ten sposób okno będzie rysowane w kółko, tak szybko jak komputer wydoła.

I wywal te wszystkie pause i getch, zapomnij o konsoli jak piszesz program okienkowy.

0

Niestety żadnej różnicy ;/

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.