アニメーションで、物体を90度ずつ回転させたい

解決


PENTA_MAX  2014-02-18 08:43:42  No: 46063

FireMonkey で、Cube1 と Cube2(親はCube1) の2つを描画し、
①マウスの左ボタンを押下したら、Y軸を中心に、  0 ->  90 回転
②マウスの左ボタンを押下したら、Y軸を中心に、 90 -> 180 回転
③マウスの左ボタンを押下したら、Y軸を中心に、180 -> 270 回転
④マウスの左ボタンを押下したら、Y軸を中心に、270 -> 360 回転
と90度づつ回転させたいのですが、ボタンを何度押下しても
0 -> 90 の間でしか回転しません。

①②③④の順に、Cube を回転させるには下記のコードを
どう修正すればいいですか。
詳しい方がいらっしゃいましたら、ご指導の程よろしくお願い致します。

作成手順

  ファイル
  新規作成
  FireMonkey デスクトップアプリケーション
  HD FireMonkey アプリケーション

  で作成。

  フォームに ツールパレットから、Viewport3D,Light,LightMaterialSource,Button を配置します。
  フォームをダブルクリックして、uses 節に FMX.Objects3D と FMX,Ani を手入力で追加します。

  親子関係
    Form1
    |
    +- Button1
    |
    +- Viewport3D1
       |
       +- Light1
       |
       +- LightMaterialSource1
       |
       +- Cube1  //<-- ツールパレットから配置ではなく、コードで記述する。
          |
          +- FloatAnimation  //<-- ツールパレットから配置ではなく、コードで記述する。
          |
          +- Cube2  //<-- ツールパレットから配置ではなく、コードで記述する。

// Unit1.pas ここから

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
  FMX.Objects3D, FMX.MaterialSources, FMX.Controls3D, FMX.Viewport3D,Fmx.Ani;

type
  TForm1 = class(TForm)
    Viewport3D1: TViewport3D;
    Light1: TLight;
    LightMaterialSource1: TLightMaterialSource;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { private 宣言 }

   Img_Cube1 : TCube;
   Img_Cube2 : TCube;

  public
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin

    with TFloatAnimation.Create(Viewport3D1) do begin
        Parent := Img_Cube1;
        PropertyName := 'RotationAngle.Y';
        AnimationType := TAnimationType.atIn;
        AutoReverse := False;
        Duration := 0.3;
        Loop := False;
        //Name := 'FloatAnimation1';
        Enabled := True;
        Interpolation := TInterpolationType.itLinear;
        StopValue := Img_Cube1.RotationAngle.Y + 90;
    end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin

    Img_Cube1 := TCube.Create(Viewport3D1);
    Img_Cube1.Parent := Viewport3D1;
    TCube(Img_Cube1).MaterialSource := LightMaterialSource1;
    LightMaterialSource1.Diffuse := TAlphaColorRec.Green;
    Img_Cube1.SetSize(2, 2, 2);
    Img_Cube1.Position.Point := Point3D(0, 0, 0);

    Img_Cube2 := TCube.Create(nil);
    Img_Cube2.Parent := Img_Cube1;
    TCube(Img_Cube2).MaterialSource := LightMaterialSource1;
    LightMaterialSource1.Diffuse := TAlphaColorRec.Green;
    Img_Cube2.SetSize(1, 1, 1);
    Img_Cube2.Position.Point := Point3D(3, 3, 1);

end;

end.

// Unit1.pas ここまで

使用環境
  Delphi XE5 Pro Update2
  Win7 Pro 64bit SP1


DEKO  2014-02-18 20:26:13  No: 46064

1.Enabled の位置がマズいです。

  Interpolation := TInterpolationType.itLinear;
  StopValue := Img_Cube1.RotationAngle.Y + 90;
  Enabled := True;

これで回るようにはなります。

2.StartValue が常に 0 です。

このままだと、
  0->90
  0->180
  0->270
  ...
と回転してしまいます。

  StartValue := Img_Cube1.RotationAngle.Y; 
  StopValue  := Img_Cube1.RotationAngle.Y + 90; 
  Enabled := True;

このように開始値を入れるか、

  StartFromCurrent := True;
  StopValue  := Img_Cube1.RotationAngle.Y + 90; 
  Enabled := True;

StartFromCurrent を True にして現在位置から回転するようにする必要があります。


PENTA_MAX  2014-02-19 08:54:34  No: 46065

StartValue := Img_Cube1.RotationAngle.Y;

StartFromCurrent := True;
で、
意図する動作になる事を確認しました。
DEKOさん、ご指導ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加