【Delphi奥法 - 第十章】进入Firemonkey3D
delphi吧
全部回复
仅看楼主
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
level 11
天道玄虚 楼主
百度云的服务器好像抽了,文件传不上,下次再说吧。[滑稽]
2017年12月27日 16点12分 2
吧务
level 14
[真棒][真棒][真棒]
2017年12月27日 16点12分 3
level 11
天道玄虚 楼主
2017年12月28日 03点12分 4
level 12
不错不错,支持![真棒][真棒][真棒]
不过在WIN上的话,我还是喜欢直接用D3D[吐舌]
2018年01月03日 03点01分 5
firemonkey的绘图更方便一点,尤其是镜头系统是真的强大
2018年01月03日 03点01分
level 1
不错不错,支持!
2021年03月17日 15点03分 6
1