OpenGL problem z rotacją

0
// robotyka.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <gl\glut.h>	
#include <gl\gl.h>		// Biblioteka OpenGL
#include <gl\glu.h>		// Biblioteka Utility
#include <gl\glaux.h>	// Biblioteka AUX


//I n i c j a c j a sceny polega na ustawieniu koloru t ª a ( g lCl e a rCo l o r )
void init ( )
{
/* Czarny k o l o r c zys z c z ¡ cy */
glClearColor ( 0.0, 0.0 , 0.0 , 0.0 ) ;
//¤ Biaªy k o l o r rysowania ¤/
glColor3f ( 1.0 , 1.0 , 1.0 ) ;
//¤ Widok ortogonalny ¤/
//¤ kwadrat 2x2 o ±rodku w pocz¡tku ukªadu wspóªrzednych ¤/
glMatrixMode (GL_PROJECTION) ;
glLoadIdentity ( ) ;
//glOrtho( -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 );
gluPerspective(45,4/3,1,1000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0,0.0,5.0, 0.0,0.0,-1.0, 0.0f,1.0f,0.0f);

}
//2.3.2 funkcja wy±wietlaj¡ca
void display ( void )
{
//¤ c z y s z c z e n i e okna ¤/
glClear (GL_COLOR_BUFFER_BIT) ;


/* t u t a j nale»y umi e ± c i ¢ kod
lub wywoªanie f u n k c j i r u s u j a c e j prymitywy
*/
//glPushMatrix();

glColor3f ( 1.0 , 0.0 , 0.0 ) ;
glBegin (GL_LINES) ; //os x (czerwony)
glVertex3f ( 0.0 , 0.0, 0.0);
glVertex3f ( 1.0 , 0.0, 0.0 ) ;
//glVertex3f ( 0.5 , 0.5 , 0.0) ;
//glVertex3f ( 0.5 , -0.5, 0.0);
glEnd ( ) ;

glColor3f ( 0.0 , 1.0 , 0.0 ) ;
glBegin (GL_LINES) ; //os y (zielony)
glVertex3f ( 0.0 , 0.0, 0.0);
glVertex3f ( 0.0 , 1.0, 0.0 ) ;
glEnd ( ) ;

glColor3f ( 0.0 , 0.0 , 1.0 ) ;
glBegin (GL_LINES) ; //os z (niebieski)
glVertex3f ( 0.0 , 0.0, 0.0);
glVertex3f ( 0.0 , 0.0, 1.0 ) ;
glEnd ( ) ;

//glPopMatrix();




///////////drugi uklad wspolrzednych

//glPushMatrix();

glColor3f ( 1.0 , 1.0 , 0.0 ) ;
glBegin (GL_LINES) ; //os n (zolty)
glVertex3f ( 0.0 , 0.0, 0.0);
glVertex3f ( 0.5 , 0.0, 0.0 ) ;
//glVertex3f ( 0.5 , 0.5 , 0.0) ;
//glVertex3f ( 0.5 , -0.5, 0.0);
glEnd ( ) ;

glColor3f ( 0.0 , 1.0 , 1.0 ) ;
glBegin (GL_LINES) ; //os o (jasnoniebieski)
glVertex3f ( 0.0 , 0.0, 0.0);
glVertex3f ( 0.0 , 0.5, 0.0 ) ;
glEnd ( ) ;

glColor3f ( 1.0 , 0.0 , 1.0 ) ;
glBegin (GL_LINES) ; //os a (sexi rozowy)
glVertex3f ( 0.0 , 0.0, 0.0);
glVertex3f ( 0.0 , 0.0, 0.5 ) ;
glEnd ( ) ;

//glPushMatrix();

glRotatef(45,0.0,1.0,1.0); /////////// <<<<<<<<<<<<<<<

//glPopMatrix();
//¤ wy±wietl scen¦ ¤/
glFlush ( ) ;
}

static void Key( unsigned char key , int x_d, int y_d)
{
	switch ( key ) {
case ' 1 ' :
// zrób co± gdy k l awi s z '1 '
	//glRotatef(45,0.0,0.0,1.0);
	//glFlush();
glutPostRedisplay ( ) ;
break ;
case ' 2 ' :
// zrób cos gdy k l awi s z '2 '
glutPostRedisplay ( ) ;
break ;
case 27 :
// zako«cz gdy ' esc '
exit ( 0 ) ;
}
}


