四元数乘法定义明确,我称之为“汉密尔顿积”:
// 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))
。那只涉及单个指数演算,而不是两个。
答案 0 :(得分:4)
将名为 p 的四元数除以名为 q 的四元数,无非就是将 p 与the reciprocal of q相乘。
这等同于将 p 与 q 的共轭相乘(其中by definition等于 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))
是的,四元数除法只是常规的常乘运算,被乘数是倒数。那是缺点所在,请参阅上面的定义。
首先,定义。对于每个 q = a + bi + cj + dk = a +v̅:
因此,要同时获得 e q 和 e –q ,您只需计算以下值: e a , ||v̅|| , sin(||v̅||), cos(||v̅||)。
要计算 e –q ,您应取 e a 的倒数,并将其乘以余数等式的符号倒置。这不会花费太多时间,因为它所包含的所有值都已经被计算了。根据要求,一个exp()
通话=)