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 ベクトルに対してのみ定義されます。技術的には、7次元のベクトルのクロス積がありますが、どういうわけか、あなたはそれを探しているとは思いません。

4D ベクトルの外積は数学的に妥当ではないため、GLM はそれを計算する関数を提供していません。

于 2012-05-25T23:09:23.450 に答える
2

The generalization of the cross product is the wedge product, and the wedge product of two vectors is a 2-form, also known as a bivector.

In 3-space, the 2-form kinda looks like a vector, but it behaves quite differently. Suppose we have two non-collinear vectors tangent to a surface (aka tangent vectors). By taking the cross product of these vectors, we have a 2-form that represents the tangent plane. We can also represent that tangent plane by the vector normal to that plane (aka the normal vector). But the tangent and normal vectors are transformed differently, i.e. the normal vector is transformed by the inverse transpose of the matrix used to transform the tangent vectors.

In 4-space, the 2-form resulting from the wedge product of two vectors also represents the plane that contains the two vectors (this is also true in N-space). Similarly to the case in 3-space, we can have an alternate interpretation of that plane, but in 4-space, the complement to a plane is not a 4-vector, but another plane, both of which are represented with 6 components, not 4.

c1 * e1^e2 + c2 * e1^e3 + c3 * e1^e4 + c4 * e2^e3 + c5 * e2^e4 + c6 * e3^e4

Since glm doesn't provide the API for wedge products, you will have to roll your own. You can easily work out the algebra for the wedge product with two simple rules:

(1) ei ^ ei = 0
(2) ei ^ ej = -ej ^ ei

where the ei and ej are the component vectors (bases) of the vector space, e.g.

[a b c d] --> a * e1 + b * e2 + c * e3 + d * e4

The 7-dimensional vector referred to in a previous post is the geometric product of two vectors, which uses ei^ei=1 instead of rule (1) above, and is like a meld of the dot and cross products (or complex multiplication), which is more than what you want. For more information, https://en.wikipedia.org/wiki/Exterior_algebra or https://en.wikipedia.org/wiki/Geometric_algebra .

于 2016-05-05T16:50:00.790 に答える
2

あなたの vec4 は何を表していますか? ニコルが言ったように、外積は 3D ベクトル専用です。外積演算は、2 つの入力ベクトルに直交するベクトルを見つけるために使用されます。したがって、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 コンポーネントを追加します。

于 2014-01-13T17:02:14.593 に答える