6

四元数乘法定义明确,我称之为“汉密尔顿积”:

// hamilton product
vec4 qmul(in vec4 q1, in vec4 q2) {
    return vec4(
        q1.w * q2.xyz + q2.w * q1.xyz - cross(q1.xyz, q2.xyz),
        q1.w*q2.w - dot(q1.xyz, q2.xyz)
    );
}

但是,为了实现qtanh()四元数函数,我们需要除法。到目前为止,我已经找到了这个,并且工作正常。你能不能帮我理解一下,这是从哪里来的?

// division
// https://www.boost.org/doc/libs/1_67_0/boost/math/quaternion.hpp
vec4 qdiv(in vec4 q1, in vec4 q2) {
float denominator = dot(q2,q2);
return vec4( 
    vec3(
        -q1.w*q2.x+q1.x*q2.w-q1.y*q2.z+q1.z*q2.y,
        -q1.w*q2.y+q1.x*q2.z+q1.y*q2.w-q1.z*q2.x,
        -q1.w*q2.z-q1.x*q2.y+q1.y*q2.x+q1.z*q2.w
    ),
    q1.w*q2.w + dot(q1.xyz, q2.xyz)
) / denominator;
}

此外,就我试图实现 tanh() 而言,您是否知道更多的计算增值税,而不是划分 sinh 和 cosh?对于实数,我曾经使用以下公式: tanh(x)=-1+2/(1+exp(-x)). 这仅涉及单个指数微积分,而不是两个..

4

1 回答 1

4

一、分工

将名为p的四元数除以名为q的四元数无非是将p乘以q的倒数

这相当于将p乘以q的共轭(根据定义等于a – bi – cj – dk)并将乘积除以等于q范数平方的标量:

从这里很明显该denominator部分的来源:

现在让我们重新排列这些术语以vec3提高可读性:

vec3(
    -q1.w*q2.x + q1.x*q2.w - (q1.y*q2.z - q1.z*q2.y),
    -q1.w*q2.y + q1.y*q2.w - (q1.z*q2.x - q1.x*q2.z),
    -q1.w*q2.z + q1.z*q2.w - (q1.x*q2.y - q1.y*q2.x)
)

现在突然明白发生了什么:

vec3(
    -q1.w * q2.x    +  q1.x   * q2.w  -  (q1.y*q2.z - q1.z*q2.y),
    -q1.w * q2.y    +  q1.y   * q2.w  -  (q1.z*q2.x - q1.x*q2.z),
    -q1.w * q2.z    +  q1.z   * q2.w  -  (q1.x*q2.y - q1.y*q2.x)
)

...

    -q1.w * q2.xyz  +  q1.xyz * q2.w  -  (cross(q1.xyz, q2.xyz))

所以是的,四元数除法只是常规的普通乘法,被乘数是倒数。这就是缺点的来源,请参见上面的定义。

2.双曲正切

首先,定义。对于每个q = a + bi + cj + dk = a + v̅

因此,要同时获得e qe –q,您只需计算以下值:e a , ||v̅|| , sin(||v̅||) , cos(||v̅||)

要计算e -q,您应该取e a的倒数,然后将其乘以符号倒置的等式的其余部分。这不会花费太多时间,因为它包含的所有值都已经计算过了。一个exp()电话,根据要求=)

于 2019-04-19T15:33:17.943 回答