FireMonkey 3D에서 카메라 회전 및 확대/축소 예제를 검색합니다. 마우스 왼쪽 버튼을 사용하여 카메라를 장면 주위로 회전시키고 마우스 휠을 사용하여 확대/축소합니다.엠바 카데로 FireMonkey 3D 카메라 회전 및 줌
아무도 도와 줄 수 있습니까?
FireMonkey 3D에서 카메라 회전 및 확대/축소 예제를 검색합니다. 마우스 왼쪽 버튼을 사용하여 카메라를 장면 주위로 회전시키고 마우스 휠을 사용하여 확대/축소합니다.엠바 카데로 FireMonkey 3D 카메라 회전 및 줌
아무도 도와 줄 수 있습니까?
카메라를 드래그하여 회전하고 휠을 사용하여 확대/축소 할 수 있습니다. 중요한 것은 서로 다른 축에서 회전하는 것이 다른 중첩 된 객체에서 처리되어야하므로 회전 계산이 실제 세계에서 기대하는대로 서로 영향을 주어야한다는 것입니다.
다음 양식은 .fmx 및 .pas 파일을 저장하고 FMX 응용 프로그램에 양식을 추가하는 간단한 데모를 보여줍니다. 핵심 부분은 Camera & 중첩 된 조명 객체를 카메라 대상 인 DummyObject에 대한 별도의 X & Y 축에 배치하는 것입니다. X & Y를 별도의 더미 객체로 사용하면 회전이 수직 및 수평으로 이루어 지므로 어떤 상황에서는 바람직합니다. DummyX & DummyY 오브젝트를 더 실제의 회전 스타일을 제공하는 단일 DummyXY 오브젝트로 병합 할 수도 있지만 사용자의 필요에 따라 더 바람직합니다.
MainForm.pas :
unit MainForm;
interface
uses
FMX.Forms, FMX.Materials, System.Math.Vectors, FMX.Types3D, FMX.Objects3D, FMX.Controls3D, FMX.Viewport3D,
System.Classes, FMX.Types, FMX.Controls, FMX.Layouts, FMX.MaterialSources, System.Types, System.UITypes;
type
TForm1 = class(TForm)
Viewport3D: TViewport3D;
DummyX: TDummy;
DummyObject: TDummy;
CameraZ: TCamera;
Light1: TLight;
LayoutMain: TLayout;
DummyY: TDummy;
Cone1: TCone;
LightMaterialSource1: TLightMaterialSource;
procedure Viewport3DMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
procedure Viewport3DMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
procedure Viewport3DMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);
private
FDown: TPointF;
procedure DoZoom(aIn: Boolean);
public
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
const
CAMERA_MAX_Z = -2;
CAMERA_MIN_Z = -200;
ZOOM_STEP = 2;
procedure TForm1.DoZoom(aIn: Boolean);
var
newZ: Single;
begin
if aIn then
newZ := CameraZ.Position.Z + ZOOM_STEP
else
newZ := CameraZ.Position.Z - ZOOM_STEP;
if (newZ < CAMERA_MAX_Z) and (newZ > CAMERA_MIN_Z) then
CameraZ.Position.Z := newZ;
end;
procedure TForm1.Viewport3DMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
FDown := PointF(X, Y);
end;
procedure TForm1.Viewport3DMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
begin
if (ssLeft in Shift) then
begin
DummyX.RotationAngle.X := DummyX.RotationAngle.X - ((Y - FDown.Y) * 0.3);
DummyY.RotationAngle.Y := DummyY.RotationAngle.Y + ((X - FDown.X) * 0.3);
FDown := PointF(X, Y);
end;
end;
procedure TForm1.Viewport3DMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);
begin
DoZoom(WheelDelta > 0);
end;
end.
MainForm.fmx :
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 592
ClientWidth = 713
FormFactor.Width = 320
FormFactor.Height = 480
FormFactor.Devices = [Desktop]
DesignerMasterStyle = 0
object LayoutMain: TLayout
Align = Client
Size.Width = 713.000000000000000000
Size.Height = 592.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
object Viewport3D: TViewport3D
Align = Client
Camera = CameraZ
Size.Width = 713.000000000000000000
Size.Height = 592.000000000000000000
Size.PlatformDefault = False
UsingDesignCamera = False
OnMouseDown = Viewport3DMouseDown
OnMouseMove = Viewport3DMouseMove
OnMouseWheel = Viewport3DMouseWheel
object DummyX: TDummy
Width = 1.000000000000000000
Height = 1.000000000000000000
Depth = 1.000000000000000000
object DummyY: TDummy
Width = 1.000000000000000000
Height = 1.000000000000000000
Depth = 1.000000000000000000
object CameraZ: TCamera
AngleOfView = 45.000000000000000000
Target = DummyObject
Position.Z = -20.000000000000000000
Width = 1.000000000000000000
Height = 1.000000000000000000
Depth = 1.000000000000000000
object Light1: TLight
Color = claWhite
LightType = Directional
SpotCutOff = 180.000000000000000000
Width = 1.000000000000000000
Height = 1.000000000000000000
Depth = 1.000000000000000000
end
end
end
end
object DummyObject: TDummy
Width = 1.000000000000000000
Height = 1.000000000000000000
Depth = 1.000000000000000000
object Cone1: TCone
Width = 1.000000000000000000
Height = 1.000000000000000000
Depth = 1.000000000000000000
SubdivisionsCap = 3
MaterialSource = LightMaterialSource1
end
end
end
end
object LightMaterialSource1: TLightMaterialSource
Diffuse = claWhite
Ambient = xFF202020
Emissive = claNull
Specular = xFF606060
Shininess = 30
Left = 436
Top = 56
end
end
내가 어디 데모에서이 뽑아,하지만 내 요구에 잘 작동합니다. Delphi XE5 이상에서 작동해야합니다.
@GlenMorse 여기에 링크 된 글이 있습니다. http://delphiscience.wordpress.com/2012/11/14/making-a-pipe-with-bend-feature-using-delphi-firemonkey/ –
와우, 답변 그건 전혀 도움이 안된다. 코드는 어때? 모든 바보는 드래그하고 마우스 휠 이벤트를해야한다는 것을 알고 있습니다. –