Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Sleicreider

Frischling

  • »Sleicreider« ist der Autor dieses Themas

Beiträge: 45

Wohnort: Österreich,Steiermark

Beruf: Softwareentwickler

  • Private Nachricht senden

1

26.09.2012, 11:54

QT C++ OpenGL Transformation/Initialisierung

Hey,
Ich hab vor paar monaten mit OpenGL programmieren angefangen, bin aber noch voll der anfänger.
Wie man ein Polygon erstellt hab ich mal gecheckt und so^^
Ich arbeite mit C++ in QT und hab mit 2D objekten angefangen und habe noch einige fragen probleme:

Was soll ich bei der Initialisierung verwenden von meinem GLWidget?
Was soll ich bei resizeGL verwenden?
und was zusätzlich bei paintGL?

und wenn ich mein Polygon erstellt habe.
wie bewege ich am besten mein objekt?

hier ist mal ein code den ich erstellt habe:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include "glwidget.h"
#include <gl/GLU.h>

GLWidget::GLWidget(QWidget *parent) : QGLWidget(parent)
{
}

void GLWidget::initializeGL()
{
    glDisable(GL_TEXTURE_2D);
    glDisable(GL_DEPTH_TEST);
    glDisable(GL_COLOR_MATERIAL);
    glEnable(GL_BLEND);
    glEnable(GL_POLYGON_SMOOTH);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glClearColor(0, 0, 0, 0);
}

void GLWidget::resizeGL(int w,int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f,(GLfloat)w/(GLfloat)h,0.1f,100.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

}




Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void GLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(12,22,0);


    glBegin(GL_POLYGON);
    glVertex2f(-0.1f,0.1f);
    glVertex2f(-0.1f,-0.1f);
    glVertex2f(0.1f,-0.1f);
    glVertex2f(0.1f,0.1f);
    glEnd();

    glLoadIdentity();
    glTranslatef(0.0f,0.0f,-2.0f);
}

void GLWidget::movePolygon()
{
    glLoadIdentity();
    glTranslatef(1.0f,0.0f,-5.0f);
    updateGL();
}








wenn ich die movePolygon methode aufrufe passiert nichts jedoch,
mit nem MouseEvent hat es funktioniert


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void GLWidget::mouseMoveEvent(QMouseEvent *event)
{
    float x = event->x();
    cout << event->x() << "=x";
    glLoadIdentity();

    if(x < 175)
    {
        glTranslatef(x/100 - 0.9f,0.0f,0.0f);
    }
    else
    {
        glTranslatef(0.9f,0.0f,0.0f);
    }
       updateGL();
}




das hat funktioniert.


was funktioniert bei dem movePolygon nicht?
wie würde man das am besten machen um ein Objekt zu bewegen?
und was sagt ihr zu meinen Initialisierungen(ich bin mir noch immer nicht ganz im klaren was die genau machen)






würde mich freuen auf eine antwort.


mfg
slei

Sleicreider

Frischling

  • »Sleicreider« ist der Autor dieses Themas

Beiträge: 45

Wohnort: Österreich,Steiermark

Beruf: Softwareentwickler

  • Private Nachricht senden

2

26.09.2012, 12:10

aja weil ich eh schon so viel frage:

ich habe OpenGL schonmal mit Java/Android programmiert(auch nicht viel) und dort einen vertex/index buffer benutzt. und hier jetzt einfahc mit glBegin und glEnd gezeichnet
was ist da der unterschied?

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

26.09.2012, 12:13

Im wesentlichen, dass glBegin/glEnd wesentlich langsamer, nicht mehr üblich und total veraltet ist. Dazu verwendet man jetzt VBO. Im visuellen Ergebnis ist es gleich ;)

4

26.09.2012, 13:05

Ansich sieht der Code schon ganz ok aus.
In der MovePolygon Methode solltest du nur evtl. darauf achten, im richtigen MatrixMode zu sein, und natürlich die Translation nicht auf einen festen Wert zu setzen. Entweder du speicherst die Position irgendwo zwischen und setzt die dann, oder machst wirklich nur die relative Bewegung (also ohne das LoadIdentity). Ansonsten vielleicht einfach nochmal ein bisschen was über Matrizenrechnung lesen, durch ausprobieren kommt man da nämlich nicht weit.
Lieber dumm fragen, als dumm bleiben!

Sleicreider

Frischling

  • »Sleicreider« ist der Autor dieses Themas

Beiträge: 45

Wohnort: Österreich,Steiermark

Beruf: Softwareentwickler

  • Private Nachricht senden

5

26.09.2012, 15:07

matrizen berechnen hab ich bereits in der schule gelernt, muss aber erlich sagen, keine ahnung wie ich das hier anwenden soll.
und wie meinst du das mit dem zwischenspeichern und setzten?

Werbeanzeige