Я использовал GLSceneViewer1.Buffer.GetPickedObject (x, y), чтобы выбрать объекты GLscene в событии GLViewerMouseDown для каждой демонстрации. Мне нужно выбрать объект, изменить цвет, щелкнуть левой кнопкой мыши и снять выделение с помощью другого щелчка левой кнопкой мыши, а если выбран другой объект, он не выбран. Кажется, что для TGLSceneObject требуется свойство IsPicked: boolean для меня, чтобы иметь возможность достичь этого. Если кто-то знает, что делать это без модификации GLScene, было бы круто. Вот код, который я написал, вроде как работы, но вроде этого нет. SetSelected (Selected, SelectedColor) просто изменяет цвет выбранного объекта.GLScene picking
procedure TForm32.GLSceneViewer1MouseDown(Sender : TObject; Button : TMouseButton; Shift : TShiftState; X, Y : Integer);
var
Selected : TGLSceneObject;
AButton : TGLMouseButton;
begin
AButton := TGLMouseButton(Button);
// if an object is picked...
Selected := (GLSceneViewer1.Buffer.GetPickedObject(x, y) as TGLSceneObject);
case AButton of
mbLeft:
begin
if(Selected <> UnSelected) then
begin
if(Assigned(Selected)) then
begin
SetSelected(Selected, SelectedColor);
StatusBar1.Panels[0].Text := 'Selected';
UnSelected := Selected;
end
else
if(not Assigned(Selected)) then
begin
UnSelected.Material.FrontProperties.Emission.Color:= clrBlack;
UnSelected.Material.FrontProperties.Ambient.Color := clrGray20;
UnSelected.Material.FrontProperties.Diffuse.Color := clrGray80;
StatusBar1.Panels[0].Text := 'Unselected';
UnSelected := Selected;
end;
end;
end;
end;
end;
Для меня это было бы проще:
procedure TForm32.GLSceneViewer1MouseDown(Sender : TObject; Button : TMouseButton; Shift : TShiftState; X, Y : Integer);
var
Selected : TGLSceneObject;
begin
Selected := (GLSceneViewer1.Buffer.GetPickedObject(x, y) as TGLSceneObject);
if(not Selected.IsPicked) then
SetSelected(Selected, SelectedColor)
else
SetSelected(Selected, UnSelectedColor);
end;