2012-08-29 57 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应用程序。关键部分是将相机&嵌套的灯光对象放在Y轴的单独X &上与作为相机目标的DummyObject相连。将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以上。