FMXで任意の3D描画

146 views
Skip to first unread message

yTake

unread,
May 22, 2020, 2:07:37 AM5/22/20
to Japan RAD Studio User Group
こちらへは初めての質問になるかと思います。yTakeです。

DELPHI XE6でHD Firemonkeyアプリケーションを作成します。

ここに、二次元分布を3Dで表示させたいと思います。
例えば、天気予報などアメダス(?)での雨量棒グラフみたいなイメージ。或いは、その棒グラフの頂上をメッシュで繋ぐ様な描画です。
二次元の濃淡データを俯瞰すると伝えれば良いでしょうか?


”TViewport3D”コンポーネントを配置し、”TGrid3D”コンポーネントを張り付けてみました。
"TGrid3D"に二次元の分布データを登録する様に思いましたが、その為のコンポーネントがあるのでしょうか?
3D図形のコンポーネントはいくつかある様です。
陰影もつけるつもりはないので、"TLight"等のコンポーネントは不要かなと思っています。(描画出来たら、気が変わるかもしれません)


或いは、参考になるサイトなどはあるでしょうか?
もしあればご紹介頂けると幸いです。

めぼしいサイトには辿り着けていません。
Embarcadero社の"FireMonkey 3D"のページは参照しましたが、理解できていません。



漠然とした質問ですみません。
取っ掛かりが無くて困っています。


よろしくお願いします。

梅澤智実

unread,
May 25, 2020, 2:24:00 AM5/25/20
to radstu...@googlegroups.com
こんにちは、梅澤@プロキャストです。

お探しのものは、カテゴリとしては「チャート」や「グラフ」というものになるのでは無いかと思います。

Delphiには、以前からTeeChartというVCLコンポのDelphi版が添付されていました。
10.3 Rioのオンラインマニュアルでは、FMXもTeeChart Liteというのが添付されているようです。
XE6ではどうかわかりませんが、一度、確認してみてはどうでしょうか?

製品版のTeeChartのページに、作成できるチャートのイメージがいくつか紹介されています。
「3D Cylinder Chart」がご希望のもののイメージに近いかと思ったのですが、どうでしょう。

https://www.steema.com/product/vcl

2020年5月22日(金) 15:07 yTake <t.yo...@r-tech-japan.com>:
> --
> このメールは Google グループのグループ「Japan RAD Studio User Group」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには radstudio-jp...@googlegroups.com にメールを送信してください。
> このディスカッションをウェブ上で閲覧するには https://groups.google.com/d/msgid/radstudio-jp/1b23a3a6-a1c0-47ea-89fe-78bd7ab6b27b%40googlegroups.com にアクセスしてください。

kyoichi Miyazaki

unread,
May 25, 2020, 3:19:31 AM5/25/20
to radstu...@googlegroups.com

私もいろいろと検討中です。一つの例を示します。

できましたら、ぜひ、そのプログラムを教えてください。

私のはデルファイ5で作ったもので、エクセルデータから

三次元図を作成するものです。

図は、ダウ30社の株価推移のものです。

コロナで崩れたところが、ばっちりでしょう。

宮崎恭一

このメールは Google グループのグループ「Japan RAD Studio User Group」の登録者に送られています。

このグループから退会し、グループからのメールの配信を停止するには radstudio-jp...@googlegroups.com にメールを送信してください。

このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msgid/radstudio-jp/CAAuxAt1UFv1M_tMEYKu0oLYz%3D-drxAHN4e4N%2BnxUkty1KLBnzg%40mail.gmail.com にアクセスしてください。


ウイルス フリー。 www.avast.com
image003.jpg

吉田

unread,
May 25, 2020, 6:24:31 AM5/25/20
to radstu...@googlegroups.com
梅沢様

ありがとうございます。


XE6にもTeeChart Liteは付いています。
グラフのプロットに使った事もあります。

ただ、Lite版の為、3D(3軸)グラフに対応していない様です。
3D表示もありますが、2軸グラフが立体視になるだけの様です。

また、TeeChart
LiteはAppearanceの”StyleBook”に対応していない様子で、StyleBookを変えてもTeeChart
Liteの見た目は
変わらない様です。


製品版やPro版では、3軸表示やStyleBookに対応しているのでしょうか?

TeeChartのサイトを当たってみたいと思います。
--

########################
〒175-0092 東京都
板橋区赤塚1-2-9
あおきビル二階
アールテック有限会社
技術部
吉田 毅
Phone:03-5967-7464
FAX:03-5967-7465

吉田

unread,
May 25, 2020, 6:50:53 AM5/25/20
to radstu...@googlegroups.com
宮崎様

ありがとうございます。

見事な3D表示です。(コロナ禍もひと段落でしょうか)
何かのコンポーネントですが、それともご自身で描画されたのでしょうか?

いまのところ、
FMXでTViewport 3Dへの3D描画、又は、VCLでTPaintBoxへワイヤー上の鳥観図的な描画を検討しています。
FMXでは中山様の動画(YouTube)が参考になります。
VCLでは鳥観図のアルゴリズムを用いる事を考えています。宮崎様の図と似た描画になる様に思っています。


いずれも、未だ未だ道は遠そうです。
このディスカッションをウェブ上で閲覧するには https://groups.google.com/d/msgid/radstudio-jp/000001d63264%24c0275590%24407600b0%24%40k08.itscom.net にアクセスしてください。
Message has been deleted

