[OpenGL]Object gecentreerd houden

Pagina: 1
Acties:

  • Ivo
  • Registratie: Juni 2001
  • Laatst online: 14-01-2025
Ik ben het boek Computer Graphics with OpenGL aan het doorwerken en ik probeer een opdracht te maken, waarin je een stuk code moet aanpassen, zodanig dat de zeshoek die getekend wordt altijd in het midden terecht komt. Mijn idee was om het middelpunt van de zeshoek op punt (0,0) te definieren en het coordinatenstelsel telkens van [-breedte/2,breedte/2]x[-hoogte/2,hoogte/2] te laten lopen. Dit heeft echter totaal niet het verwachtte effect.

code:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <GL/glut.h>
#include <math.h>
#include<stdlib.h>
#include <stdio.h>

const double TWO_PI = 6.2831853;

// Initial display window size
GLuint regHex;
int winWidth, winHeight;

class screenPt
{
    private:
        GLint x,y;

    public:
        //Default constructor: initialize coordinate points to (0,0)
        screenPt()
        {
            x = y = 0;
        }

        void setCoords(GLint xCoord, GLint yCoord)
        {
            x = xCoord;
            y = yCoord;
        }

        GLint getx() const
        {
            return x;
        }

        GLint gety() const
        {
            return y;
        }

};

static void init (void)
{
    screenPt hexVertex;
    GLdouble theta;
    GLint k;

    glClearColor(1.0, 1.0, 1.0, 0.0); //Display window color is white

    /* Set up a display list for a red regular hexagon.
     * Vertices for the hexagon are six equally spaced
     * points around the circumference of a circle.
     */
    regHex = glGenLists(1); //Get an identifier for the display list.
    glNewList(regHex,GL_COMPILE);
        glColor3f(1.0, 0.0, 0.0); //Set fill color for the hexagon to red
        glBegin(GL_POLYGON);
            for (k=0;k<6;k++)
            {
                theta = TWO_PI*k/6.0;
                hexVertex.setCoords(150*cos(theta),
                        150*sin(theta));
                glVertex2i(hexVertex.getx(), hexVertex.gety());
            }
        glEnd();
    glEndList();
}

void regHexagon(void)
{
        glClear(GL_COLOR_BUFFER_BIT);
    glCallList(regHex);
    glFlush();
}

void winReshapeFcn(int newWidth, int newHeight)
{
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D( -newWidth/2, newWidth/2, -newWidth/2, newWidth/2);
}

