При выводе контрольных точек в режиме выбора точки последовательно именуются:
For i := 0 to 3 do
For j := 0 to 3 do begin
If mode = GL_SELECT then glLoadName (i * 4 + 3); // загрузка имени
glBegin (GL_POINTS);
glVertexSfv (@grid4x4[i] [j ] ) ; // вершины массива опорных точек
glEnd;
end;
При щелчке кнопки находим номер опорной точки под курсором
selectedPoint := DoSelect (x, у); // выбранная точка
При выборе воспроизводятся только опорные точки, саму сетку воспроизводить нет смысла Перемещая курсор, вызываем команду gluUnProject для получения соответствующих пространственных координат
If selectedPoint >= 0 then Begin
// получаем пространственные координаты, соответствующие
// положению курсора
gluUnProject(x, ClientHeight - у, 0.95, @modelMatrix, @projMatrix,
@viewport, objx, objy, objz);
// передвигаем выбранную точку
grid4x4 [selectedPoint div 4, selectedPoint mod 4, 0] := objx,
grid4X4 [selectedPoint div 4, selectedPoint mod 4, 1]:= objy,
InvalidateRect(Handle, nil, False);
end
Используемые массивы с характеристиками видовых матриц заполняются при обработке события onResize
Этот пример может оказаться полезным для построения несложных редакторов Положение соответствующей точки в пространстве здесь находится точно, независимо от текущих установок видовых параметров, опорные точки перемещаются вслед за курсором Хотя получаемые построения выглядят вполне "объемно", здесь мы имеем дело с двумерными изображениями При переходе в пространство, несмотря на легкость перевода экранных координат в координаты модели, избежать неоднозначности определения положения точки в пространстве не удается При изометрической проекции объемных объектов нелегко понять замысел пользователя, перемещающего элемент в пространстве Многие редакторы и модельеры имеют интерфейс,
подобный интерфейсу рассмотренного примера, когда элементы перемещаются в точности вслед за курсором, однако лично я часто становлюсь в тупик, работая с такими приложениями При проектировании нашего собственного редактора мы предложим несколько иной подход, избавляющий от этой неопределенности.