int main ( int argc , char* argv [ ] )
{
// i n i c j a c j a GLUT
glutInit (&argc , argv ) ;
// i n i c j a c j a OpenGL
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB) ;
//Tworzenie okna
glutInitWindowSize ( 800 , 600 ) ;
glutInitWindowPosition ( 0,0 ) ;
glutCreateWindow (" Przyklad " ) ;
//Powi¡zanie z funkc j ¡ wy±wi e t l a j ¡ c ¡
glutDisplayFunc ( display ) ;
//Powi¡zanie z funkc j ¡ obsªuguj¡ca kl awi a tur ¦
glutKeyboardFunc (Key ) ;

// i n i c j a c j a sceny
init ( ) ;
// uruchomienie gªównej p ¦ t l i programu
glutMainLoop ( ) ;
return 0 ;
}

mam taki problem, że linie które narysowałem nie chcą sie obrócić, dopiero gdy np zminimalizuje okno
I drugie pytanie: jak obrócić tylko ten drugi układ współrzędnych? W teori rozumiem, że przed nim powinienem dac glpushmatrix, a potem na końcu glpopmatrix, ale cos nie działa (w ogóle sie nie obraca nic)

0

problem 1: brzmi jak zapomnienie o nakazie odrysowania/odswiezenia okna/etc
pytanie 2: moze z tego samego powodu? :}

0
quetzalcoatl napisał(a)

problem 1: brzmi jak zapomnienie o nakazie odrysowania/odswiezenia okna/etc

no do tego służy chyba funkcja glFlush();

0

na http://msdn.microsoft.com/en-us/library/dd373534(VS.85).aspx nigdzie nie widze stwierdzenia, ze glflush gwarantuje ze zadania sie wykonaly/narysowaly, ani tez nie powoduje odswiezenia OKNA ~ invalidate[rect]. minimalizacja i podniesienie okna zas to ostatnie wykonuja :) stad moja sugestia. mozliwe ze glflush powoduje odrysowanie okna - jesli tak, sorry, dawno nie tykalem opengl'a, poczekaj na specow..

0

Musialbys poczytac o stosach macierzy w opengl. Jak mniemam twoj program ma za zadanie wyswietlic ten uklad czy co to jest pod katem 45 stopni. W skrocie:
W open gl jak podajesz wierzcholki to one sa odpowiednio przemnazane przez macierze znajdujacie sie na stosie macierzy. Jesli na stosie bedzie macierz obrotu to dany punkt bedzie obrocony itd.
W twoim programie na poczatku podajesz punkty ktore nie sa mnozone przez macierz obrotu gdyz nie ma jej jeszcze na stosie macierzy! Dopiero koncowe glRotate umieszcza ta macierz obrotu na stosie macierzy, ale ze punkty juz wczesniej byly umieszczone na scenie to zadne mnozenie nie jest wykonywane.
W drugiej iteracji po resizie okna ta macierz jest juz na stosie macierzy (bo ten rotate na koncu kodu ja umiescil) wiec te punkty sa odpowiednio przeksztalcane. Jesli zrobisz kolejny resize to znowu sie obroci o 45 stopni bo dajesz kolejna macierz na stos (masz tam 2x macierze obrotu o 45 stopni).

W innym watku ktos zapytal po co matma na informie, no wlasnie glownie po to (algebra tutaj, przeksztalcenia liniowe).

0

dzięki już działa, teraz mam tylko takie pytanie: jak zrobić animację obrotu za naciśnięciem przycisku? próbowałem uzywać Sleep() w pętli ale nie działa, chwilę czeka a potem pokazuje od razu ostatni krok

0

Dajesz kat obrotu jako zmienna i nacisniecie klawisza zwieksza wartosc tej zmiennej o ilestam.

0
gosc napisał(a)

Dajesz kat obrotu jako zmienna i nacisniecie klawisza zwieksza wartosc tej zmiennej o ilestam.

no tak mam, ale chodzi mi o to, że np nacisne klawisz i obróci się płynnie o ileś stopni, a nie od razu

0

No to zrob tak ze na nacisniecie klawisza obracasz nie o 45 stopni ale np o 2 czy 3, musisz sam generowac klatki posrednie, opengl za ciebie tego nie zrobi :)

