xak*_*p35 6 glsl linear-algebra quaternions hyperbolic-function
Quaternion multiplication is well-defined, and is known to me as "Hamilton product":
// 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)
);
}
Run Code Online (Sandbox Code Playgroud)
However, for implementing qtanh() quaternionic function, we need division. So far I've found this, and it is working OK. Could you help me to undestand, where does this comes from?
// 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;
}
Run Code Online (Sandbox Code Playgroud)
Also, as far as I am trying to implement tanh().. are you aware of more computationally vat, than dividing sinh and cosh? For reals I've used to use following formula: tanh(x)=-1+2/(1+exp(-x)). And that involves only single exponential calculus, instead of two..
这相当于将p乘以q的共轭(根据定义等于a\xc2\xa0\xe2\x80\x93\xc2\xa0bi\xc2\xa0\xe2\x80\x93\xc2\xa0cj\xc2\xa0\ xe2\x80\x93\xc2\xa0dk ) 并将乘积除以等于q范数平方的标量:
\n从这里很明显该denominator部分来自哪里:
现在让我们重新排列总和中的术语vec3以提高可读性:
vec3(\n -q1.w*q2.x + q1.x*q2.w - (q1.y*q2.z - q1.z*q2.y),\n -q1.w*q2.y + q1.y*q2.w - (q1.z*q2.x - q1.x*q2.z),\n -q1.w*q2.z + q1.z*q2.w - (q1.x*q2.y - q1.y*q2.x)\n)\nRun Code Online (Sandbox Code Playgroud)\n现在突然明白发生了什么:
\nvec3(\n -q1.w * q2.x + q1.x * q2.w - (q1.y*q2.z - q1.z*q2.y),\n -q1.w * q2.y + q1.y * q2.w - (q1.z*q2.x - q1.x*q2.z),\n -q1.w * q2.z + q1.z * q2.w - (q1.x*q2.y - q1.y*q2.x)\n)\n\n...\n\n -q1.w * q2.xyz + q1.xyz * q2.w - (cross(q1.xyz, q2.xyz))\nRun Code Online (Sandbox Code Playgroud)\n所以是的,四元数除法只是常规的普通乘法,被乘数是倒数。这就是缺点的来源,请参阅上面的定义。
\n首先,定义。对于每个q\xc2\xa0=\xc2\xa0a\xc2\xa0+\xc2\xa0bi\xc2\xa0+\xc2\xa0cj\xc2\xa0+\xc2\xa0dk = a + v\xcc\x85:
\n因此,要获得e q和e \xe2\x80\x93q,您只需计算以下值:e a , ||v\xcc\x85|| 、sin(||v\xcc\x85||)、cos(||v\xcc\x85||)。
\n要计算e \xe2\x80\x93q,您应该取e a的倒数,并将其乘以等式的其余部分,并且符号相反。这不会花费太多时间,因为它包含的所有值都已经计算出来了。exp()根据要求,一通电话 =)