3D シェイプの色とか質感ってどうやって変えるの?

反射色

<!> XE3 以降では Material プロパティを [Materials] の TLightMaterialSource で読み替えてください <!>

3D シェイプそのものの色は Material.Diffuse で決定されます。

FireMonkey では 質感は 3 つの反射色で決定されます...つまり、"フォンの反射モデル" が採用されています。

通常、Material.Ambient と Material.Diffuse は同じ色を指定します。Material.Specular は鏡面反射で明るい色を指定するとツルツルとした材質を表現できます。鏡面反射の強さ (光沢度) は Material.Shinness で指定し(0~100)、値が大きいほど光は強く、ハイライト部は狭くなります。

ハイライト部に三角形が見えるのは グーローシェーディング の特徴です。FireMonkey は フォンシェーディング を利用できません。それぞれの反射色を無効にするにはアルファカラーに NULL を指定します。

半透明オブジェクト

半透明のオブジェクトを実現するには、Material.Diffuse にアルファカラーを設定するか、Opacity の値を小さくします。以下は二重の TSphere で、外側の TSphere の Material.Diffuse にアルファカラー (#00404040) を指定してみた所です。

...ところが、実際には Material.Diffuse にアルファカラーを設定しても内側の TSphere が見えない事があります。

両者のプロパティは全く同一ですが、今度は透過していません。何故でしょうか?

違いは作成順序にあります。FireMonkey の制限ではないので詳細は省きますが、半透明のオブジェクトを正しく扱うには 2 つの決まりごとがあります。

オブジェクトの作成順の変更は、オブジェクトを右クリックして "前面に移動" / "背面に移動" を行います。コードで変更するのであれば、BringToFront / SendtoBack を使います。

See Also:

ワイヤーフレームとフラットシェーディング

3D シェイプをワイヤーフレームで表現したい場合には、Material.FillMode に fmWireframe を指定します。球体をミラーボールのようにワザとカクカクさせたい場合には、Material.ShadeMode に smFlat (フラットシェーディング) を指定します。

  

これらのプロパティは XE3 以降には存在しません。XE3 以降でワイヤーフレームを描画するには TCustomMesh を使います。

  1. 3D シェイプ (ここでは Sphere1) に TColorMaterialSource を割り当て (ColorMaterialSource1)、Color プロパティを Null に設定します。
  2. フォームにもう一つ TColorMaterialSource を貼り (ColorMaterialSource2)、Color プロパティを Aqua に設定します。これがワイヤーフレームの色になります。
  3. 以下のようなコードを記述します。
    type
      TWireFrameMesh = class(TCustomMesh);
    
    procedure TForm1.WireframeRender(Sender: TObject; Context: TContext3D);
    var
      V: TVertexBuffer;
      I: TIndexBuffer;
    begin
      V := TWireFrameMesh(Sender).Data.Vertexbuffer;
      I := TWireFrameMesh(Sender).Data.Indexbuffer;
      Context.DrawLines(V, I, TMaterialSource.ValidMaterial(ColorMaterialSource2), 1);
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Sphere1.OnRender := WireframeRender;
    end;
  4. 実行するとワイヤーフレームで描画されます。

3D シェイプの MaterialSource にテクスチャを割り当てて実行すると、テクスチャとワイヤーフレームが合成されて描画されます。

See Also:

軸の分割 / 高さの分割 / キャップの分割

3D シェイプの内、TSphere / TCylinder / TCone には、シェイプを形成する三角形フェースを分割する機能があります。

軸の分割を指定する SubdivisionsAxes プロパティの値を小さくすると TCylinderTCone で三角柱や三角錐を作ることができます。逆に大きくすると TSphere は真球に近くなり、TCylinder は円柱に、TCone は円錐に近くなります (TCylinderTCone の初期値は 12 なので、初期状態だと正確には "十二角柱" と "十二角錐" です)。

   

高さの分割を指定する SubdivisionsHeight プロパティの値を変更すると TSphere のみ形状が変化します。高さ方向に分割されるため、値が小さくなるとミラーボール状から最終的にはソロバンの珠のようになります。逆に値を大きくすると真球に近づいて行きます。

   

キャップ (底面) の分割を指定する SubdivisionsCap プロパティの値は変更しても形状はほぼ変化しません。また、TSphere には SubdivisionsCap プロパティはありません。

  

形状が変化しない分割には意味がないのでしょうか?いえ、そうではありません。

  

"反射色" の項で触れたように、グーローシェーディング ではハイライトに三角形が見えてしまいますが、充分に細かい三角形フェースで分割された 3D シェイプはハイライトが自然に見えます。

See Also:


 BACK