2012-05-25 32 views
4

爲什麼這將引發編譯錯誤:調用沒有匹配的函數「交叉(GLM :: vec4 &,GLM :: vec4 &)」如何用glm來計算vec4交叉乘積?

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

但它VEC3正常工作?

回答

7

有沒有這樣的事情作爲4D vector cross-product;該操作僅針對3D向量進行定義。嗯,從技術上講,有一個seven-dimensional vector cross-product,但不知何故,我不認爲你正在尋找。

由於4D矢量交叉產品在數學上不合理,因此GLM不提供計算它的函數。

+1

實際上任何維度都存在交叉產品,二元三維交叉產品只是它的一個特例。在N維中,交叉乘積需要N-1個向量,並且在數學上定義爲N-1個向量的楔形乘積的Hodge對偶。它可以用矩陣形式相對容易地書寫和計算。 – plasmacel

2

你的vec4代表什麼?與Nicol said一樣,交叉產品僅適用於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的,執行叉積,再加入1 W-組件放回它。

1

叉積的推廣是楔形積,兩個向量的楔形積是一個2形式,也稱爲bivector。

在3維空間中,2形式的kinda看起來像一個向量,但它的行爲完全不同。假設我們有兩個與曲面相切的非共線向量(又稱切向量)。通過取這些向量的叉積,我們有一個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