こんばんは。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: