四元数除法和双曲正切tanh
Quaternion division and hyperbolic tangent tanh
四元数乘法定义明确,我称之为 "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)
);
}
然而,为了实现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().. 你是否知道 vat 比除 sinh 和 cosh 更多的计算?对于实数,我曾经使用以下公式:tanh(x)=-1+2/(1+exp(-x))
。这只涉及一个指数演算,而不是两个..
1。分区
将名为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))
所以是的,四元数除法就是常规的 运行 乘法,被乘数是倒数。这就是缺点的来源,请参阅上面的定义。
2。双曲正切
首先,定义。对于每个 q = a + bi + cj + dk = a + v̅:
=%7B%7Be%5Eq-e%5E%7B-q%7D%7D%5Cover%7B2%7D%7D,%5Cquad%5Ccosh(q)=%7B%7Be%5Eq+e%5E%7B-q%7D%7D%5Cover%7B2%7D%7D,%5Cquad%5Ctanh(q)=%7B%5Csinh(q)%5Cover%5Ccosh(q)%7D=%7B%7Be%5Eq-e%5E%7B-q%7D%7D%5Cover%7Be%5Eq+e%5E%7B-q%7D%7D%7D%5C%5Ce%5Eq=e%5Ea%5Cleft(%5Ccos(||%5Cmathrm%7Bv%7D||)+%7B%5Cmathrm%7Bv%7D%5Cover||%5Cmathrm%7Bv%7D||%7D%5Csin(||%5Cmathrm%7Bv%7D||)%5Cright),%5Cquad||%5Cmathrm%7Bv%7D||=%5Csqrt%7Bb%5E2+c%5E2+d%5E2%7D,%5Cquad%7Be%7D%5E%7B-a%7D=%7B1%5Cover%7Be%5Ea%7D%7D)
因此,要同时获得 eq 和 e–q 你只需要计算以下值:ea, ||v̅||, sin(||v̅||), cos(||v̅||).
要计算 e–q 你应该取 ea[= 的倒数77=] 并将其乘以符号倒置的等式的其余部分。这不会花费太多时间,因为它包含的所有值都已经计算好了。一个 exp()
电话,根据要求 =)
四元数乘法定义明确,我称之为 "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)
);
}
然而,为了实现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().. 你是否知道 vat 比除 sinh 和 cosh 更多的计算?对于实数,我曾经使用以下公式:tanh(x)=-1+2/(1+exp(-x))
。这只涉及一个指数演算,而不是两个..
1。分区
将名为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))
所以是的,四元数除法就是常规的 运行 乘法,被乘数是倒数。这就是缺点的来源,请参阅上面的定义。
2。双曲正切
首先,定义。对于每个 q = a + bi + cj + dk = a + v̅:
因此,要同时获得 eq 和 e–q 你只需要计算以下值:ea, ||v̅||, sin(||v̅||), cos(||v̅||).
要计算 e–q 你应该取 ea[= 的倒数77=] 并将其乘以符号倒置的等式的其余部分。这不会花费太多时间,因为它包含的所有值都已经计算好了。一个 exp()
电话,根据要求 =)