open GL transparenz probleme

kommt_noch

Grünschnabel
hi, ich versuche einen einfachen bildschirmschoner zu bastel,
1. problem
der kasten soll auf dem bildschirm erseinen (transparent)
und dann sichtbar werden, macht er leider nur nicht... ich finde den fehler nicht...

2. problem
der kasten wird immer schneller,
sollte aber eine konstante geschwindigkeit haben

bin für jede hilfe dankbar =)

gruss k_n


Code:
#include <iostream>
#include <stdlib.h>
#include <math.h>

//Benoetigt fuer OpenGL
#include <GL/glut.h> // OpenGL
#include <GL/glf.h>     // GLF
using namespace std;

//Variable für Transparenz
GLfloat t = 0.0;


// koordinaten für die Spiralbewegung
GLfloat positionX = 0.0;
GLfloat positionY = 0.0;
GLfloat winkel = 0.0;


void aktion (int i)
{
  glPushMatrix();

  while(t<1){
  t=t+0.1;   //  transparenzwert soll geändert werden
  glutPostRedisplay();
  glutTimerFunc(25 ,aktion,1);
  }

//objekt wird spiralförmig aus dem bildschirm bewegt

  if(winkel >= 8 ){
      winkel = 0.0;    // objekt wieder in mitte
           t = 0.0;   // objekt wieder transparent
  }
  positionX = 1.5 * winkel*cos(winkel);
  positionY = 1.5 * winkel*sin(winkel);

  winkel = winkel + 0.025/(1+0.25*winkel); // erzeugt die Bewegung

  glPopMatrix();
  glutPostRedisplay();

  glutTimerFunc(25 ,aktion,1);
  
  }


void kasten(void){

    //fläche des kasten
   glColor4f(0.0,0.0,0.8,t);
   glBegin (GL_POLYGON);
       glVertex2f (-1.0, -1.0);
       glVertex2f (-1.0,  1.0);
       glVertex2f ( 1.0,  1.0);
       glVertex2f ( 1.0, -1.0);
   glEnd();

   // umrandung des kasten
   glColor4f(1.0,0.0,0.0,t);
   glBegin (GL_LINE_LOOP);
       glVertex2f (-1.0, -1.0);
       glVertex2f (-1.0,  1.0);
       glVertex2f ( 1.0,  1.0);
       glVertex2f ( 1.0, -1.0);
   glEnd();

   glLineWidth(1.);
}

// Graphik wird erstellt
void display(void)
{
   glClearColor(1.0 , 1.0 , 1.0 , 1.0); // macht hintergrund farbig
   glClear (GL_COLOR_BUFFER_BIT);
   glPolygonMode(GL_FRONT, GL_LINE);
 
   glPushMatrix();

   glScalef( 1.0 , 1.0 , 1 );
   glTranslatef(positionX, positionY , 1.0);
      
       kasten();  // funktion für den kasten ...

   glPopMatrix();
   
   glutSwapBuffers();               // Bildspeicher wird gewechselt
}

// Aenderungen des Fensters
void reshape (int w, int h)
{
   float faktor1 = (float) h / (float) w;
   float faktor2 = (float) w / (float) h;
   glViewport (0, 0, w, h);
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity ();
   // Weltkoordinaten
   if (w <= h)
      gluOrtho2D (-8.0, 8.0, -8.0 * faktor1, 8.0 * faktor1);
   else
      gluOrtho2D (-8.0 * faktor2, 8.0 * faktor2, -8.0, 8.0);
   glMatrixMode(GL_MODELVIEW);
}
// Tastaturabfragen
void keyboard(unsigned char key, int x, int y)
{
   switch (key) {
      //glutmainloop() beenden
      case 27:       // Escape-Taste
         exit(0);
         break;
   }
}


int main(int argc, char** argv)
{
   // Initialisierungen (GLUT)
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_DOUBLE | GLUT_ALPHA | GLUT_RGBA );
   glutInitWindowSize (1000, 1000);
   glutInitWindowPosition (200, 200);
   glutCreateWindow (argv[0]);
   glutFullScreen();                          // FULLSCREEN
   // Initialisierungen (GLF)
   glfInit();
   glfLoadFont("/opt/glf/fonts/arial1.glf");
   // Callback Funktionen

   glutDisplayFunc(display);
   glutReshapeFunc(reshape);
   glutKeyboardFunc (keyboard);

   glutTimerFunc(2000,aktion,1); //

   //Nun beginnt es;
   glutMainLoop();
   return 0;
}
 
Zuletzt bearbeitet:
Hi und Willkommen bei tutorials.de :)

Ohne Code können wir schlecht sagen, was los ist.
Benutze die Codetags.
Und bitte beachte Netiquette §15.

Was ist dieser "Kasten"?
 
ich war ja noch gar nicht feritg :D
das ist nur ein quadrat das spiralförmig sich aus dem bildschirm rausbewegen soll
und dann nach einigen umdrehungen (bildschirm verlassen) wieder erscheinen soll ...

