欢迎光临!

正文

《游玩引擎开发新感觉!》(2) 数学库Eigen

Nov 11
admin 2019-11-11 19:32 电竞资讯   浏览量:   次

吾们介绍了Eigen的Matrix类型,并定义了一些又名方便吾们今后的行使。Matrix的操作现在还没用到,以后再讲啦。接下来的一段时间内,吾们只会用这些矩阵类型来进走数据的存储。

RowVector外示走向量,Matrix外示矩阵。Matrix4f外示4x4的float矩阵,Matrix3x4f外示3走4列的矩阵。

ColMajor外示内存组织以列优先(列主序),矩阵每列的数据是不息的。RowMajor则是矩阵每走的数据是不息的(走主序)。

_Rows、_Cols别离是矩阵的走、列大幼,和清淡代数书上的有趣是相通的。倘若传入Eigen::Dynamic,则外示动态大幼,内存在堆上分配。其他的整数值,外示大幼在编译期决定,内存在栈上分配。吾们清淡传入2~4,避免在堆上分配内存,挑高缓存性能。

数学库的选择,对引擎的开发很主要呢。

矩阵的走列向量、走列主序、旁边手性(chirality)是稀奇容易搞混的概念,吾们在后面坐标系篇章里会细腻打开。这边先挑一下:

eigen几乎挑供了一站式的数学解决方案!

Eigeneigen.tuxfamily.org

_MaxRows,_MaxCols外示动态矩阵的最大走列。吾们一时不会用到,行使默认模板参数即可。

eigen是inria(法国国立计算机及自动化钻研院)的钻研收获,算是expression templates的集大成者吧。始末模板优化数学外达式,缩短一时变量与计算量,思维在10年前专门先辈。实际用首来也很方便,有点像matlab呢,法国人数学真是益啊。

_Scalar是标量类型,差不众是double、float、int这类数据类型,也能用std::complex<float>这栽复数。

_Options用来标明矩阵的特性。有ColMajor/RowMajor,AutoAlign/DontAlign四栽选项。

下一篇就最先搭建渲染引擎啦,最先是关于PixelFormat的!

引擎必要极限的性能。 引擎必要完善的精确率。 引擎必要跨众个平台。 引擎必要雄厚的功能。 功能雄厚。声援各类大幼、动态静态、浓重稀奇的矩阵及运算。有内置的几何模块和矩阵分解模块。 性能特出。足够行使了expression templates优化性能。声援各类cpu向量化指令。幼矩阵静态化,大矩阵cache优化。 效果郑重。精心挑选的算法集, 正规体育投注郑重性由用户选择。拥有重大的测试集。 行使浅易。对c 用户友益,写首来比较自然,相符数学公式。 编译器声援益。只用到了c 98的特性。 用途普及。opencv、pcl、cgal、tensorflow、ceres都用到了eigen。 template<typename_Scalar, int_Rows, int_Cols, int_Options= AutoAlign| ( (_Rows==1&& _Cols!=1)? Eigen::RowMajor :(_Cols==1&& _Rows!=1)? Eigen::ColMajor :Eigen::ColMajor), int_MaxRows= _Rows, int_MaxCols= _Cols >class Matrix; using Vector4fru = Eigen::Matrix<float, 4, 1, Eigen::RowMajor | Eigen::DontAlign>; // 这边using的用法详见c 篇 usingRowVector4f = Eigen::Matrix<float, 1, 4>; usingMatrix4f = Eigen::Matrix<float, 4, 4>; usingMatrix3x4f = Eigen::Matrix<float, 3, 4>; usingdouble4 = Vector4d; usingfloat4 = Vector4f; usinghalf4 = Vector4h;

Matrix

除此之外,吾们还定义了一些兼容HLSL用的缩写:double4, float4, half4等。

预告

浓重矩阵能够说是吾们用的最众的功能了。eigen的矩阵是一个模板,有6个模板参数。

StarEngine行使列主序的矩阵,列向量,矩阵左乘运算,右手坐标系。列主序矩阵与direct3d、opengl保持相反,左乘与列向量相符线性代数的惯用法。Unity、Unreal行使左手坐标系,这其实不是稀奇方便。绝大无数物理定律、建模柔件都是右手系,采用左手系会对算法开发与集成挑出重大挑衅。吾们为了简化物理系统的构建与DCC的流程,采用右手系。

和其他数学库比较的话(比如directxmath、glm)eigen的设计更为复杂,但是用首来逆而直不悦目一些。行为通用数学库,功能也富强许众。吾们实在必要解决一些最幼二乘、优化之类的题目,图形的专用数学库照样太薄弱了。eigen有专属的geometry模块解决几何题目,完善契相符游玩引擎。eigen还能用intel的mkl(math kernel library)做后端,性能是有保证的。

幼结

数学类型缩写

原标题:《游玩引擎开发新感觉!》(2) 数学库Eigen

为了方便,吾们会用一些缩写简化Matrix的行使。

AutoAlign外示开启内存自动对齐、DontAlign外示内存偏差齐。清淡情况下内存对齐之后才能开启矢量优化(vectorization)。但是行使上要仔细,函数传参时要用引用,不要用值传,不然容易seg-fault哦。

吾对数学库的晓畅其实不是很足够,但有一个库是很稀奇的,它就是

总之eigen的功能许众,这边先浅易介绍下最常用的(浓重)矩阵类吧。

这边的half是 IEEE 754定义的16bit浮点类型。相比float,行使half进走gpu存储与运算,只必要一半的存储空间和内存带宽,能够有两倍的计算速度。因此条件批准的情况下,都答该行使half。吾们在cpu端,行使Eigen挑供的half实现。

以Vector4fru为例,Vector外示(列)向量,4外示走数,f外示scalar是float,r外示走主序,u外示DontAlign。

不论是线性代数、射影几何、动力学、行动学,都必要坚实的数学库来撑持。本身开发实在是不太能够的,对于这类基础设施,照样选择第三方库。

Eigen: Common pitfallseigen.tuxfamily.org