int main( int argc,char ** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowPosition(100,100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("Reshape-function & Display List example");
    init();
    glutDisplayFunc(regHexagon);
    glutReshapeFunc(winReshapeFcn);

    glutMainLoop();
    exit(EXIT_SUCCESS);
}


Iemand enig idee waarom dit niet werkt?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21-04 22:35

Creepy

Tactical Espionage Splatterer

Wat voor effect heeft het dan wel? En welke zaken heb je nu zelf geprobeerd om het juist effect te krijgen? Weet je 100% zeker dat de coordinaten die je genereerd kloppen? En heb je gezien dat je bij de aanroep van gluOrtho2D je alleen de Width gebruikt?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Ivo
  • Registratie: Juni 2001
  • Laatst online: 14-01-2025
Het effect is dat de zeshoek altijd ergens linksonderin de hoek blijft. Het coordinatenstelsel heeft de oorsprong niet in het midden, wat ik wel probeer te bereiken met die gluOrtho2D aanroep. Voor de rest heb ik het ook nog geprobeerd met gluOrtho2D(-200,200,-200,200), maar het enige wat ik dan bereik is dat de vorm van de rechthoek constant blijft.

De coordinaten kloppen, want die zijn rechtstreeks uit het voorbeeld uit het boek gehaald en de zeshoek wordt altijd wel goed getekend, enkel de positie van het figuur is verkeerd na het reshapen van een window.

Edit: Die 4x newWidth is een overblijfsel van veel gerommel in de source om vanalles te proberen, weinig constructiefs.

[ Voor 10% gewijzigd door Ivo op 08-12-2005 12:24 ]


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Reshapen van een window... wat houdt dat in? Resizen van het window?

In theorie moet je je (0,0) coordinate naar linksonder translaten en dan je figuur tekenen alsof hij normaal linksboven het midden van het scherm werd getekend. (na pushmatrix uiteraard)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-04 01:08

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat zou niet moeten, de oorsprong van z'n coordinatenstelsel zou in het midden van z'n scherm moeten vallen. Wordt je window reshape code überhaupt wel aangeroepen?

[ Voor 21% gewijzigd door .oisyn op 08-12-2005 14:22 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Ivo
  • Registratie: Juni 2001
  • Laatst online: 14-01-2025
Reshapen van een window... wat houdt dat in? Resizen van het window?
Ja, daar bedoel ik resizen mee.
Wordt je window reshape code überhaupt wel aangeroepen?
Ja, als ik er een printf statement in zet dan krijg ik gewoon netjes per keer dat ik het window resize + de initialisatie van het window output op de commandline.

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Je past de projectie wel aan met gluOrtho2D maar je viewport (het deel van je window waarop het resultaat komt) blijft hetzelfde. Voeg een glViewport(0, 0, newWidth, newHeight) toe aan je reshape functie.

www.madwizard.org


  • Ivo
  • Registratie: Juni 2001
  • Laatst online: 14-01-2025
Bedankt zeg, dat was hem! Ik ben net een paar dagen bezig met OpenGL en het is allemaal redelijk straightforward, maar dit soort dingen moet je maar net weten. De functie glViewport ben ik trouwens nog niet tegengekomen in het boek, dus waarschijnlijk moet je het op een andere manier doen, maar ik vind de oplossing met een coordinatenstelsel met de oorsprong in het midden wel een nette oplossing.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-04 01:08

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik snap alleen niet waarom je je viewport opnieuw in zou moeten stellen. Je window wordt groter, dus wat je zou verwachten is dat ie dezelfde rectangle op het scherm houdt zodat je in principe een ongerenderde rand aan de rechter- en onderkant hebben.

Maar goed, opengl suckt dan ook ;)

[ Voor 48% gewijzigd door .oisyn op 08-12-2005 17:55 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

.oisyn schreef op donderdag 08 december 2005 @ 17:53:
Ik snap alleen niet waarom je je viewport opnieuw in zou moeten stellen. Je window wordt groter, dus wat je zou verwachten is dat ie dezelfde rectangle op het scherm houdt zodat je in principe een ongerenderde rand aan de rechter- en onderkant hebben.
Dat krijg je ook, behalve dat (0,0) linksonder zit bij openGL dus de rechter en bovenkant worden niet gerenderd. Dat ze er niet 'ongerenderd' uit zien komt omdat glClear volgens mij het hele window kleurt en dus niet alleen de viewport. En hij wordt kleiner in beeld omdat het 3D gebied wel groter wordt gemaakt met glOrtho2D terwijl de viewport hetzelfde blijft. De viewport is het deel van het venster waar op dat moment gerenderd wordt (het is de laatste transformatie in de pipeline), maar de color buffer (waar alles op getekend wordt) blijft volgens mij altijd het hele venster.

[ Voor 3% gewijzigd door madwizard op 08-12-2005 19:30 ]

www.madwizard.org


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-04 01:08

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat snap ik, maar wat ik bedoel is dat ik het vreemd vind dat z'n polygon naar linksonder verdwijnt. Misschien vat ik het verkeerd op en blijft de poly eigenlijk op z'n eigen plek in de window, maar beweegt ie niet proportioneel mee met de grootte. Of is het echt zo dat de poly echt in de hoek zit?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

.oisyn schreef op vrijdag 09 december 2005 @ 00:25:
Dat snap ik, maar wat ik bedoel is dat ik het vreemd vind dat z'n polygon naar linksonder verdwijnt. Misschien vat ik het verkeerd op en blijft de poly eigenlijk op z'n eigen plek in de window, maar beweegt ie niet proportioneel mee met de grootte. Of is het echt zo dat de poly echt in de hoek zit?
De poly blijft idd op z'n eigen plek, hij wordt kleiner maar middelpunt blijft hetzelfde.

www.madwizard.org

Pagina: 1