背景:最近有个需求,需要用相机拍摄一个物品,初始状态下相机在该物体正上方,随后相机的坐标按一定规律变化,要求它的视野中心一直固定在该物体上。这个问题可以理解为:以物品建立一个坐标系,相机在该空间下的姿态为[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·简单介绍一下球坐标系