mam

unread,
May 25, 2020, 10:17:27 AM5/25/20
to Japan RAD Studio User Group
こんばんは。Mamと申します。外していたらすいません。
一度投稿したのですが、1か所ソースが間違えていたので、再投稿します。

Delphi起動⇒ファイル⇒新規作成⇒マルチデバイスアプリケーション
で、空のアプリケーション を選択

TButton、TViewPort3D、TColorMaterialSource、TLightMaterialSourceをフォームへドラッグ&ドロップします。
ViewPort3D1にTLightをドラッグ&ドロップし、Light1の方向を適当に左下へ向けます。
ViewPort3D1にTMeshをドラッグ&ドロップします。
Button1をダブルクリックして以下のソースコードを記述します。

メッシュの数 xp,zp と、頂点バッファのY座標をお望みの値にすれば、お望みに近いものが描画されるかもしれません。
(DelphiXE10.3.3CEで動かしましたが、滑らかにスムースシェーディングされてしまいます・・・。)


unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  System.Math.Vectors, FMX.Controls3D, FMX.Objects3D, FMX.Viewport3D,
  FMX.Controls.Presentation, FMX.StdCtrls, FMX.MaterialSources, FMX.Types3D;

type
  TForm1 = class(TForm)
    Viewport3D1: TViewport3D;
    Mesh1: TMesh;
    Button1: TButton;
    LightMaterialSource1: TLightMaterialSource;
    Light1: TLight;
    ColorMaterialSource1: TColorMaterialSource;
    procedure Button1Click(Sender: TObject);
  private
    { private 宣言 }
  public
    { public 宣言 }
    procedure DrawWire(Sender: TObject; Context: TContext3D);
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
var xp,zp:integer;
    x,z:integer;
    y:single;
    idx:integer;
    fnc:TRenderEvent;
begin
  xp:=20;//x方向のメッシュの数+1
  zp:=15;//z方向のメッシュの数+1

  Mesh1.MaterialSource:=LightMaterialSource1;
  //Mesh1.TwoSide:=true;

  Mesh1.Width:=4;
  Mesh1.Depth:=4;
  Mesh1.Height:=4;
  Mesh1.Position.X:=0;
  Mesh1.Position.Y:=0;
  Mesh1.Position.Z:=0;

  Mesh1.Data.VertexBuffer.Length := xp*zp;
  Mesh1.Data.IndexBuffer.Length := (xp-1)*(zp-1)*3*2;

  //頂点バッファの作成
  for x := 0 to xp-1 do
  begin
    for z := 0 to zp-1 do
    begin
      //今回はy座標(高さ)を適当にCos*Sinにする
      y:=Cos(x/xp*pi()*4)*Sin(z/zp*pi()*4);
      //頂点バッファに値を設定
      Mesh1.Data.VertexBuffer.Vertices[x+z*xp]:=
        Point3D(x-xp/2,y,z-zp/2);
    end;
  end;

  //メッシュの作成
  idx:=0;
  for x := 0 to xp-2 do
  begin
    for z := 0 to zp-2 do
    begin
      //3角形ポリゴン作成 左回り
      Mesh1.Data.IndexBuffer.Indices[idx]:=x+0+(z+0)*xp;
      inc(idx);
      Mesh1.Data.IndexBuffer.Indices[idx]:=x+0+(z+1)*xp;
      inc(idx);
      Mesh1.Data.IndexBuffer.Indices[idx]:=x+1+(z+0)*xp;
      inc(idx);
      //3角形ポリゴン作成 左回り
      Mesh1.Data.IndexBuffer.Indices[idx]:=x+1+(z+0)*xp;
      inc(idx);
      Mesh1.Data.IndexBuffer.Indices[idx]:=x+0+(z+1)*xp;
      inc(idx);
      Mesh1.Data.IndexBuffer.Indices[idx]:=x+1+(z+1)*xp;
      inc(idx);
    end;
  end;

  //法線ベクトルの自動計算
  Mesh1.Data.CalcFaceNormals();
  //ワイヤーの描画
  Mesh1.OnRender:=DrawWire;
end;

procedure TForm1.DrawWire(Sender: TObject; Context: TContext3D);
begin
  Context.DrawLines(
    TMesh(Sender).Data.VertexBuffer,
    TMesh(Sender).Data.IndexBuffer,
    ColorMaterialSource1.Material,
    1
  );
end;

end.


2020年5月22日金曜日 15時07分37秒 UTC+9 yTake:

吉田

unread,
May 26, 2020, 7:58:27 AM5/26/20
to radstu...@googlegroups.com
Mam様
ありがとうございます。

早速、試してみました。

直ぐにメッシュが描画されました。
実際のデータを読み込んで表示させてみました。これもあっさり描画されました。
チョット驚きです。

描画範囲など、確認すべき点は未だありますが、描画自体は出来ました。
--
このメールは Google グループのグループ「Japan RAD Studio User Group」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには radstudio-jp...@googlegroups.com にメールを送信してください。
このディスカッションをウェブ上で閲覧するには https://groups.google.com/d/msgid/radstudio-jp/15e3fd76-2ac0-4f2c-a9e1-12526673d28a%40googlegroups.com にアクセスしてください。
Reply all
Reply to author
Forward
0 new messages