level 11
天道玄虚
楼主
Firemonkey的3D做的很好,这是我在玩了一会这个3D之后得出的结论。总体来说,对GPU的负担不算太大,绘图基本应用DirectX,效果挺好的,如果使用高清的模型、素材和贴图甚至可以和祖传优化的某信条相比(当然,我们没有那么多好的模型素材和贴图,所以还是不能比)。
那么,如何开始一个3D的Firemonkey呢?
首先我们需要先建立一个支持3D的窗口。

建立一个Multi-Device Application,选择3D Application。
建好之后,我们得到一个空白的3D窗口,先让我们来简单地了解一下这个空间。
所谓的3D,就是空间。很显然,空间和平面是完全不同的东西,空间中一共有六个自由度,而平面里面只有三个。这就意味着,空间的绘图和定位比平面里面要难得多。
不过幸好,我们暂时不需要考虑这么复杂的问题。让我们先从简单的开始。
10.0、坐标系
我们先了解一下这个诡异的坐标系吧。
之所以说诡异,是因为这个坐标系只有在右手系这一方面让我感到一丝欣慰,而这个坐标系分布的位置则让我有些郁闷了。

如图所示,指向屏幕内的是z轴正方向,向下为y轴正方向,向右为x轴正方向。这方向到底是谁设计的,我觉得他的设计有问题。(其实我认为应该是为了延续2D空间中,水平为X轴,竖直为Y轴的习惯,并且延续了右方和下方为正方向的习惯,并没有任何的问题。)
有了坐标轴之后,理所应当的要有定位和尺寸。
10.1、定位和尺寸
与2D的定位不同,在这个3D空间里面的坐标原点不再位于左上角,而是位于正中,至于距离的量度,实测表明,1就已经很长了,所以不要再动辄几百上千,这里的单位不再是像素,而是一个另外的单位。位置依旧在Position属性中,Position下就是X、Y、Z,非常直接。
3D控件的尺寸当然有三个,分别是宽度(Width)、高度(Height)、深度(Depth),分别对应于X、Y、Z方向上的尺寸亮度。单位和位置的单位一样,所以1就已经很大了。
10.2、坑人的转角
刚才已经提到,3D空间有6个自由度,分别是三个平动自由度,和三个转动自由度。位置属于平动自由度,除此之外还有角度。
说实话,这里的转动自由度是我见过最不符合数学习惯的设定。何出此言呢?
因为当你看见两个控件的转角等值的时候,并不能够判定他们的转动方向是一致的。这一点是血淋淋的教训,请务必记牢,如果要依照这个标准判定,之后会提到一定要按照一个特定的标准进行转动才行。
我之后会给一个推荐的转动标准,先不要急,跟着我慢慢来。
转动储存在RotationAngle属性下,但是在实际的内存中并不在这里,若非如此,不可能同样的RotationAngle属性可以对应于不同的转动情况了。一样是X、Y、Z三个看起来很直接的坐标,分别代表绕某轴的转角。单位是角度(0-360°),不是弧度。
注意,玄机就在这里。
这三个值初始为0,控件位于初位置。
然后,当其中某个值改变的时候,控件将会绕那个坐标轴旋转改变量的值,而且这个轴并非坐标轴,而是控件上的基准轴。问题的关键在于,当控件转动的时候,上面的基准轴也会随之转动。这也就意味着,当你转动后,另外两个基准轴的位置已经改变了。
这样的直接后果就是,按照不同的顺序分别改变转角的值,旋转的情况是不一样的。为了配合后续会常用到的镜头,我们需要做这样的约定:X——俯仰角;Y——朝向角;Z——滚转角。
为了便于控制,在后续加入了镜头之后,我们通常不会改变镜头的滚转角,而只改变朝向角和俯仰角。就像常见的3D游戏的镜头系统一样(如一般的FPS游戏和RPG游戏一样,没有哪个游戏会改变镜头的滚转角,除非为了表示角色阵亡)。
所以我们先定下如下标准:当我们需要改变任何控件或者镜头的转角时,只有在俯仰角和滚转角为0时可以改变朝向角;只有在滚转角为0时可以改变俯仰角。
换句话说,我们需要先记录下不需要改变的值,按照标准将需要置零的转角设置为0之后才可以改变相应的角度。
等你熟悉了这个控件之后,当然可以用自己习惯的方法,不过我建议你一定要在经过了数学计算之后再做改变。
10.3、让我们开始领略一下这个空间
首先搜索TPlane或者在3D shapes下找到TPlane。

