计算球体上一点指向球心的姿态

背景:最近有个需求,需要用相机拍摄一个物品,初始状态下相机在该物体正上方,随后相机的坐标按一定规律变化,要求它的视野中心一直固定在该物体上。这个问题可以理解为:以物品建立一个坐标系,相机在该空间下的姿态为[x,y,z, α \alpha α, β \beta β, γ \gamma γ]。其中X、Y、Z为相机在物体坐标系下的坐标, α \alpha α β \beta β γ \gamma γ为相机绕三轴旋转的夹角。而X、Y、Z为已知量, α \alpha α β \beta β γ \gamma γ为待求量。

关于求角度的问题,可以转换为球体的角度问题:

在这里插入图片描述
对于球体上的一点,我们可以通过三维直角坐标系表示,同时也可以球坐标系表示。假设球体上一点的初始坐标在[0,0,r],其中 r r r为球体的半径。则我们可以通过两次旋转将该点转动到球体上的任意位置,因此该点的表示方式为:[ r r r ϕ \phi ϕ θ \theta θ]。 r r r是球面坐标点到球心的距离; ϕ \phi ϕ为是赤道面(由 x 轴与 y 轴确定的平面)上起始于 x 轴,沿逆时针方向量出的角度; θ \theta θ是 z 轴与 r 的夹角。

回到最初的问题上,该问题可以理解为:初始状态下,相机的姿态为[0,0,0,3.14,0,0],即相机在Z轴正上方位置,相机的Z轴朝下。则如果此时我们需要将相机转动到球体上的[ r r r ϕ \phi ϕ θ \theta θ]位置时,得到相机的新的角度值为[3.14+ θ \theta θ,0, ϕ \phi ϕ],这样,我们就能知道相机相对于物品的姿态了。

那么接下来就是求一下 ϕ \phi ϕ θ \theta θ两个角度就可以了,根据三维直角坐标系表示方法与球坐标系表示方法之间的关系:
{ x = r s i n θ c o s φ , y = r s i n θ s i n φ , z = r c o s θ \begin{cases} x=rsinθcosφ, \\ y=rsinθsinφ, \\ z=rcosθ \end{cases} x=rsinθcosφ,y=rsinθsinφ,z=rcosθ

可知,当已知球体上一个点的坐标[X、Y、Z],则可以根据上式求出绕两个轴的旋转角度:
{ θ = a r c c o s ( z / r ) φ = a r c s i n ( y / ( r s i n θ ) ) \begin{cases} θ=arccos(z/r) \\ φ=arcsin(y/(rsinθ)) \end{cases} { θ=arccos(z/r)φ=arcsin(y/(rsinθ))
则根据上式可以得知在任意位置上的相机姿态为:[X、Y、Z、3.14+ θ \theta θ,0, ϕ \phi ϕ]。

根据TF发布一下结果:
在这里插入图片描述
在这里插入图片描述

可以看到虽然相机的位置是一直在发生变化的,但是相机的Z轴是始终指向circle的中心的,则可以满足开始的需求。

参考:

唯心识学061·简单介绍一下球坐标系

猜你喜欢

转载自blog.csdn.net/YiYeZhiNian/article/details/131975626