我一直在使用GLSceneViewer1.Buffer.GetPickedObject(x,y)来选择GLViewceneMouseDown事件中的GLscene对象。我需要选择一个对象,改变颜色,用鼠标左键单击,取消选择另一个鼠标左键单击,如果选择了另一个对象,则取消选择它。看来,TGLSceneObject需要一个属性IsPicked:布尔值为我能够实现这一点。如果有人知道不用修改GLScene这样做会很酷。这是我写的那种作品的代码,但有些没有。 SetSelected(Selected,SelectedColor)仅更改所选对象的颜色。GLScene采摘
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;