Witajcie,
Załóżmy najprostszą sytuację na świecie. Mam narysowane 3 punkty w OpenGL
glBegin(GL_POINTS);
glColor3ub(255,0,0);
glVertex3i(0,0,0);
glColor3ub(0,255,0);
glVertex3i(1,1,0);
glColor3ub(0,0,255);
glVertex3i(1,1,1);
glEnd;
To taki mega prosty przykład. Ponadto na obsłudze myszy mam zrobiony zoom:
gluLookAt(0,0,KameraZ, //polozenie oka
0,0,0,
0,1,0); //kierunek "do gory"
obrót:
glRotatef(Theta, 1.0, 0.0, 0.0); //wokol OX
glRotatef(Phi, 0.0, 1.0, 0.0); //wokol OY
oraz przesunięcie całości w prawo/lewo oraz góra dół:
glTranslated(MoveX,MoveY,0);
Teraz chciałbym zrobić taki myk, że jeśli kliknę myszą z wciśniętym shiftem w dowolny punkt i pod wskazanymi współrzędnymi znajduje się punkt to zwrócić X,Y,Z oraz R,G,B
Zrobiłem coś takiego:
procedure MouseClick(const X, Y: Integer);
var
viewport : Array[0..3] of glUint;
modelview, projection: Array[0..15] of GLdouble;
WinX, WinY, WinZ: GLfloat;
worldX, worldY, worldZ: Double;
i: Integer;
begin
glGetDoublev(GL_MODELVIEW_MATRIX, @modelview );
glGetDoublev(GL_PROJECTION_MATRIX, @projection );
glGetIntegerv(GL_VIEWPORT, @viewport );
winX := X;
winY :=viewport[3] - Y - 27;
winZ := 0;
gluUnProject( winX, winY, winZ, @modelview, @projection, @viewport, worldX,
worldY, worldZ);
for I := 0 to High(stars) do
if (Round(stars[i].x) = Round(WorldX)) and
(Round(stars[i].y) = Round(WorldY)) then
begin
sbar.Panels[0].Text := 'R:'+FloatToStr(stars[i].R)+',G:'+FloatToStr(stars[i].G)+',B:'+FloatToStr(stars[i].B);
Break;
end;
end;
procedure pPaintMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if (ssShift in Shift) and (Button = mbLeft) then
MouseClick(x,y);
end;
Niestety nie działa mi to za dobrze ... możecie podpowiedzieć o czym zapomniałem?
PS.
Zapomniałem dodać punkty mam w tablicy Stars