TViewport3D上に球の完全弾性反射を3D表示する(FMX) ~Delphiソースコード集
Delphiを起動して新規作成を行い、必要なコンポーネントをドラッグ&ドロップする
Delphi起動⇒ファイル⇒新規作成⇒マルチデバイスアプリケーションを選択し、「空のアプリケーション」を選択してOKボタンをクリックします。TTimer×1、TLightMaterialSource×2、TViewPort3D×1をフォームへドラッグ&ドロップします。
ViewPort3D1にTCamera×1、TDisc×1、TLight×1、TPlane×1、TSphere×1をドラッグ&ドロップします。
ソースコードを記述する
Form1のonCreateイベント、Timer1のTimerイベント等に以下ソースコードを記述します。
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Types3D,
System.Math.Vectors, FMX.Controls3D, FMX.MaterialSources, FMX.Viewport3D,
FMX.Objects3D;
type
TForm1 = class(TForm)
Viewport3D1: TViewport3D;
LightMaterialSource1: TLightMaterialSource;
Light1: TLight;
Camera1: TCamera;
Sphere1: TSphere;
Timer1: TTimer;
Plane1: TPlane;
Disk1: TDisk;
LightMaterialSource2: TLightMaterialSource;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ private 宣言 }
public
{ public 宣言 }
p:TPointF;
acc:TPointF;
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.FormCreate(Sender: TObject);
begin
p.X:=0;
p.Y:=-14;
acc.X:=0.20;
acc.Y:=0.00;
Sphere1.Width:=2;
Sphere1.Height:=2;
Sphere1.Depth:=2;
Sphere1.Position.X:=p.X;
Sphere1.Position.Y:=p.Y;
Sphere1.Position.Z:=0;
LightMaterialSource2.Diffuse:=TAlphaColor($FFAAAAAA);
disk1.Width:=2;
disk1.Height:=2;
disk1.Position.X:=p.X;
disk1.Position.Y:=-0.001;
disk1.Position.Z:=0;
disk1.MaterialSource:=LightMaterialSource2;
Plane1.Position.X:=0;
Plane1.Position.Y:=0;
Plane1.Position.Z:=0;
Plane1.Width:=20;
Plane1.Height:=20;
Plane1.RotationAngle.X:=90;
//ライトの設定
Light1.Position.X:=10;
Light1.Position.Y:=-10;
Light1.Position.Z:=-10;
Light1.RotationAngle.X:=-45;//下45度
Light1.RotationAngle.Y:=-30;//左30度
Light1.RotationAngle.Z:=0;
//カメラの設定
Viewport3D1.UsingDesignCamera:=False;
Viewport3D1.Camera:=Camera1;
Camera1.Position.X:=0;
Camera1.Position.Y:=-15;
Camera1.Position.Z:=-24;
Camera1.RotationAngle.X:=-20;
//カメラを球に追従させる場合
Camera1.Target:=Sphere1;
Timer1.Interval:=30;
Timer1.Enabled:=True;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if ((p.X+acc.X)>8) or ((p.X+acc.X)<-8) then
acc.X:=-acc.X
else
p.X:=p.X+acc.X;
acc.Y:=acc.Y+0.02;
if ((p.Y+acc.Y)>(-Sphere1.Height/2)) then
acc.Y:=-acc.Y
else
p.Y:=p.Y+acc.Y;
Sphere1.Position.X:=p.X;
Sphere1.Position.Y:=p.Y;
disk1.Position.X:=p.X;
end;
end.
実行する
実行ボタンを押して実行します。(デバッグ実行でもOKです。)実行中画面