und beim erscheinen soll es eigentlich transparent sein ... aber es weigert sich standhaft dieses zu sein ;)
 
Also...die Transparenz:
Warum machst du in Aktion eine while-Schleife,
die von 0 durch auf 1 zählt?
Sollte das nnicht auf mehrere aktion-Durchgänge aufgeteilt werden?

Und zur verschnellerten Rotation:
Math. ist das normal, wenn man immer einen fixen Winkelschritt weitergeht.
Kann deine Positionsberechnung jetzt auf die Schnelle nicht ganz nachvollziehen...
würde das eher Schritt für Schritt machen.

Das Objekt soll sich von der Bildschirmmitte weg spiralförmig nach außen bewegen?
Dann mach zuerst Variablen für Winkel (0-360° und Radius bzw. Entfernung von der Bildschirmmitte)

Bei jedem aktion zählst du einen fixen Wert zum radius
und einen fixen Wert zum Winkel dazu. Dann winkel%=360;

Erst dann berechnest du mit sin/cos etc. die x/y-Koordinaten.

Um zu verhindern, dass die Bewegung schneller wird, musst du den Wikel mit zunehmendem Radius proportional verkleinern (doppelter Radius ergibt doppelten Kreisumfang...).

Aslo, was tatsächlich zum aktuellen Winkel addiert wird, ist grob gesagt der (Fixwert / Radius).
Sonderfall Radius==0: Dann Ergebnis auch 0.
Muss mit if überprüft werden, weil sonst Division durch 0.
 
zur while schleife ...

Code:
  while(t<1){

       t=t+0.1;   //  transparenzwert soll geändert werden
  
      glutPostRedisplay();
      glutTimerFunc(25 ,aktion,1);
  }

ich dachte mit :

glutPostRedisplay();
glutTimerFunc(25 ,aktion,1);

rufe ich die funktion ja wieder auf ... also das es in mehreren durchgängen passiert ...
wobei dafür so betrachtet ne if-abfrage mit if(t<1) besser scheint ...

die koordinaten berechne ich nach der Archimedische_Spirale.
 
Zur Transparenz:
aktion wird ja sowieso schon regelmäßig aufgerufen, auch wegen der Bewegung.
Also ja, nur ein if reicht.

Zur Spiralbewegung...ich schreib mal eine Funktion.

so jetzt aber:
C++:
#include <stdio.h>
#include <math.h>

class spirale
{
protected:
	char uhr;
	double fixwinkel, winkel, fixradius, radius, x, y;
public:

	//Parameter:
	//1: Abstand zwischen den "Linien"
	//2: Geschwindigkeit. Passenden Wert finden
	//3: Wenn gegen den Uhrzeigersinn 0, sonst 1
	spirale(double linienabstand, int geschwindigkeit, char uhrzeigersinn = 1)
	{
		uhr = uhrzeigersinn;
		fixradius = linienabstand;
		fixwinkel = 360.0 * (double)geschwindigkeit;
		if(!uhrzeigersinn)
			fixwinkel = -fixwinkel;
		winkel = 0.0;
		radius = 0.0;
	}

	void aktion()
	{
		char negativ;

		if(fixradius < 0.0)
		{
			if(radius > 0.0)
			{
				winkel += fixwinkel / radius;
				while(winkel < 0.0)
					winkel += 360.0;
				while(winkel >= 360.0)
					winkel -= 360.0;
			}
			radius -= fixradius;
			if(radius < 0.0)
				radius = 0.0;
		}
		else if(fixradius > 0.0)
		{
			radius += fixradius;
			if(radius > 0.0)
			{
				winkel += fixwinkel / radius;
				while(winkel < 0.0)
					winkel += 360.0;
				while(winkel >= 360.0)
					winkel -= 360.0;
			}
		}
		printf("%f %f\n",radius,winkel);

		x = winkel;
		if(x > 180.0)
		{
			negativ = 1;
			x -= 180.0;
		}
		else
			negativ = 0;
		if(x > 90.0)
			x = 180.0 - x;
		x *= 3.14159265;
		x /= 360.0;
		x = sin(x);
		if(negativ)
			x = -x;

		y = winkel + 90.0;
		if(y >= 360.0)
			y -= 360.0;
		if(y > 180.0)
		{
			negativ = 1;
			y -= 180.0;
		}
		else
			negativ = 0;
		if(y > 90.0)
			y = 180.0 - y;
		y *= 3.14159265;
		y /= 360.0;
		y = sin(y);
		if(negativ)
			y = -y;
	}
	
	//Koordinaten abfragen, von der Bildschirmmitte ausgehend (math. Coordsystem)
	double getx()
	{
		return x;
	}
	double gety()
	{
		return y;
	}

	//0=nach innen, 1=nach aussen
	void richtung(char aussen)
	{
		if(aussen && fixradius < 0.0)
			fixradius = -fixradius;
		if(!aussen && fixradius > 0.0)
			fixradius = -fixradius;
	}
};
Stüzt nicht ab oder so, aber ob die Werte stimmen...
das sieht man grafisch wahrscheinlich einfacher.
 
