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:
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.
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.