Math 如何使用glm计算vec4叉积?

Math 如何使用glm计算vec4叉积?,math,vectormath,Math,Vectormath,这会引发编译错误的原因:对“cross(glm::vec4&,glm::vec4&)”的调用没有匹配的函数 但是它对vec3很好?没有4D这样的东西;该操作仅为三维向量定义。嗯,从技术上讲,有一个,但不知怎么的,我不认为你在寻找那个 由于4D向量叉积在数学上不合理,GLM不提供计算它的函数。你的vec4代表什么?与Nicol一样,叉积仅适用于3D向量。叉积运算用于查找与两个输入向量正交的向量。因此,如果你的向量4以{x,y,z,w}的形式表示三维齐次向量,那么w分量对你来说并不重要;你可以忽略它

这会引发编译错误的原因:对“cross(glm::vec4&,glm::vec4&)”的调用没有匹配的函数


但是它对vec3很好?

没有4D这样的东西;该操作仅为三维向量定义。嗯,从技术上讲,有一个,但不知怎么的,我不认为你在寻找那个


由于4D向量叉积在数学上不合理,GLM不提供计算它的函数。

你的vec4代表什么?与Nicol一样,叉积仅适用于3D向量。叉积运算用于查找与两个输入向量正交的向量。因此,如果你的向量4以{x,y,z,w}的形式表示三维齐次向量,那么w分量对你来说并不重要;你可以忽略它

解决方法如下所示:

vec4 crossVec4(vec4 _v1, vec4 _v2){
    vec3 vec1 = vec3(_v1[0], _v1[1], _v1[2]);
    vec3 vec2 = vec3(_v2[0], _v2[1], _v2[2]);
    vec3 res = cross(vec1, vec2);
    return vec4(res[0], res[1], res[2], 1);
}

只需将vec4转换为vec3,执行叉积,然后再向其中添加1的w分量。

叉积的泛化为楔积,两个向量的楔积为2形式,也称为双向量

在3-空间中,2-形式有点像一个向量,但它的行为完全不同。假设有两个与曲面相切的非共线向量(也称为切线向量)。通过取这些向量的叉积,我们得到了表示切平面的2-形式。我们也可以用垂直于该平面的向量(也称为法向量)来表示该切平面。但切线和法向量的变换方式不同,即法向量通过用于变换切线向量的矩阵的逆转置进行变换

在4-空间中,由两个向量的楔形积生成的2-形式也表示包含两个向量的平面(在N-空间中也是如此)。与3-空间中的情况类似,我们可以对该平面进行另一种解释,但在4-空间中,平面的补码不是4-向量,而是另一个平面,这两个平面都用6个分量表示,而不是4

c1 * e1^e2 + c2 * e1^e3 + c3 * e1^e4 + c4 * e2^e3 + c5 * e2^e4 + c6 * e3^e4
由于glm不提供楔形产品的API,因此您必须自行开发。您可以使用两个简单的规则轻松计算楔形积的代数:

(1) ei ^ ei = 0
(2) ei ^ ej = -ej ^ ei
其中ei和ej是向量空间的分量向量(基),例如

[a b c d] --> a * e1 + b * e2 + c * e3 + d * e4
上一篇文章中提到的7维向量是两个向量的几何积,它使用ei^ei=1而不是上面的规则(1),就像点积和叉积(或复数乘法)的混合,这比你想要的要多。
有关更多信息,或。

有更多使用glm的glm_SWIZZLE计算叉积的快捷方式

只需在包含任何GLM文件之前定义GLM\U SWIZZLE即可。这对其他很多技巧也很有帮助

glm::vec4 a;
glm::vec4 b;
glm::vec4 c = glm::vec4( glm::cross( glm::vec3( a.xyz ), glm::vec3( b.xyz ) ), 0 );

实际上,叉积存在于任何维度,二元三维叉积只是它的一个特例。在N维中,叉积需要N-1个向量,并在数学上定义为N-1个向量的楔形积的Hodge对偶。它可以相对容易地以矩阵形式编写和计算。
glm::vec4 a;
glm::vec4 b;
glm::vec4 c = glm::vec4( glm::cross( glm::vec3( a.xyz ), glm::vec3( b.xyz ) ), 0 );