如何用glm计算vec4交叉积?

时间:2012-05-25 17:56:37

标签: math vectormath

为什么会抛出编译错误:没有匹配函数来调用'cross(glm :: vec4&,glm :: vec4&)'

glm::vec4 a;
glm::vec4 b;
glm::vec4 c = glm::cross(a, b);

但它适用于vec3?

4 个答案:

答案 0 :(得分:8)

没有4D vector cross-product这样的东西;该操作仅针对3D矢量定义。嗯,从技术上讲,有一个seven-dimensional vector cross-product,但我不认为你在寻找它。

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

答案 1 :(得分:2)

你的vec4代表什么?与Nicol said一样,交叉产品仅适用于3D矢量。叉积运算用于找到与两个输入向量正交的向量。因此,如果你的vec4代表{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 :(得分:1)

交叉积的推广是楔形积,两个向量的楔形积是2形式,也称为bivector。

在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),并且像点和交叉乘积的融合(或者复数乘法),这比你想要的更多。 有关详细信息,请https://en.wikipedia.org/wiki/Exterior_algebrahttps://en.wikipedia.org/wiki/Geometric_algebra

答案 3 :(得分:0)

使用glm的GLM_SWIZZLE可以更快捷地计算叉积。

在包含任何glm文件之前只需执行#define GLM_SWIZZLE。这对于其他许多技巧也很有帮助。

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