单击一下,然后在窗口上单击一下。注意不要随便拖,因为这样不好使。
然后你会在窗口中看到一个这样的形状。

好吧,我承认我没有见过更难看的东西了。你看见有几个蓝色的东西,然后一定会尝试性地区拖拽一下,然后你发现它或多或少改变了一下。嗯,很好玩,对吗?
先停一下,我们先调一调尺寸什么的。
把宽和高调成5,深度让它0.001别动。
现在你可以试一试我刚才说的关于转角的问题了,比如说先把X调成45,然后把Y调成45,再把X调成0。记下当前的形状。

然后我们把三个转角置零,直接把Y调成45。

明白我的意思了吧?所以一定要按照约定的标准调整转角,要不然你都不会知道你自己的控件转成了什么样子。
这里有一个好处,那就是全部置零的话,控件一定会回到初始位置,不管它转成什么样子了。一定要善于利用这一点来为混乱的旋转定位。
10.4、3D模型的显像机制
和2D图形直接显示一个颜色或者图片不同,3D模型的显像机制比较复杂。3D模型显像的源称之为材质、贴图。材质和贴图本质上是一个东西,不过稍有不同。贴图当作为材质来理解的时候,专指贴图材质,而材质则包括更多的类别。
如果希望你建立的平面或者别的什么(我相信你一定也建立了别的3D模型,别告诉我没有)不再只是红彤彤的一大片,那么你需要材质,你需要为它们选一个材质。
所幸Firemonkey提供了一个很出色的材质系统,我们不需要掏出PS自己画。
直接搜索material,你会看到这三个控件:

分别称作纯色材质、贴图材质、打光材质。
很好理解,所谓纯色材质就是和这个红彤彤的一大片类似,可以是绿油油的一大片,或者黄澄澄的一大片。贴图材质就是从外部导入一个图片作为材质,一般需要专门制作的图片才行。打光材质是最适于渲染的材质,也就是一般所说的光影材质。如果你希望知道高大上的打光材质可以到什么效果,那么请自行百度“我的世界光影”“上古卷轴ENB”,如果你不想百度,但是希望看一眼,那行,我这里刚好有一张:

这是上古卷轴在GTX1060的渲染下的ENB效果,就是在我自己电脑上截的图。
Firemonkey里的打光材质虽然不能让你实现这样神奇的效果,但是也已经足够强大,比如说这样的还是可以的:

这个效果其实也挺好的不是吗?图里面的是两个方块(TCube)一个圆锥(TCone)还有一个平面(TPlane)。
让我们来仔细看看打光材质。
10.5、打光材质

按照我的理解,Emissive是底色,Ambient是阴影颜色,Diffuse是漫反射颜色,Specular是镜面反射颜色,Shininess大概是亮度吧。
从Texture这个选项来看,这个材质其实也支持贴图。
这里要注意的是,用于材质的贴图需要特别制作,一般3DMAX可以实现这个功能,具体的请找专业人士。
比如我直接导入滑稽的图像到一个新的打光材质里面,是这个效果:

