コードで記述した 3D Object を回転させたい。

解決


PENTA_MAX  2014-02-15 07:50:11  No: 46027

コードで記述した 3D Object を回転させたいのですが、
// <--- ★エラ−  の行で、未定義の識別子 というエラーメッセージがでます。
エラーを無くして Cubeをさせるにはどうすればいいですか。
詳しいかたがいらっしゃいましたら、ご指導の程よろしくお願い致します。

作成手順

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

  で作成。

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

やりたい事
  ツールパレットから Dummy,Cube を Form に配置せず、Dummy と Cube をコードで記述して、
  フォームに配置したボタンをクリックすると、(Cubeの親はDummy)キューブ(Dummy) が、Y軸を中心にして回転する。

親子関係
  Form1
  |
  +-Button1
  |
  +-Viewport3D1
    |
    +-Lighte1
    |
    +-LighteMaterialSource1
    |
    +-Dummy  //<-- ツールパレットから配置ではなく、コードで記述する。
      |
      +-Cube  //<-- ツールパレットから配置ではなく、コードで記述する。

Unit1.pas の内容

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.Viewport3D,FMX.Objects3D,FMX.MaterialSources,FMX.Controls3D;

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

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
    Img_Dummy := Img_Dummy.RotationAngle.Y + 90; // <--- ★エラ−
end;

procedure TForm1.FormCreate(Sender: TObject);

var
    Img_Dummy : TDummy;
    Img_Cube  : TCube;
    Img_Proxy : TProxyObject;

begin

    Img_Dummy := TDummy.Create(nil);
    Img_Dummy.Parent := Viewport3D1;
    Img_Dummy.SetSize(3, 3, 3);
    Img_Dummy.Position.Point := Point3D(0, 0, 0);
    Img_Dummy.RotationAngle.Y := 50;

    Img_Cube := TCube.Create(nil);
    Img_Cube.Parent := Img_Dummy;
    TCube(Img_Cube).MaterialSource := LightMaterialSource1;
    Img_Cube.SetSize(3, 3, 3);
    Img_Cube.Position.Point := Point3D(0, 0, 0);

end;

end.

Unit1.pas //ここまで

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


igy  2014-02-15 09:27:51  No: 46028

詳しくはないのですが、

procedure TForm1.FormCreate(Sender: TObject);
var
    Img_Dummy : TDummy;                    // <--- これを

type
  TForm1 = class(TForm)
    Viewport3D1: TViewport3D;
    Button1: TButton;
    LightMaterialSource1: TLightMaterialSource;
    Light1: TLight;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { private 宣言 }
    Img_Dummy : TDummy;                    // <--- ここに移動
  public
    { public 宣言 }
  end;

で、どうですか?


PENTA_MAX  2014-02-15 19:35:40  No: 46029

教えて頂いたとおりにして見たのですが、
[dcc32 エラー] Unit1.pas(44): E2010 'TDummy' と 'Extended' には互換性がありません
というエラーになりました。


igy  2014-02-15 19:51:15  No: 46030

>    Img_Dummy := Img_Dummy.RotationAngle.Y + 90;

Img_Dummy に代入しようとしているからかもしれません。


PENTA_MAX  2014-02-16 07:24:49  No: 46031

解決しました。
ご指導して頂いたとおりに、Img_Dummy : TDummy; を

private
    Img_Dummy : TDummy;

に移動して、ボタン(Button1Click)に記述するコードを下記のように
変更したら意図する動作を確認する事が出来ました。

igy さん ご指導ありがとうございました。

procedure TForm1.Button1Click(Sender: TObject);
begin
//  Img_Dummy                 := Img_Dummy.RotationAngle.Y + 90; // NG <-- 90だと動いているか分からないので45に変更
    Img_Dummy.RotationAngle.Y := Img_Dummy.RotationAngle.Y + 45; // OK
end;


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

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






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