0

私が取り組んでいるプロジェクトでは、3ds/gmax のクォータニオンの追加を模倣する関数が必要です。(quat 1 2 3 4)+(quat 3 5 7 9) のテスト ケースは、(quat 20 40 54 2) と等しくなければなりません。これらの quat は xyzw です。だから、きれいな数を考えると、それは基本的な代数だと思います。sin/cos を含まないため、次の乗算関数のようなものでなければなりません。

    const quaternion &operator *=(const quaternion &q)      
    {
        float x= v.x, y= v.y, z= v.z, sn= s*q.s - v*q.v;
        v.x= y*q.v.z - z*q.v.y + s*q.v.x + x*q.s;
        v.y= z*q.v.x - x*q.v.z + s*q.v.y + y*q.s;
        v.z= x*q.v.y - y*q.v.x + s*q.v.z + z*q.s;
        s= sn;
        return *this;
    } 

ソース

しかし、 sn= s*qs - v*qv がどのように機能するのかわかりません。s はフロート、v はベクトルです。ベクトルを乗算してフロートに追加しますか? これらの値が表す方向/回転/向きの項さえわかりませんが、関数が上記の quat 値を満たしている場合、機能します。

4

1 に答える 1

0

それを見つけた。乗算として知られていることが判明しました。加算は乗算です。アップは横向きです。まったく混乱しません:/

fn qAdd q1 q2 = (
x1=q1.x
y1=q1.y
z1=q1.z
w1=q1.w
x2=q2.x
y2=q2.y
z2=q2.z
w2=q2.w

W = (W1 * W2) - (X1 * X2) - (Y1 * Y2) - (Z1 * Z2)
X = (W1 * X2) + (X1 * W2) + (Y1 * Z2) - (Z1 * Y2)
Y = (W1 * Y2) + (Y1 * W2) + (Z1 * X2) - (X1 * Z2)
Z = (W1 * Z2) + (Z1 * W2) + (X1 * Y2) - (Y1 * X2)

return (quat x y z w)

)

q1 と q2 を交換すると、異なる結果が得られ、加算や乗算とはまったく異なります。

ソース

于 2012-12-23T21:49:52.283 に答える