[3D Scene]
TCamera
3D オブジェクトの視点を切り替えるのに利用します。
TForm3D または TViewPort3D の Camera プロパティに TCamera を設定し、UsingDesignCamera を False にする事でカメラの視点に変更できます。コードで実行時にカメラを切り替える場合には Repaint しなくてはなりません。
See Also:
TDummy
見えないダミーのオブジェクトです。高橋さんではありません (^^;
主な使い方は、複数の 3D オブジェクトを TDummy の子に指定するというものです。例えば、TCone や TCube 等の基本的な 3D オブジェクトを積み木のように組み合わせて複雑な形状の 3D オブジェクトを作った場合、これらを TDummy の子として配置すれば、TDummy を移動するだけですべての 3D オブジェクトを同時に移動させる事ができます。
また、子コントロールをオフセット配置する事によって、座標変換を行う事ができます。
例えば、TCamera を子としてオフセット配置し、TDummy を回転させれば、オブジェクトを周回するカメラになります。カメラを単純に座標計算で移動しても、カメラはオブジェクトを捉えない事に注意が必要です (自転車のペダルのように常に同じ方を向いてしまうためです)。
See Also:
TLight
光源です。TLightType の値は以下のようになっています。
- ltDirectional
並行光源です。どこに配置しても光の強さは変化しません。光を当てる方向はライトの向きで変わります。
- ltPoint
点光源です。ライトからの距離で光の強さが変化します。無指向性なので、全方向を照らします。光を当てる方向はライトの位置で変わります。
- ltSpot
スポット光源です。ライトからの距離で光の強さが変化します。指向性があるため、円錐状に照らします。光を当てる方向はライトの向きと位置で変わります。
SpotCutOff プロパティと SpotExponent プロパティで "スポットライトの照射角" と "スポットライト円の中心からの減衰率" を指定できます。
光源からの距離による光の減衰率も指定できます。
- ConstantAttenuation
一定減衰係数を指定します
- LiniarAttenuation
線形減衰係数を指定します
- QuadraticAttenuation
2 次減衰係数を指定します
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.
|
使い方は簡単です。
- 上記 uProxyObjectFix.pas をプロジェクトに追加
- TProxyObject を使っているユニットの uses に uProxyObjectFix を追加。
See Also: