Primitives an Bildschirmkoordinaten zeichnen
-
Darf man fragen, warum nicht?
Ich hab gelesen, dass auf machen Grafikkarten dann das Clipping nicht funktioniert.
Der Hauptgrund ist aber eigentlich, dass ich nicht weiss, wie man dann Rotation hinbekommt. ^^
Wenn du mir sagen kannst, wie das geht, würde ich auch transformierte Vertices benutzen.

-
ProGamer.Coder schrieb:
Wenn du mir sagen kannst, wie das geht, würde ich auch transformierte Vertices benutzen.

Polarkoordinaten.
-
Warum so umständlich?
Du musst doch einfach nur eine Rotationsmatrix nehmen und die Vertizes per Hand transformieren.
-
ProGamer.Coder schrieb:
Hi,
ich möchte Primtives an bestimmten Stellen auf dem Bildschirm zeichnen, also z.B. an Position 250,300 in Pixeln. Lassen sich die Koordinaten dafür irgendwie berechnen?PS. Ich möchte keine transformierten Vertices verwenden.
Dann verwendte eine orthogonale Projektionsmatrize. f'`8k
AutocogitoGruß, TGGC (making great games since 1992)
-
#include <GL/glfw.h> #include <iostream> using namespace std; int kreis; void timeUpdate(double *dt, double *time){ double newTime = glfwGetTime(); *dt = newTime - *time; *time = newTime; } void init(void){ // Use trilinear interpolation (GL_LINEAR_MIPMAP_LINEAR) glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); // Enable texturing glEnable( GL_BLEND ); glBlendFunc (GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glEnable( GL_ALPHA_TEST ); glEnable( GL_TEXTURE_2D ); glClearColor(1,1,1,0); glfwDisable( GLFW_MOUSE_CURSOR ); // Select and setup the projection matrix glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluOrtho2D(0,640,0,480); // Select and setup the modelview matrix glMatrixMode( GL_MODELVIEW ); kreis = glGenLists(1); glNewList(kreis, GL_COMPILE); glBegin( GL_QUADS ); glTexCoord2f( 0.0f, 0.0f ); glVertex2f( -16.0f,-16.0f ); glTexCoord2f( 0.0f, 1.0f ); glVertex2f( -16.0f, 16.0f ); glTexCoord2f( 1.0f, 1.0f ); glVertex2f( 16.0f, 16.0f ); glTexCoord2f( 1.0f, 0.0f ); glVertex2f( 16.0f,-16.0f ); glEnd(); glEndList(); } int main(int argc, char** argv) { glfwInit(); cout << "Ja es wurde Kompiliert" << endl; if(!glfwOpenWindow(640,480,8,8,8,8,32,0,GLFW_WINDOW)){ glfwTerminate(); cerr << "Fenster kaputt!" << endl; return 0; } if( !glfwLoadTexture2D( "data/kreis.tga", GLFW_BUILD_MIPMAPS_BIT ) ){ glfwTerminate(); cerr << "Textur kaputt!" << endl; return 0; } init(); bool running = true; int mx=0,my=0; double time; double dt; while(running){ timeUpdate(&dt, &time); glfwGetMousePos(&mx,&my); my = 480-my; glPushMatrix(); glTranslatef(mx,my,0); glRotatef(time*360,0,0,1); glCallList(kreis); glPopMatrix(); running = !glfwGetKey( GLFW_KEY_ESC ) && glfwGetWindowParam( GLFW_OPENED ); glfwSwapBuffers(); glClear(GL_COLOR_BUFFER_BIT); } glfwTerminate(); return 0; }da ein rotierendes bild auf dem Bildschirm an Pixelgenauer Mausposition
und um die rotation muss man sich keine sorgen machen, da gibt man einfach den nötigen winkel an, und GL kümmert sich drum. Das ganze auch noch hardwareunterstützt, was will man mehrzum kompilieren braucht man die libs, die von glfw benötigt werden, kann man einfach aus den glfw exaples kopieren.
Das Bild (Kreil.tga), das benötigt wird ist übrigens 32*32 Pixel groß.
-
Danke für eure Antworten und das Beispiel.
Leider bin ich ( noch ) nicht so fit, was Matritzen etc. angeht.Krux, lässt sich dein Beispiel auch auf DirectX portieren?
kreis = glGenLists(1); glNewList(kreis, GL_COMPILE); glBegin( GL_QUADS ); glTexCoord2f( 0.0f, 0.0f ); glVertex2f( -16.0f,-16.0f ); glTexCoord2f( 0.0f, 1.0f ); glVertex2f( -16.0f, 16.0f ); glTexCoord2f( 1.0f, 1.0f ); glVertex2f( 16.0f, 16.0f ); glTexCoord2f( 1.0f, 0.0f ); glVertex2f( 16.0f,-16.0f ); glEnd(); glEndList();Du gibst bei den Vertices ja schon gleich die Bildschirmkoordinaten an, wenn ich das richtig verstanden habe. Wäre ganz praktisch, wenn es sowas in DX auch gäbe.

-
das liegt an
gluOrtho2D(0,640,0,480);
das beschafft mir eine Arbeitsfläche, bei denen die koordinaten gleich den Pixeln entsprechen. Bzw, es setzt die Kamera nach oben (wenn z nach oben zeigt) und lässt sie runter Schauen, das ganze in orthografischer Sicht (Distanzierte Objekte werden nicht kleiner). Allerdings das was du da zitiert hast, das ist blos der Teil, der mir Die Textur auf einen Quadraht packt, platziert wird es späterhier:
glPushMatrix(); glTranslatef(mx,my,0); //position wird festgelegt (Mausposition) glRotatef(time*360,0,0,1); //und es wird um die z achse rotiert (rotiert 1 mal pro sekunde) glCallList(kreis); //dann wirds hingepflanzt (genau das, das du zitiert hast) glPopMatrix(); //alle glTranslate und glRotate Befehle seit dem letzen glPushmatrix werden rückgängig gemachtund was Matritzen angeht, hab ich da auch kein plan von, ich weis nur was die Befehle bewirken, das reicht mir.
Und bestimmt kann man das nach DirectX portieren, aber nicht von mir, ich bin selbst noch Anfänger, was OpenGL angeht, und DirectX hab ich überhaupt noch nichts mit gemacht.
-
Danke dir!
Ich werde mal versuchen, das in DX hinzubekommen.
Das gluOrtho2D hatte ich wohl übersehen. ^^
-
Es funktioniert jetzt auch mit DirectX.
Aber ein Problem gibt es noch: Ich würde gerne auch noch 3D-Grafik rendern.
Ist das denn möglich, erst normal perspektivisch und dann orthographisch zu rendern?
-