0
gosc napisał(a)

No to zrob tak ze na nacisniecie klawisza obracasz nie o 45 stopni ale np o 2 czy 3, musisz sam generowac klatki posrednie, opengl za ciebie tego nie zrobi :)

no właśnie w tym rzecz, że tych kroków pośrednich nie widać. Mam tak:
for(int i=0; i<10; i++)
{
kat+=10;
//Sleep(100);
glutPostRedisplay ( ) ;
}
ale nie widać kolejnych zmian tylko od razu pokazuje się ostatni krok, a jak dam sleepa to tylko dluzej czekam

0

Musisz zarejestrowac funkcje animacji:

void anim()
{
 tutaj kod animacji
}

a w main()

int main()
{
...
 glutIdleFunc(anim);//rejestracja funkcji animacyjnej
...
}

Pozdro

0

sorki nie mam konta wiec post pod postem :)
no i na nacisniecie klawisza zrob tylko

kat += 10

bez for wtedy kazde wcisniecie klawisza zwiekszy kat o 10 a nie jak napisales od razu o calosc. Nie wiem dokladnie jak dziala glut ale moze wlasnie nie odswiezac na glutPostRedisplay().

0

i co mam tam niby w tej funkcji animacyjnej umieścić? poza tym glutPostRedisplay() z tego co sie orientuje właśnie po to jest, żeby odświeżyć obraz znaczy konkretnie to wywołuje chyba funkcje display. I czemu bez for? No przecież tak to tylko zwiększy się kąt o 10 stopni skokowo i nic więcej, a mi chodzi o to by zwiększył się o np 100stopni co 10, żeby było widac animacje obrotu

0

Hej, nie wiem jak wyglada kod na jakim obecnie operujesz a to tez moze miec na to wplyw. Generalnie jak uzywalem glut'a to jest tam takie cos jak glutIdleFunc(). Wkleje swoj przykladowy kod animacji ktora kiedys robilem w glut, moze pomoze.

#pragma comment (lib, "glaux.lib")

#include <windows.h> 
										 
#include <GL/glut.h> 
#include <gl/glaux.h>

#include <math.h> 

const float MY_PI = 3.141592653589793f;

float pozycja=0.0;
float przyrost=0.01;

float katObrotuKulek = 0.0f;
float deltaKatObrotuKulek = 2.0f;

float wysokoscKulek = 1.9f;
float deltaWysokosci = -0.05f;

float katObrotuPlaszczyzn = 0.0f;
float deltaKatObrotuPlaszczyzn = 2.0f;

void Walec(float prom, float wys, int sciany)
{
    float alfa = 0.0f;
    float d_alfa = 2 * MY_PI / (float)sciany;
    /*glBegin(GL_POLYGON);
        for (int i = 0; i < sciany; ++i)
        {
            glVertex3f(prom * sin(alfa), 0.0f, prom * cos(alfa));
            alfa = alfa + d_alfa;
        }
    glEnd();

    alfa = 0;
    glBegin(GL_POLYGON);
        for (int i = 0; i < sciany; ++i)
        {
            glVertex3f(prom * sin(alfa), wys, prom * cos(alfa));
            alfa = alfa + d_alfa;
        }
    glEnd(); */

    glColor3f(1.0f, 0.0f, 0.0f);

    alfa = 0;
    glBegin(GL_QUADS);
        for (int i = 0; i < sciany; ++i)
        {
            glVertex3f(prom * sin(alfa), wys, prom * cos(alfa));
            glVertex3f(prom * sin(alfa), 0.0f, prom * cos(alfa));
            alfa = alfa + d_alfa;
            glVertex3f(prom * sin(alfa), 0.0f, prom * cos(alfa));
            glVertex3f(prom * sin(alfa), wys, prom * cos(alfa));
        }
    glEnd();
}

void WalecZKulkami(float prom, float wys, int sciany, 
                   float katKulek,
                   float wysokoscKulek)
                   
{
    glPushMatrix();
    Walec(prom, wys, sciany);
    glColor3f(0.0f, 1.0f, 0.0f);
    glTranslatef(0.0f, wysokoscKulek, 0.0f);

    glRotatef(katObrotuKulek, 0.0f, 1.0f, 0.0f);

    glPushMatrix();
        glTranslatef(0.9f, 0.0f, 0.0f);
        auxSolidSphere(0.1);
    glPopMatrix();
    glPushMatrix();
        glTranslatef(-0.9f, 0.0f, 0.0f);
        auxSolidSphere(0.1);
    glPopMatrix();
    glPopMatrix();

}



