Delphi 的 FireMonkey 框架,支持3D编程。为了跨平台,Delphi 在这个框架上,自己做了一层虚拟的 3D 框架,和 OpenGL 一样有 Shader 等等概念,因此代码和写 OpenGL 的代码类似。只是 OpenGL 的 API 是基于 C 的,里面很多的数据类型,对应到 FireMonkey 上面,有相同的名称和相似的用法,但都是对象了。
如果只是简单地拖几个 3D 控件到界面上,也能做3D编程,但能实现的效果有限。所以,真想做3D编程,还得自己写代码。也就是所谓的一些顶点坐标,材质,灯光等等概念,和 OpenGL 的概念是相似的。
可惜的是,网上能找到的关于用 FireMonkey 来做3D编程的文章资料太少。Delphi 自带的一个DEMO程序是 Lowlevel3D,去它的安装后放例子程序的文件夹底下去找。
这里,我实验了一下如何自己写代码在 FireMonkey 的 3D 界面上画图。
1. 新建一个 FireMonkey 的工程,选择3D工程。这样可以创建一个工程,其主 Form 是从 TForm3D 继承下来的。
2. 在 Form 的 OnRender 事件里面写代码。
3. 拖一个 Timer 过来,其事件里面写:Invalidate;有这句话,才会触发程序画屏,也才会触发 OnRender 事件。
4. OnRender 事件提供当前窗口界面的 Context,这个非常重要。画图就靠它了。它提供了一些画图的方法。
5. Context 有一个 Helper class,这里我做一个简单的测试,就不去创建顶点什么的,直接用这个 Helper 的方法,画一个蓝色的矩形到屏幕上。
代码如下:
这里,TPoint3D 是声明在 System.Math.Vectors 单元里面的,因此需要 uses 这个单元。
上述代码,测试通过。
如果只是简单地拖几个 3D 控件到界面上,也能做3D编程,但能实现的效果有限。所以,真想做3D编程,还得自己写代码。也就是所谓的一些顶点坐标,材质,灯光等等概念,和 OpenGL 的概念是相似的。
可惜的是,网上能找到的关于用 FireMonkey 来做3D编程的文章资料太少。Delphi 自带的一个DEMO程序是 Lowlevel3D,去它的安装后放例子程序的文件夹底下去找。
这里,我实验了一下如何自己写代码在 FireMonkey 的 3D 界面上画图。
1. 新建一个 FireMonkey 的工程,选择3D工程。这样可以创建一个工程,其主 Form 是从 TForm3D 继承下来的。
2. 在 Form 的 OnRender 事件里面写代码。
3. 拖一个 Timer 过来,其事件里面写:Invalidate;有这句话,才会触发程序画屏,也才会触发 OnRender 事件。
4. OnRender 事件提供当前窗口界面的 Context,这个非常重要。画图就靠它了。它提供了一些画图的方法。
5. Context 有一个 Helper class,这里我做一个简单的测试,就不去创建顶点什么的,直接用这个 Helper 的方法,画一个蓝色的矩形到屏幕上。
代码如下:
procedure TForm3.Form3DRender(Sender: TObject; Context: TContext3D);
var
Center, Size: TPoint3D;
AOpacity: Single;
AColor: TAlphaColor;
begin
//在3D模式下,利用 Context 自己画图。这里是 FireMonkey 自己实现的一层抽象层代码,最终会根据平台,调用 OpenGL 或 D3D
Center := TPoint3d.Create(0, 0, 0);
Size := TPoint3d.Create(-1, 1, 0);
AOpacity := 1;
AColor := TAlphaColorRec.Blue;
Context.FillCube(Center, Size, AOpacity, AColor);
end;
procedure TForm3.Timer1Timer(Sender: TObject);
begin
Invalidate;
end;
这里,TPoint3D 是声明在 System.Math.Vectors 单元里面的,因此需要 uses 这个单元。
上述代码,测试通过。