Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.
Toon posts:

OpenGL picking problemen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Sinds gister probeer ik picking werkend te krijgen met behulp van FLTK en OpenGL, maar tot nu toe zonder resultaat. Via diverse tutorials en examples heb ik diverse implementaties geprobeerd. De examples werken snel maar wanneer ik een eigen implementatie doe werkt het niet.
In alle door mij geprobeerde gevallen blijft het aantal hits gedetecteerd door glRenderMode(GL_RENDER) 0.

Mijn huidige testcase:

C++:
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
98
99
100
101
102
103
104
105
106
#include "Renderer.h"

#include <stdio.h>
#include <stdlib.h>

Renderer::Renderer(int x, int y, int width, int height) : Fl_Gl_Window(x, y, width, height) {
    Fl::add_idle(idle, this);
}

void Renderer::draw() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    if (!valid()) {
        glEnable(GL_CULL_FACE);
        glCullFace(GL_BACK);
            glEnable(GL_DEPTH_TEST);
            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glEnable(GL_NORMALIZE);
    }

    drawClear();        
    drawSetupTransform();

    float ratio = w() / h();
    glFrustum(-0.1f * ratio, 0.1f * ratio, -0.1f, 0.1f, 0.2f, 100.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0, 0, 0, 10, 10, 10, 0, 1, 0);

    glTranslatef(20,20,20);
    drawObjects();
}

void Renderer::drawClear() {
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glClearColor(0,0,0,0);
    glClear(GL_COLOR_BUFFER_BIT);
}

void Renderer::drawObjects() {
    glLoadName(7);
    glBegin(GL_LINES);
        glColor3f(1.0f, 0.0f, 0.0f);
            glVertex3f(0.0f, 0.0f, 0.0f);
            glVertex3f(5.0f, 0.0f, 0.0f);
        glColor3f(0.0f, 1.0f, 0.0f);
            glVertex3f( 0.0f, 0.0f, 0.0f);
            glVertex3f( 0.0f, 5.0f, 0.0f);
        glColor3f(0.0f, 0.0f, 1.0f);
            glVertex3f(0.0f, 0.0f, 0.0f);
            glVertex3f(0.0f, 0.0f, 5.0f);
    glEnd();
}

void Renderer::drawSetupTransform() {
    glOrtho(-1,1,-1,1,-1,1);
}


int Renderer::handle(int event) {
    switch (event) {
        case FL_FOCUS:
            break;
        case FL_UNFOCUS:
            event = 1;
            break;
        case FL_PUSH:
            pick(Fl::event_x(), Fl::event_y());
            break;
    }

    return Fl_Gl_Window::handle(event);
}

void Renderer::idle(void* data) {
    Renderer* window = (Renderer*)data;
    window->redraw();
}

void Renderer::pick(int x, int y) {
    //0,0 in GL leftunder, WINDOW is 0,0 uperleft
    y = 600 -y;

    make_current();

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    
    int viewport[4];
    glGetIntegerv(GL_VIEWPORT, viewport);

    gluPickMatrix(x,viewport[3]-y,5,5,viewport);
    drawSetupTransform();

    GLuint buf[100];
    glSelectBuffer(100,buf);
    glRenderMode(GL_SELECT);
    glInitNames();
    glPushName(0);

    drawObjects();
    int hits = glRenderMode(GL_RENDER);
    printf("number of hits %d\n", hits);
}


Voor zover ik heb begrepen wordt er een mini viewport gemaakt rondom mijn muis en de namen van de objecten die daarin worden "gerenderd" worden in de namestack gezet samen met dept informatie etc.. Zodra ik met glRenderMode(GL_RENDER) de render mode GL_SELECT verlaat verwacht ik dat hij informatie toont (bijvoorbeeld aantal hits) maar dit blijft dus voor mij onverklaarbaar op 0.

  • Comp_Lex
  • Registratie: Juni 2005
  • Laatst online: 23:12

Verwijderd

Topicstarter
Dat heb ik inderdaad gelezen, voor zover ik weet switch ik in de code wel naar glRenderMode(GL_SELECT) ergens las ik dat hij altijd een record (dus 1 hit ) terug zou moeten geven. In mijn geval krijg ik 0 terug.. dit zou betekenen dat ik op moment van aanroepen in de GL_RENDER mode zou zitten.. maar ik weet niet beter dan dat ik in de select mode zit.

Na even getest te hebben blijkt het inderdaad te gaan zoals verwacht de objecten worden getekend in GL_SELECT mode en na het aanroepn van glRenderMode(GL_RENDER) zit ik weer in render mode. maar ik krijg een 0 terug...

  • Comp_Lex
  • Registratie: Juni 2005
  • Laatst online: 23:12
The return value of glRenderMode is determined by the render
mode at the time glRenderMode is called, rather than by
mode. The values returned for the three render modes are as
follows:

GL_RENDER 0.

GL_SELECT The number of hit records transferred to the
select buffer.

GL_FEEDBACK The number of values (not vertices)
transferred to the feedback buffer.
Ik denk dat je met de call glRenderMode(GL_RENDER) altijd een nul terug krijgt. Misschien is het handig om te checken wat voor waarde glRenderMode(GL_SELECT) geeft.

Verwijderd

Topicstarter
Ik heb gekeken wat hij terug geeft, helaas ook een nul.

  • svdree
  • Registratie: Februari 2006
  • Laatst online: 06-11 13:04
Je projection matrix setup moet in je pick functie hetzelfde zijn als in je draw functie, de gluPickMatrix modificeert deze. Lees de documentatie van gluPickMatrix nog eens door.

Verwijderd

Topicstarter
svdree schreef op vrijdag 04 juli 2008 @ 12:12:
Je projection matrix setup moet in je pick functie hetzelfde zijn als in je draw functie, de gluPickMatrix modificeert deze. Lees de documentatie van gluPickMatrix nog eens door.
Hoe kan ik dit realiseren? Ik heb het meerdere keren weer doorgelezen, maar kom er niet uit...

Verwijderd

Topicstarter
Het is gelukt! Het zetten van het perspectief ging niet goed. Ondertussen pick ik er vrolijk op los. Oh en glRenderMode(GL_RENDER) geeft dus toch wel het aantal hits weer als terug keer waarde (PO'er en ik dachten van niet zie boven)

Vriendelijk bedankt voor de hulp.
Pagina: 1