2012-08-29 5 views

답변

-2

카메라를 드래그하여 회전하고 휠을 사용하여 확대/축소 할 수 있습니다. 중요한 것은 서로 다른 축에서 회전하는 것이 다른 중첩 된 객체에서 처리되어야하므로 회전 계산이 실제 세계에서 기대하는대로 서로 영향을 주어야한다는 것입니다.

+0

@GlenMorse 여기에 링크 된 글이 있습니다. http://delphiscience.wordpress.com/2012/11/14/making-a-pipe-with-bend-feature-using-delphi-firemonkey/ –

+0

와우, 답변 그건 전혀 도움이 안된다. 코드는 어때? 모든 바보는 드래그하고 마우스 휠 이벤트를해야한다는 것을 알고 있습니다. –

1

다음 양식은 .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 이상에서 작동해야합니다.

관련 문제