可以看得出,整个图像按照一种独特的方式扭曲了。贴图材质的制作就涉及到我的知识盲区了,所以我并没有办法说。
当了解了这些之后,我相信3D Firemonkey至少已经不是一个碰都不敢碰的东西了,至于更细节的操作,将会在后续的部分继续介绍。
附件的程序里有一个简单的镜头系统,鼠标左键可以拖动镜头,单击模型可以改变镜头目标。具体的实现将会在之后的部分讲解。
2017年12月27日 16点12分
1
那么,如何开始一个3D的Firemonkey呢?
首先我们需要先建立一个支持3D的窗口。

建立一个Multi-Device Application,选择3D Application。建好之后,我们得到一个空白的3D窗口,先让我们来简单地了解一下这个空间。
所谓的3D,就是空间。很显然,空间和平面是完全不同的东西,空间中一共有六个自由度,而平面里面只有三个。这就意味着,空间的绘图和定位比平面里面要难得多。
不过幸好,我们暂时不需要考虑这么复杂的问题。让我们先从简单的开始。
10.0、坐标系
我们先了解一下这个诡异的坐标系吧。
之所以说诡异,是因为这个坐标系只有在右手系这一方面让我感到一丝欣慰,而这个坐标系分布的位置则让我有些郁闷了。

如图所示,指向屏幕内的是z轴正方向,向下为y轴正方向,向右为x轴正方向。这方向到底是谁设计的,我觉得他的设计有问题。(其实我认为应该是为了延续2D空间中,水平为X轴,竖直为Y轴的习惯,并且延续了右方和下方为正方向的习惯,并没有任何的问题。)有了坐标轴之后,理所应当的要有定位和尺寸。
10.1、定位和尺寸
与2D的定位不同,在这个3D空间里面的坐标原点不再位于左上角,而是位于正中,至于距离的量度,实测表明,1就已经很长了,所以不要再动辄几百上千,这里的单位不再是像素,而是一个另外的单位。位置依旧在Position属性中,Position下就是X、Y、Z,非常直接。
3D控件的尺寸当然有三个,分别是宽度(Width)、高度(Height)、深度(Depth),分别对应于X、Y、Z方向上的尺寸亮度。单位和位置的单位一样,所以1就已经很大了。
10.2、坑人的转角
刚才已经提到,3D空间有6个自由度,分别是三个平动自由度,和三个转动自由度。位置属于平动自由度,除此之外还有角度。
说实话,这里的转动自由度是我见过最不符合数学习惯的设定。何出此言呢?
因为当你看见两个控件的转角等值的时候,并不能够判定他们的转动方向是一致的。这一点是血淋淋的教训,请务必记牢,如果要依照这个标准判定,之后会提到一定要按照一个特定的标准进行转动才行。
我之后会给一个推荐的转动标准,先不要急,跟着我慢慢来。
转动储存在RotationAngle属性下,但是在实际的内存中并不在这里,若非如此,不可能同样的RotationAngle属性可以对应于不同的转动情况了。一样是X、Y、Z三个看起来很直接的坐标,分别代表绕某轴的转角。单位是角度(0-360°),不是弧度。
注意,玄机就在这里。
这三个值初始为0,控件位于初位置。
然后,当其中某个值改变的时候,控件将会绕那个坐标轴旋转改变量的值,而且这个轴并非坐标轴,而是控件上的基准轴。问题的关键在于,当控件转动的时候,上面的基准轴也会随之转动。这也就意味着,当你转动后,另外两个基准轴的位置已经改变了。
这样的直接后果就是,按照不同的顺序分别改变转角的值,旋转的情况是不一样的。为了配合后续会常用到的镜头,我们需要做这样的约定:X——俯仰角;Y——朝向角;Z——滚转角。
为了便于控制,在后续加入了镜头之后,我们通常不会改变镜头的滚转角,而只改变朝向角和俯仰角。就像常见的3D游戏的镜头系统一样(如一般的FPS游戏和RPG游戏一样,没有哪个游戏会改变镜头的滚转角,除非为了表示角色阵亡)。
所以我们先定下如下标准:当我们需要改变任何控件或者镜头的转角时,只有在俯仰角和滚转角为0时可以改变朝向角;只有在滚转角为0时可以改变俯仰角。
换句话说,我们需要先记录下不需要改变的值,按照标准将需要置零的转角设置为0之后才可以改变相应的角度。
等你熟悉了这个控件之后,当然可以用自己习惯的方法,不过我建议你一定要在经过了数学计算之后再做改变。
10.3、让我们开始领略一下这个空间
首先搜索TPlane或者在3D shapes下找到TPlane。