hmm ... das mit der spirale werd ich ma noch n bissel ausprobieren ...

aber was mache ich wegen der transparenz ?
irgendwo muss da noch n fehler sein ...
ich habe den teil mit der bewegung erstmal rausgenommen,
umd das "einbleden" zu versuchen ... aber das kästchen ist gleich von anfang an da ...

liegt das an der zeile im main teil:

glutInitDisplayMode (GLUT_DOUBLE | GLUT_ALPHA | GLUT_RGBA );

bei der bin ich mir nicht so sicher ob das richtig ist ...
oder ist es ein anderer teil den ich bei main oder so vergessen habe?



Code:
#include <iostream>
#include <stdlib.h>
#include <math.h>

//Benoetigt fuer OpenGL
#include <GL/glut.h> // OpenGL
#include <GL/glf.h>     // GLF
using namespace std;

//Variable für Transparenz
GLfloat t = 0.0;


// koordinaten für die Spiralbewegung
GLfloat positionX = 0.0;
GLfloat positionY = 0.0;

void aktion (int i)
{
  glPushMatrix();
  if(t<1){
    t=t+0.1;   //  transparenzwert soll geändert werden
  }
    glutPostRedisplay();
    glutTimerFunc(25 ,aktion,1);
 
  }


void kasten(void){

    //fläche des kasten
   glColor4f(0.0,0.0,0.8,t);
   glBegin (GL_POLYGON);
       glVertex2f (-1.0, -1.0);
       glVertex2f (-1.0,  1.0);
       glVertex2f ( 1.0,  1.0);
       glVertex2f ( 1.0, -1.0);
   glEnd();

   // umrandung des kasten
   glColor4f(1.0,0.0,0.0,t);
   glBegin (GL_LINE_LOOP);
       glVertex2f (-1.0, -1.0);
       glVertex2f (-1.0,  1.0);
       glVertex2f ( 1.0,  1.0);
       glVertex2f ( 1.0, -1.0);
   glEnd();

   glLineWidth(1.);
}

// Graphik wird erstellt
void display(void)
{
   glClearColor(1.0 , 1.0 , 1.0 , 1.0); // macht hintergrund farbig
   glClear (GL_COLOR_BUFFER_BIT);
   glPolygonMode(GL_FRONT, GL_LINE);
 
   glPushMatrix();

   glScalef( 1.0 , 1.0 , 1 );
   glTranslatef(positionX, positionY , 1.0);
      
       kasten();  // funktion für den kasten ...

   glPopMatrix();
   
   glutSwapBuffers();               // Bildspeicher wird gewechselt
}

// Aenderungen des Fensters
void reshape (int w, int h)
{
   float faktor1 = (float) h / (float) w;
   float faktor2 = (float) w / (float) h;
   glViewport (0, 0, w, h);
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity ();
   // Weltkoordinaten
   if (w <= h)
      gluOrtho2D (-8.0, 8.0, -8.0 * faktor1, 8.0 * faktor1);
   else
      gluOrtho2D (-8.0 * faktor2, 8.0 * faktor2, -8.0, 8.0);
   glMatrixMode(GL_MODELVIEW);
}
// Tastaturabfragen
void keyboard(unsigned char key, int x, int y)
{
   switch (key) {
      //glutmainloop() beenden
      case 27:       // Escape-Taste
         exit(0);
         break;
   }
}


int main(int argc, char** argv)
{
   // Initialisierungen (GLUT)
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_DOUBLE | GLUT_ALPHA | GLUT_RGBA );
   glutInitWindowSize (1000, 1000);
   glutInitWindowPosition (200, 200);
   glutCreateWindow (argv[0]);
   glutFullScreen();                          // FULLSCREEN
   // Initialisierungen (GLF)
   glfInit();
   glfLoadFont("/opt/glf/fonts/arial1.glf");
   // Callback Funktionen

   glutDisplayFunc(display);
   glutReshapeFunc(reshape);
   glutKeyboardFunc (keyboard);

   glutTimerFunc(2000,aktion,1); //

   //Nun beginnt es;
   glutMainLoop();
   return 0;
}
 
Du hast den Timeraufruf ja noch immer drin?
Weg damit oder höher.

25ms ist viel zu schnell.
In 0 Schritten bis zu 1.0 Alpha macht 250ms. Deswegen wirds dir nicht auffallen...
 
wenn ich die funktion "aktion" verändere tut sich trotzdem nix...
selbst wenn ich den teil wo ich

t = t + 0.001

mache weglasse, ist der kasten da, dabei sollte er doch zumindestens dann durch
Transparenz t=0.0 nicht zu sehen sein ...
das wundert mich ja dabei ... wenn das schon ma passieren würde hätte ich schon n schritt nach vorne

Code:
void aktion (int i)
{
  glPushMatrix();
  if(t<1){
    t=t+0.001;   //  transparenzwert soll geändert werden
  }
    glutPostRedisplay();
    glutTimerFunc(2500 ,aktion,1);
 
  }
 
Zurück