私はGLSceneViewer1.Buffer.GetPickedObject(x、y)を使用して、pickデモごとにGLViewerMouseDownイベントでGLsceneオブジェクトを選択しています。私は、オブジェクトを選択し、左のマウスクリックで色を変更し、別の左のマウスクリックで選択を解除し、別のオブジェクトが選択されていない場合は選択を解除する必要があります。 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;