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:

#define GLM_FORCE_RADIANS
#include<glm/glm.hpp>
#include<glm/gtc/matrix_transform.hpp>

当然也可以只引入你需要的头文件,下面是如何使用GLM的一些例子:

// 构造:
glm::mat4( 1. );       // identity matrix 
glm::vec4( ); 
glm::vec3( );

// 乘积
glm::mat4 * glm::mat4 
glm::mat4 * glm::vec4 
glm::mat4 * glm::vec4( glm::vec3, 1. )     // promote vec3 to a vec4 via a constructor

// OpenGL移动变换相关: 
glm::mat4 glm::rotate( glm::mat4 const & m, float angle, glm::vec3 const & axis );
glm::mat4 glm::scale( glm::mat4 const & m, glm::vec3 const & factors ); 
glm::mat4 glm::translate( glm::mat4 const & m, glm::vec3 const & translation );

//透视方式:
glm::mat4 glm::ortho( float left, float right, float bottom, float top, float near, float far ); glm::mat4 glm::ortho( float left, float right, float bottom, float top ); 
glm::mat4 glm::frustum( float left, float right, float bottom, float top, float near, float far );
glm::mat4 glm::perspective( float fovy, float aspect, float near, float far); 

//视角:
glm::mat4 glm::lookAt( glm::vec3 const & eye, glm::vec3 const & look, glm::vec3 const & up );

// 加载矩阵到OpenGL: 
glLoadMatrix( glm::value_ptr( glm::mat4 ) ); 
glUniformMatrix4fv( Location, 1, GL_FALSE, glm::value_ptr( glm::mat4 ) );

关于GLM配置方面问题,网上也有不少参考资料,当然也基于具体是win系统还是Linux系统,有问题也可以私信联系。

本期教程属于预热一些基础知识,把必要的概念和GLM先介绍给大家,后续会进一步深入,一起探索仿真和3D编程相关内容。欢迎大家关注虹图AI开放平台公众号获取更多内容,也请大家多多关注我们新发布的美颜SDK产品和3D Avatar SDK产品。

敬请期待~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虹图AI开放平台

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值