C++ 在第二个构造函数Matrix3D中切换索引。例如,为什么n[0][1]=n10?

C++ 在第二个构造函数Matrix3D中切换索引。例如,为什么n[0][1]=n10?,c++,3d,C++,3d,我是3d游戏编程新手。我正在阅读Eric Lengyel的《游戏引擎开发基础》第1卷,我对他为什么在Matrix3D构造器中切换索引感到困惑。例如,n[0][1]=n10。这能使矩阵乘法更容易吗?还是有其他原因?多谢各位 public: Matrix3D() = default; Matrix3D(float n00, float n01, float n02, float n10, float n11, float n12, float n20, float n21,

我是3d游戏编程新手。我正在阅读Eric Lengyel的《游戏引擎开发基础》第1卷,我对他为什么在Matrix3D构造器中切换索引感到困惑。例如,n[0][1]=n10。这能使矩阵乘法更容易吗?还是有其他原因?多谢各位

public: 

   Matrix3D() = default; 
 
   Matrix3D(float n00, float n01, float n02,  float n10, float n11, float n12,  float n20, float n21, float n22)  {  n[0][0] = n00; n[0][1] = n10; n[0][2] = n20;  n[1][0] = n01; n[1][1] = n11; n[1][2] = n21;  n[2][0] = n02; n[2][1] = n12; n[2][2] = n22;  }  

   Matrix3D(const Vector3D& a, const Vector3D& b, const Vector3D& c)  {  n[0][0] = a.x; n[0][1] = a.y; n[0][2] = a.z;  n[1][0] = b.x; n[1][1] = b.y; n[1][2] = b.z;  n[2][0] = c.x; n[2][1] = c.y; n[2][2] = c.z;  } 


我相信这不是一个行与列的主要问题

Row maj vs col maj仅指定是将矩阵行视为完整向量,还是将列视为向量量。我认为这是API中的一个错误,因为构造函数参数的结构意味着每个参数对应于特定的矩阵元素

在一致性数学库中,除非构造函数明确指定,否则提供给构造函数的矩阵元素应遵循API的约定。如果我为n01参数提供“5”,我应该期望m[0][1]为5,除非某些文档非常清楚地表明情况并非如此。这在实践中是一个极其重要的区别,因为在从建模或动画程序导入某些类型的数据时,这可能会导致混淆问题


我建议检查本书的连接运算符或复制构造函数(如果提供)。仔细检查他们引入的约定是否在构造函数中重复,乘法是否遵循正确的矩阵数学约定

我认为这不是行主要与列主要的问题

Row maj vs col maj仅指定是将矩阵行视为完整向量,还是将列视为向量量。我认为这是API中的一个错误,因为构造函数参数的结构意味着每个参数对应于特定的矩阵元素

在一致性数学库中,除非构造函数明确指定,否则提供给构造函数的矩阵元素应遵循API的约定。如果我为n01参数提供“5”,我应该期望m[0][1]为5,除非某些文档非常清楚地表明情况并非如此。这在实践中是一个极其重要的区别,因为在从建模或动画程序导入某些类型的数据时,这可能会导致混淆问题


我建议检查本书的连接运算符或复制构造函数(如果提供)。仔细检查他们引入的约定是否在构造函数中重复,乘法是否遵循正确的矩阵数学约定,以说明差异。这只是一个惯例。Evg,谢谢你,我也考虑过了。我认为作者发表评论解释为什么会这样做是有帮助的,但是,这只是我…我想,解释一下差异。这只是一个惯例。Evg,谢谢你,我也考虑过了。我认为作者发表一篇关于为什么这样做的评论会很有帮助,但是,这只是我…Jon,谢谢你,还有你所说的:“我认为这是API中的一个错误,因为构造函数参数的结构意味着每个参数对应于一个特定的矩阵元素。”我想知道作者是否犯了一个错误,因为n[1][0]=n10不是更有意义吗?我以前从未见过这样的代码。让人困惑…无论如何,对我来说…我希望作者能在代码旁边加上注释,以便对为什么会这样做做出有益的解释…书中的文字没有太多解释…@marcy_w是的,我同意你的结论,无论如何,我都不会以这种方式设计数学库。我建议对这本书持保留态度,并参考像GLM这样的开源库以获得更多可用的示例。一个计划良好的数学库应该允许用户指定或切换行与列的主要约定,因为openGL和Direct X在这方面是出了名的相反。Jon,再次感谢你。作者对第14页进行了解释,但在我看来,这并不充分,也不明智:“为了在二维数组中实现列主存储顺序,我们需要将第一个数组索引设置为列号,将第二个数组索引设置为行号……因此,不允许直接访问矩阵项,我们将这些函数设为私有函数,并提供重载的圆括号运算符,它们以熟悉的行-列顺序获取两个索引。“还有,你指的GLM是什么?GLM是openGL数学库,它是开源的,性能合理,因此它是人们积极使用的API的优秀介绍和示例。如果你和其他几个人是唯一使用它的人,那么这当然是构建你的库的一种方法。在实践中,尤其是在游戏开发中(我是一名专业的物理程序员),我可以告诉你人们经常需要并使用矩阵存取器。这种解释似乎是一种愚蠢的解决方案,通过检查其他库,您会发现这不是一种普遍接受的解决方案。特征库也很好。是GLM的github,他们也有一个不错的文档网站Jon,谢谢,还有你所说的:“我认为这是API中的一个错误,因为构造函数参数的结构意味着每个参数对应一个特定的矩阵元素。”我想知道作者是否犯了错误,既然n[1][0]=n10不是更有意义吗?我以前从未见过这样的代码。让人困惑…无论如何,对我来说…我希望作者能在代码旁边加上注释,以便对为什么会这样做做出有益的解释…书中的文字没有太多解释…@marcy_w是的,我同意你的结论,无论如何,我都不会以这种方式设计数学库。我建议对这本书持保留态度,并参考像GLM这样的开源库以获得更多可用的示例。周密的计划