CG仿真及3D特效编程教程(一)| CG Simulation总览及基础数学概念回顾
前言
“What will matter is what you learned and how you used it.”这是本系列教程前,我们想对大家说的,希望本次系列教程能够对喜欢图形学的虹图AI开放平台的开发者有所帮助。当然同时也为了推广我们虹图继美颜SDK特效后推出的3D Avatar SDK。
最近上映的大型中国古代神话电影封神第一部,不禁感叹这几年CG的飞速发展,让观众在享受观感的同时已经很难区分特效和现实了。大型游戏也早已从2D转为3D,并且伴随酷炫的特效,就连音视频中的特效也不再满足于美颜、贴纸,而是向元宇宙靠拢的3D化特效。而本系列教程,就围绕仿真(Simulation)和3D特效编程(3D Programming)。
这个过程中涉及到的大多是很枯燥的理论和公式,需要有好的代数、几何、少量微积分基础。本系列预计会分为3-4篇幅,会整体讲述3D坐标变换、牛顿法求非线性方程根、逆向运动学、功能性动效、碰撞、脉冲动量、反弹、3D粒子系统等。另外,这并不是一个图形学编程的教程,但是其中会有一些图形学代码框架用来才是我们的代码,如果是寻找图形学编程系列教程,可以关注我们另一系列关于OpenGL和Vulkan的教程。
那现在我们就从最基础分析3D世界的参数方程开始吧。
参数方程
直线方程相信大家都很熟悉,y = ax + b,但是这个表达方式并不适用于图形学和仿真3D编程。首先这个只能代表无穷直线,而不是一条有限长度的线段,其次这是2D的表达,而不是3D。这里会有人说,那么z = ax + by + c不就是3D的吗?这个是平面方程也不是空间直线方程,可以去额外了解下,这里不做赘述。
空间直线的参数方程,如下图所示,P0(X0,Y0,Z0),P1(X1,Y1,Z1),那么参数方程这样表达:

当然,也可以换一种表达,都是同一个意思:

线性融合Liner Blending
在计算机图形学相关的应用里,线性融合是个常用的方式,比如在图像、颜色、形状、位置、旋转角度等方面。我们基于以下公式进行线性融合计算:

还可以使用双线性融合,其核心思想就是从两个方向分别进行一次线性融合,例如在四边形内做双线性融合:

先线性融合Q00和Q10形成的线段A,再融合Q01和Q11形成的线段B,然后进行线段A和线段B的二次线性融合,得出以下:

当然,还可以进行三线性融合,例如在立方体里进行:

向量
这个部分应该大家还是比较熟悉的,但是还是不厌其烦再介绍一下吧。首先向量是有方向和大小的,它可以形象化成带箭头的线段,箭头就是方向,长度就是大小。

方向就是箭头所示,大小就是:

另外还有单位向量,模等于1的向量,也就是一个非零向量除以它的模,可得所需单位向量。
下面再引入两个能勾起大家回忆的概念,向量积和向量的积,或者换个说法,向量点乘和向量叉乘,类似不同的叫法还有很多。

这是向量点乘,也叫标量积Scalar Product。这个经常用于计算A向量在B方向的值大小,因为它是向量a在向量b方向上的投影与向量b的模的乘积。

这是向量叉乘,也叫适量积Vector Product。叉乘后的方向遵守右手定则:

也正是由于遵循右手定律,叉乘所以不具备交换律:

叉乘在计算机图形学中应用就比较广泛了,比如计算垂直于某一平面的向量,也就是法线向量:

而这通常在CG光照中经常被使用。
OpenGL Mathematics(GLM)
最后再介绍下后续我们会用到的GLM。GLM是OpenGL中在进行图形变换的时候需要使用几何数学库,但它其实不是真实的库的形式,而是.hpp头文件参与源码编译的,可以在这个链接下载:https://github.com/g-truc/glm。
我们可以这样引入GLM:
当然也可以只引入你需要的头文件,下面是如何使用GLM的一些例子:
关于GLM配置方面问题,网上也有不少参考资料,当然也基于具体是win系统还是Linux系统,有问题也可以私信联系。
本期教程属于预热一些基础知识,把必要的概念和GLM先介绍给大家,后续会进一步深入,一起探索仿真和3D编程相关内容。欢迎大家关注虹图AI开放平台公众号获取更多内容,也请大家多多关注我们新发布的美颜SDK产品和3D Avatar SDK产品。
敬请期待~