4

为什么这会引发编译错误:没有匹配函数调用 'cross(glm::vec4&, glm::vec4&)'</p>

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

但它适用于 vec3?

4

4 回答 4

8

没有 4D矢量叉积这样的东西;该操作仅针对 3D 矢量定义。好吧,从技术上讲,有一个维向量叉积,但不知何故,我认为你不是在寻找那个。

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

于 2012-05-25T23:09:23.450 回答
2

你的 vec4 代表什么?就像 Nicol所说,叉积仅适用于 3D 向量。叉积运算用于找到与两个输入向量正交的向量。因此,如果您的 vec4 以 {x, y, z, w} 的形式表示 3D 齐次向量,那么 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,执行叉积,然后将 w-component 1 添加回其中。

于 2014-01-13T17:02:14.593 回答
2

叉积的推广就是楔积,两个向量的楔积是一个2-形式,也称为双向量。

在 3-space 中,2-form 有点像向量,但它的行为完全不同。假设我们有两个与表面相切的非共线向量(也称为切向量)。通过取这些向量的叉积,我们有一个表示切平面的 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

于 2016-05-05T16:50:00.790 回答
0

使用 glm 的 GLM_SWIZZLE 计算叉积有更快捷的方法。

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

glm::vec4 a;
glm::vec4 b;
glm::vec4 c = glm::vec4( glm::cross( glm::vec3( a.xyz ), glm::vec3( b.xyz ) ), 0 );
于 2018-06-22T18:58:43.647 回答