单击一下,然后在窗口上单击一下。注意不要随便拖,因为这样不好使。然后你会在窗口中看到一个这样的形状。

好吧,我承认我没有见过更难看的东西了。你看见有几个蓝色的东西,然后一定会尝试性地区拖拽一下,然后你发现它或多或少改变了一下。嗯,很好玩,对吗?先停一下,我们先调一调尺寸什么的。
把宽和高调成5,深度让它0.001别动。
现在你可以试一试我刚才说的关于转角的问题了,比如说先把X调成45,然后把Y调成45,再把X调成0。记下当前的形状。

然后我们把三个转角置零,直接把Y调成45。
明白我的意思了吧?所以一定要按照约定的标准调整转角,要不然你都不会知道你自己的控件转成了什么样子。这里有一个好处,那就是全部置零的话,控件一定会回到初始位置,不管它转成什么样子了。一定要善于利用这一点来为混乱的旋转定位。
10.4、3D模型的显像机制
和2D图形直接显示一个颜色或者图片不同,3D模型的显像机制比较复杂。3D模型显像的源称之为材质、贴图。材质和贴图本质上是一个东西,不过稍有不同。贴图当作为材质来理解的时候,专指贴图材质,而材质则包括更多的类别。
如果希望你建立的平面或者别的什么(我相信你一定也建立了别的3D模型,别告诉我没有)不再只是红彤彤的一大片,那么你需要材质,你需要为它们选一个材质。
所幸Firemonkey提供了一个很出色的材质系统,我们不需要掏出PS自己画。
直接搜索material,你会看到这三个控件:

分别称作纯色材质、贴图材质、打光材质。很好理解,所谓纯色材质就是和这个红彤彤的一大片类似,可以是绿油油的一大片,或者黄澄澄的一大片。贴图材质就是从外部导入一个图片作为材质,一般需要专门制作的图片才行。打光材质是最适于渲染的材质,也就是一般所说的光影材质。如果你希望知道高大上的打光材质可以到什么效果,那么请自行百度“我的世界光影”“上古卷轴ENB”,如果你不想百度,但是希望看一眼,那行,我这里刚好有一张:

这是上古卷轴在GTX1060的渲染下的ENB效果,就是在我自己电脑上截的图。Firemonkey里的打光材质虽然不能让你实现这样神奇的效果,但是也已经足够强大,比如说这样的还是可以的:

这个效果其实也挺好的不是吗?图里面的是两个方块(TCube)一个圆锥(TCone)还有一个平面(TPlane)。让我们来仔细看看打光材质。
10.5、打光材质

按照我的理解,Emissive是底色,Ambient是阴影颜色,Diffuse是漫反射颜色,Specular是镜面反射颜色,Shininess大概是亮度吧。从Texture这个选项来看,这个材质其实也支持贴图。
这里要注意的是,用于材质的贴图需要特别制作,一般3DMAX可以实现这个功能,具体的请找专业人士。
比如我直接导入滑稽的图像到一个新的打光材质里面,是这个效果:

可以看得出,整个图像按照一种独特的方式扭曲了。贴图材质的制作就涉及到我的知识盲区了,所以我并没有办法说。当了解了这些之后,我相信3D Firemonkey至少已经不是一个碰都不敢碰的东西了,至于更细节的操作,将会在后续的部分继续介绍。
附件的程序里有一个简单的镜头系统,鼠标左键可以拖动镜头,单击模型可以改变镜头目标。具体的实现将会在之后的部分讲解。