void uklad()
{
  
  glBegin(GL_LINES);
    glColor3f(0.0, 1.0, 0.0); //zielona oś X
    glVertex3f(-5.0, 0.0, 0.0);
    glVertex3f(5.0, 0.0, 0.0); 

    glColor3f(0.0, 0.0, 1.0); // niebieska oś Y
	glVertex3f(0.0, -5.0, 0.0);
	glVertex3f(0.0,  5.0, 0.0);
	
	glColor3f(0.0,  0.0, 0.0); // czarna oś Z
	glVertex3f(0.0, 0.0, -5.0);
	glVertex3f(0.0, 0.0,  5.0);
	  
  glEnd();

}

void init()
{
  glClearColor(1.0,1.0,1.0,1.0); //kolor tła okna
  glEnable(GL_DEPTH_TEST); // włączenie testu głębokości
	
  glMatrixMode(GL_PROJECTION);
  gluPerspective(60.0,1.0,0.1,10.0); 
  gluLookAt(0.0,0.0,3.0, 0.0,0.0,0.0, 0.0,1.0,0.0); 
  glMatrixMode(GL_MODELVIEW); // nic więcej na stosie rzutowania
                              // się nie znajdzie   
}




void scena()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glPointSize(10);
  
   
  glLoadIdentity();// przed kolejną klatką animacyjną
                   // na stosie modelowania nie mogą
                   // znajdować się żadne macierze z 
                   // poprzedniej klatki animacyjnej

  glPushMatrix();
        glRotatef(katObrotuPlaszczyzn, 0.0f, 0.0f, 1.0f);
    glPushMatrix();
        glTranslatef(0.0, 1.0f, 0.0f);

        WalecZKulkami(1, 2, 30, katObrotuKulek, wysokoscKulek);
    glPopMatrix();
    
    glPushMatrix();
        glRotatef(180.0f, 0.0f, 0.0f, 1.0f);
        glTranslatef(0.0f, 1.0f, 0.0f);
        WalecZKulkami(1, 2, 30, katObrotuKulek, wysokoscKulek);
    glPopMatrix();
    glPopMatrix();
    
    
    glPushMatrix();
        glRotatef(katObrotuPlaszczyzn, 0.0f, 1.0f, 0.0f);
    glPushMatrix();
        glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
        glTranslatef(0.0f, 1.0f, 0.0f);
        WalecZKulkami(1, 2, 30, katObrotuKulek, wysokoscKulek);
    glPopMatrix();

    glPushMatrix();
        glRotatef(270.0f, 0.0f, 0.0f, 1.0f);
        glTranslatef(0.0f, 1.0f, 0.0f);
        WalecZKulkami(1, 2, 30, katObrotuKulek, wysokoscKulek);
    glPopMatrix();
    glPopMatrix();
  glFlush();
  glutSwapBuffers(); // zamiana buforów koloru 
}
 

void anim()
{
  katObrotuKulek = katObrotuKulek + deltaKatObrotuKulek;
    if (katObrotuKulek > 360.0f)
        katObrotuKulek = katObrotuKulek - 360.0f;

    wysokoscKulek = wysokoscKulek + deltaWysokosci;
    if (wysokoscKulek < 0.1f || wysokoscKulek > 1.9f)
        deltaWysokosci = -deltaWysokosci;

    katObrotuPlaszczyzn = katObrotuPlaszczyzn + deltaKatObrotuPlaszczyzn;
    if (katObrotuPlaszczyzn > 360.0f)
        katObrotuPlaszczyzn = katObrotuPlaszczyzn - 360.0f;
    Sleep(30);
    glutPostRedisplay();
}

void main(int argc, char** argv)
{
  glutInit(&argc, argv);  
  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
  glutInitWindowSize(400,400);
  glutInitWindowPosition(100,100);
  glutCreateWindow("Scena testowa");
  glutDisplayFunc(scena);
  glutIdleFunc(anim);//rejestracja funkcji animacyjnej
  init();
  glutMainLoop();
}

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