[3D Scene]

Icon コントロール ユニットスコープ DocWiki
(ja)
DocWiki
(en)
TCamera FMX.Controls3D
(XE4 またはそれ以前は FMX.Types3D)
[DocWiki][DocWiki]
TLight FMX.Controls3D
(XE4 またはそれ以前は FMX.Types3D)
[DocWiki][DocWiki]
TProxyObjectFMX.Controls3D
(XE4 またはそれ以前は FMX.Types3D)
[DocWiki][DocWiki]
TDummy FMX.Objects3D
(XE4 またはそれ以前は FMX.Types3D)
[DocWiki][DocWiki]

TCamera

3D オブジェクトの視点を切り替えるのに利用します。

TForm3D または TViewPort3D の Camera プロパティに TCamera を設定し、UsingDesignCamera を False にする事でカメラの視点に変更できます。コードで実行時にカメラを切り替える場合には Repaint しなくてはなりません。

See Also:


TDummy

見えないダミーのオブジェクトです。高橋さんではありません (^^;

主な使い方は、複数の 3D オブジェクトを TDummy の子に指定するというものです。例えば、TConeTCube 等の基本的な 3D オブジェクトを積み木のように組み合わせて複雑な形状の 3D オブジェクトを作った場合、これらを TDummy の子として配置すれば、TDummy を移動するだけですべての 3D オブジェクトを同時に移動させる事ができます。

  

また、子コントロールをオフセット配置する事によって、座標変換を行う事ができます。

例えば、TCamera を子としてオフセット配置し、TDummy を回転させれば、オブジェクトを周回するカメラになります。カメラを単純に座標計算で移動しても、カメラはオブジェクトを捉えない事に注意が必要です (自転車のペダルのように常に同じ方を向いてしまうためです)。

See Also:


TLight

光源です。TLightType の値は以下のようになっています。

光源からの距離による光の減衰率も指定できます。

TLight には Ambient / Diffuse / Specular という反射光を指定するプロパティがあります。これは投光する光の成分を限定するもので、例えば Specular に NULL を指定すると、ライトの影響を受ける 3D オブジェクトをすべてツヤ消しにできます。カラー値のアルファ成分は無視されます。

See Also:


TProxyObject

3D オブジェクトの代理オブジェクトを生成するのに使います。

左の TCone が実体で、右の 3 つは代理オブジェクトです。TCone にはテクスチャが貼ってありますが、これを 4 つの TCone (のコピー) で表現しようとすると 4 倍のテクスチャが必要になります。

例えば、森を表現するのに 一つの TModel3D で木のモデルデータを読み込み、複数の TProxyObject を配置して SourceObject に TModel3D を指定すれば、TModel3D をコピーして使うよりも効率を上げる事ができます。複数のポインタを使って実体を参照するのと似ています。

...想定される用途としては、やはり TModel3D の代理オブジェクトなのでしょうが、実際に TProxyObject に TModel3D を指定してみると代理オブジェクトは表示されません (QC#103139)。TModel3D を SourceObject に指定したい場合には以下のユニットを利用します。

[uProxyObjectFix.pas]
unit uProxyObjectFix;

interface

uses
  System.Types, FMX.Controls3D, FMX.Types;

type
  TControl3Dhelper = class Helper for TControl3D
  private
    // Access Methods
    function Get_Size: TPoint3D;
    procedure Set_Size(const Value: TPoint3D);
    function GetAbsolMatrix: TMatrix3D;
    procedure SetAbsoluteMatrix(const Value: TMatrix3D);
    // Methods
    procedure RecalcChildrenAbsolute;
    procedure RenderTree;
  public
    // Properties
    property _Size: TPoint3D read Get_Size write Set_Size;
    property AbsoluteMatrix: TMatrix3D read GetAbsolMatrix write SetAbsoluteMatrix;
  end;

  TProxyObject = class(FMX.Controls3D.TProxyObject)
  protected
    { protected }
    procedure Render; override;
  end;

implementation

{ TControl3Dhelper }

function TControl3Dhelper.GetAbsolMatrix: TMatrix3D;
begin
  result := Self.GetAbsoluteMatrix;
end;

function TControl3Dhelper.Get_Size: TPoint3D;
begin
  result.X := FWidth;
  result.Y := FHeight;
  result.Z := FDepth;
end;

procedure TControl3Dhelper.RecalcChildrenAbsolute;
var
  F: TFmxObject;
begin
  if Assigned(Children) then
    for F in Children do
      if (F is TControl3D) then
        (F as TControl3D).RecalcAbsolute;
end;

procedure TControl3Dhelper.RenderTree;
begin
  RenderInternal;
end;

procedure TControl3Dhelper.SetAbsoluteMatrix(const Value: TMatrix3D);
begin
  FAbsoluteMatrix := Value;
  FRecalcAbsolute := False;
  RecalcChildrenAbsolute;
end;

procedure TControl3Dhelper.Set_Size(const Value: TPoint3D);
begin
  FWidth  := Value.X;
  FHeight := Value.Y;
  FDepth  := Value.Z;
end;

{ TProxyObject }

procedure TProxyObject.Render;
var
  M: TMatrix3D;
  S: TPoint3D;
begin
  if Assigned(SourceObject) then
    with SourceObject do
      begin
        M := AbsoluteMatrix;
        S := _Size;
        AbsoluteMatrix := Self.AbsoluteMatrix;
        _Size := Self._Size;
        SourceObject.RenderTree;
        AbsoluteMatrix := M;
        _Size := S;
      end;
end;
end.

使い方は簡単です。

  1. 上記 uProxyObjectFix.pas をプロジェクトに追加
  2. TProxyObject を使っているユニットの uses に uProxyObjectFix を追加。

See Also:


 BACK