平面方程在不同坐标系下的变换与平移
平面方程在不同坐标系下的变换
已知条件:
-
在世界坐标系中,平面的一般方程为:
A x + B y + C z + D = 0 Ax + By + Cz + D = 0 Ax+By+Cz+D=0
其中:- A , B , C A, B, C A,B,C 构成了该平面的法向量 n = [ A , B , C ] ⊤ \mathbf{n} = [A, B, C]^\top n=[A,B,C]⊤;
- D D D 表示该平面到原点的有向距离(即带符号的距离)。
-
世界坐标系下的点 p w \mathbf{p}_w pw 与相机坐标系下的点 p c \mathbf{p}_c pc 之间的变换关系为:
p w = R p c + t \mathbf{p}_w = \mathbf{R} \mathbf{p}_c + \mathbf{t} pw=Rpc+t
其中:- p w ∈ R 3 \mathbf{p}_w \in \mathbb{R}^3 pw∈R3:世界坐标系中的点(3×1 向量);
- p c ∈ R 3 \mathbf{p}_c \in \mathbb{R}^3 pc∈R3:相机坐标系中的点(3×1 向量);
- R ∈ R 3 × 3 \mathbf{R} \in \mathbb{R}^{3\times3} R∈R3×3:旋转矩阵,表示从相机坐标系到世界坐标系的旋转;
- t ∈ R 3 \mathbf{t} \in \mathbb{R}^3 t∈R3:平移向量,表示相机在世界坐标系中的位置。
目标:
将世界坐标系下的平面方程转换为相机坐标系下的表达式。
方法一:
表达一个平面方程只需要确认法向量和D值,因此为了将这个平面方程转换到相机坐标系下,我们需要做的是:
-
变换平面的法向量:因为旋转矩阵 R R R 变换的是坐标点而不是向量的方向,所以平面的法向量只需要通过 R T R^T RT(即 R R R 的转置,对于正交矩阵 R R R,其转置等于其逆)来调整法向量的方向。因此,在相机坐标系下的法向量 n ′ \mathbf{n'} n′可以表示为:
n ′ = R T n \mathbf{n'} = R^T \mathbf{n} n′=RTn -
计算新的 D ′ D' D′ 值:由于平面的位置也受平移的影响,所以我们还需要调整 D D D 值。首先,考虑平面上的一点 p \mathbf{p} p,它满足原始的平面方程。该点在相机坐标系中的位置可以通过 p ′ = R T ( p − t ) \mathbf{p'} = R^T(\mathbf{p} - t) p′=RT(p−t) 来计算。然后,利用新坐标系下的平面方程 n ′ ⋅ p ′ + D ′ = 0 \mathbf{n'} \cdot \mathbf{p'} + D' = 0 n′⋅p′+D′=0,我们可以解出 D ′ D' D′。但是,直接计算 D ′ D' D′ 更简单的方式是注意到 D = − n ⋅ p D = -\mathbf{n} \cdot \mathbf{p} D=−n⋅p,因此在变换后我们有:
D ′ = − n ′ ⋅ ( R T ( − t ) ) = − n ′ ⋅ ( − R T t ) = n ′ ⋅ R T t D' = -\mathbf{n'} \cdot (R^T(-t)) = -\mathbf{n'} \cdot (-R^Tt) = \mathbf{n'} \cdot R^Tt D′=−n′⋅(RT(−t))=−n′⋅(−RTt)=n′⋅RTt
总结起来,给定世界坐标系下的平面方程 A x + B y + C z + D = 0 Ax + By + Cz + D = 0 Ax+By+Cz+D=0 和从世界坐标系到相机坐标系的变换(旋转矩阵 R R R 和平移向量 t t t),你可以按照以下步骤得到相机坐标系下的平面方程:
- 计算新的法向量: n ′ = R T n \mathbf{n'} = R^T \mathbf{n} n′=RTn
- 计算新的常数项: D ′ = n ′ ⋅ R T t D' = \mathbf{n'} \cdot R^Tt D′=n′⋅RTt
最终,在相机坐标系下的平面方程为 A ′ x + B ′ y + C ′ z + D ′ = 0 A'x + B'y + C'z + D' = 0 A′x+B′y+C′z+D′=0,其中 [ A ′ , B ′ , C ′ ] T = n ′ [A', B', C']^T = \mathbf{n'} [A′,B′,C′]T=n′。
方法二:
假设世界坐标系下平面的方程为:
A x w + B y w + C z w + D = 0 A x_w + B y_w + C z_w + D = 0 Axw+Byw+Czw+D=0
也可以写成向量形式:
n w T p w + D = 0 \mathbf{n}_w^T \mathbf{p}_w + D = 0 nwTpw+D=0
其中:
- n w = [ A , B , C ] T \mathbf{n}_w = [A, B, C]^T nw=[A,B,C]T 是世界坐标系下的平面法向量;
- p w = [ x w , y w , z w ] T \mathbf{p}_w = [x_w, y_w, z_w]^T pw=[xw,yw,zw]T 是世界坐标系下的任意一点。
我们要推导出这个平面在相机坐标系下的方程。为此,我们将 p w = R p c + t \mathbf{p}_w = R \mathbf{p}_c + t pw=Rpc+t 代入上式:
n w T ( R p c + t ) + D = 0 \mathbf{n}_w^T (R \mathbf{p}_c + t) + D = 0 nwT(Rpc+t)+D=0
展开得:
n w T R p c + n w T t + D = 0 \mathbf{n}_w^T R \mathbf{p}_c + \mathbf{n}_w^T t + D = 0 nwTRpc+nwTt+D=0
定义新的法向量和常数项:
- n c = R T n w \mathbf{n}_c = R^T \mathbf{n}_w nc=RTnw (注意: n w T R = ( R T n w ) T = n c T \mathbf{n}_w^T R = (R^T \mathbf{n}_w)^T = \mathbf{n}_c^T nwTR=(RTnw)T=ncT)
- D c = n w T t + D D_c = \mathbf{n}_w^T t + D Dc=nwTt+D
于是相机坐标系下的平面方程变为:
n c T p c + D c = 0 \mathbf{n}_c^T \mathbf{p}_c + D_c = 0 ncTpc+Dc=0
或写成分量形式:
A ′ x c + B ′ y c + C ′ z c + D c = 0 A' x_c + B' y_c + C' z_c + D_c = 0 A′xc+B′yc+C′zc+Dc=0
其中:
- [ A ′ , B ′ , C ′ ] T = n c = R T n w [A', B', C']^T = \mathbf{n}_c = R^T \mathbf{n}_w [A′,B′,C′]T=nc=RTnw
- D c = n w T t + D D_c = \mathbf{n}_w^T t + D Dc=nwTt+D
总结公式
给定世界坐标系下的平面参数 ( n w , D ) (\mathbf{n}_w, D) (nw,D),以及相机相对于世界的变换 ( R , t ) (R, t) (R,t),则相机坐标系下的平面参数为:
-
法向量:
n c = R T n w \mathbf{n}_c = R^T \mathbf{n}_w nc=RTnw -
常数项:
D c = n w T t + D D_c = \mathbf{n}_w^T t + D Dc=nwTt+D
示例计算
假设:
- 世界坐标系下的平面为: 2 x + 3 y + 6 z − 12 = 0 2x + 3y + 6z - 12 = 0 2x+3y+6z−12=0,即 n w = [ 2 , 3 , 6 ] T \mathbf{n}_w = [2, 3, 6]^T nw=[2,3,6]T, D = − 12 D = -12 D=−12
- 相机变换为:
R = [ 0 − 1 0 1 0 0 0 0 1 ] , t = [ 1 2 3 ] R = \begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix}, \quad t = \begin{bmatrix} 1 \\ 2 \\ 3 \end{bmatrix} R= 010−100001 ,t= 123
步骤一:计算 n c = R T n w \mathbf{n}_c = R^T \mathbf{n}_w nc=RTnw
由于 R R R 是旋转矩阵, R T = R − 1 R^T = R^{-1} RT=R−1,所以:
R T = [ 0 1 0 − 1 0 0 0 0 1 ] R^T = \begin{bmatrix} 0 & 1 & 0 \\ -1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix} RT= 0−10100001
n c = R T ⋅ [ 2 3 6 ] = [ 0 ⋅ 2 + 1 ⋅ 3 + 0 ⋅ 6 − 1 ⋅ 2 + 0 ⋅ 3 + 0 ⋅ 6 0 ⋅ 2 + 0 ⋅ 3 + 1 ⋅ 6 ] = [ 3 − 2 6 ] \mathbf{n}_c = R^T \cdot \begin{bmatrix}2 \\ 3 \\ 6\end{bmatrix} = \begin{bmatrix} 0 \cdot 2 + 1 \cdot 3 + 0 \cdot 6 \\ -1 \cdot 2 + 0 \cdot 3 + 0 \cdot 6 \\ 0 \cdot 2 + 0 \cdot 3 + 1 \cdot 6 \end{bmatrix} = \begin{bmatrix}3 \\ -2 \\ 6\end{bmatrix} nc=RT⋅ 236 = 0⋅2+1⋅3+0⋅6−1⋅2+0⋅3+0⋅60⋅2+0⋅3+1⋅6 = 3−26
步骤二:计算 D c = n w T t + D D_c = \mathbf{n}_w^T t + D Dc=nwTt+D
n w T t = [ 2 , 3 , 6 ] ⋅ [ 1 , 2 , 3 ] = 2 ∗ 1 + 3 ∗ 2 + 6 ∗ 3 = 2 + 6 + 18 = 26 \mathbf{n}_w^T t = [2, 3, 6] \cdot [1, 2, 3] = 2*1 + 3*2 + 6*3 = 2 + 6 + 18 = 26 nwTt=[2,3,6]⋅[1,2,3]=2∗1+3∗2+6∗3=2+6+18=26
D c = 26 + ( − 12 ) = 14 D_c = 26 + (-12) = 14 Dc=26+(−12)=14
最终结果
相机坐标系下的平面方程为:
3 x c − 2 y c + 6 z c + 14 = 0 3x_c - 2y_c + 6z_c + 14 = 0 3xc−2yc+6zc+14=0
平面方程沿着法向量移动
先补充点到直线的距离公式,有利于了解平面方程沿着法向量移动
点到直线的距离公式
1、基本思想:投影法
- 平面的法向量 n ⃗ \vec{n} n 是垂直于平面的;
- 点 P 0 P_0 P0 到平面的最短距离,就是从该点沿法向量方向“垂直到达”平面的距离;
- 因此,我们可以取平面上任意一点 P 1 ( x 1 , y 1 , z 1 ) P_1(x_1, y_1, z_1) P1(x1,y1,z1),构造向量 P 1 P 0 ⃗ \vec{P_1P_0} P1P0,然后将它在法向量 n ⃗ \vec{n} n 上投影,得到的就是有向距离。
2、具体推导过程
- 任取平面上的一点
设 P 1 ( x 1 , y 1 , z 1 ) P_1(x_1, y_1, z_1) P1(x1,y1,z1) 是平面上的一个点,则满足平面方程:
A x 1 + B y 1 + C z 1 + D = 0 Ax_1 + By_1 + Cz_1 + D = 0 Ax1+By1+Cz1+D=0
- 构造向量 P 1 P 0 ⃗ \vec{P_1P_0} P1P0
P 1 P 0 ⃗ = ( x 0 − x 1 , y 0 − y 1 , z 0 − z 1 ) \vec{P_1P_0} = (x_0 - x_1,\ y_0 - y_1,\ z_0 - z_1) P1P0=(x0−x1, y0−y1, z0−z1)
- 向量在法向量上的投影长度(即点到平面的有向距离)
投影公式是:
d = P 1 P 0 ⃗ ⋅ n ⃗ ∥ n ⃗ ∥ d = \frac{\vec{P_1P_0} \cdot \vec{n}}{\|\vec{n}\|} d=∥n∥P1P0⋅n
计算内积:
P 1 P 0 ⃗ ⋅ n ⃗ = A ( x 0 − x 1 ) + B ( y 0 − y 1 ) + C ( z 0 − z 1 ) = A x 0 + B y 0 + C z 0 − ( A x 1 + B y 1 + C z 1 ) \vec{P_1P_0} \cdot \vec{n} = A(x_0 - x_1) + B(y_0 - y_1) + C(z_0 - z_1) = Ax_0 + By_0 + Cz_0 - (Ax_1 + By_1 + Cz_1) P1P0⋅n=A(x0−x1)+B(y0−y1)+C(z0−z1)=Ax0+By0+Cz0−(Ax1+By1+Cz1)
由于 A x 1 + B y 1 + C z 1 = − D Ax_1 + By_1 + Cz_1 = -D Ax1+By1+Cz1=−D(因为 P 1 P_1 P1 在平面上),代入得:
P 1 P 0 ⃗ ⋅ n ⃗ = A x 0 + B y 0 + C z 0 + D \vec{P_1P_0} \cdot \vec{n} = Ax_0 + By_0 + Cz_0 + D P1P0⋅n=Ax0+By0+Cz0+D
所以点到平面的有向距离为:
d = A x 0 + B y 0 + C z 0 + D ∥ n ⃗ ∥ = A x 0 + B y 0 + C z 0 + D A 2 + B 2 + C 2 d = \frac{Ax_0 + By_0 + Cz_0 + D}{\|\vec{n}\|} = \frac{Ax_0 + By_0 + Cz_0 + D}{\sqrt{A^2 + B^2 + C^2}} d=∥n∥Ax0+By0+Cz0+D=A2+B2+C2Ax0+By0+Cz0+D
- 分子 A x 0 + B y 0 + C z 0 + D Ax_0 + By_0 + Cz_0 + D Ax0+By0+Cz0+D 实际上是把点代入平面方程左边的结果。
- 分母是法向量的模长,用于标准化距离。
- 这个公式适用于所有不在平面上的点。
- 这个距离是带有方向的,当结果为正时,cos 值大于 0,表示 P 1 P 0 ⃗ \vec{P_1P_0} P1P0与法向量 n ⃗ \vec{n} n同向,表示点在法向量指向的一侧(也叫正方向);为负则在另一侧(反方向)。
平面沿着法向量移动:
平面方程的法向量可以有两个方向,我们需要先确认移动的方向,这里的研究就以靠近原点(原点不在平面上)的方向来沿着法向量移动 d d d个距离。
判断原点与法向量的关系,将原点代入平面方程可知,当 D > 0 D>0 D>0时,原点在法向量正方向,当 D < 0 D<0 D<0时,原点在法向量反方向。
沿法向量方向移动距离 d d d,那么新的平面方程与原平面平行,法向量不变,只是常数项 D 发生变化。
平移后的平面方程为:
A x + B y + C z + D ′ = 0 Ax + By + Cz + D' = 0 Ax+By+Cz+D′=0
其中,
D ′ = D ∓ 4 ⋅ A 2 + B 2 + C 2 D' = D \mp 4 \cdot \sqrt{A^2 + B^2 + C^2} D′=D∓4⋅A2+B2+C2
符号取决于你希望平面是朝法向量方向移动(−),还是反方向移动(+):
-
若沿法向量方向移动(即从原点往法向量方向移动平面),使用 减号:
D ′ = D − 4 ⋅ A 2 + B 2 + C 2 D' = D - 4 \cdot \sqrt{A^2 + B^2 + C^2} D′=D−4⋅A2+B2+C2
-
若沿法向量相反方向移动,使用 加号。
D ′ = D + 4 ⋅ A 2 + B 2 + C 2 D' = D + 4 \cdot \sqrt{A^2 + B^2 + C^2} D′=D+4⋅A2+B2+C2
推导
假设我们把这个平面沿法向量正方向移动距离 d d d ,法向量保持不变,那么只需要确认D值,我们只需要研究一个在原先平面的点 r 0 r0 r0之后是怎么变换到新平面的就可以确认D值了。
由于法向量可能不是单位向量,我们需要先将其归一化:
n ^ = ( A N , B N , C N ) , N = A 2 + B 2 + C 2 \hat{n} = \left( \frac{A}{N}, \frac{B}{N}, \frac{C}{N} \right), \quad N = \sqrt{A^2 + B^2 + C^2} n^=(NA,NB,NC),N=A2+B2+C2
于是,每个点都沿这个方向移动 d d d 个单位长度,即:
r ⃗ new = r ⃗ + d ⋅ n ^ \vec{r}_{\text{new}} = \vec{r} + d \cdot \hat{n} rnew=r+d⋅n^
也就是说,原来的点 r ⃗ 0 \vec{r}_0 r0 移动后变成:
r ⃗ new , 0 = r ⃗ 0 + d ⋅ n ^ \vec{r}_{\text{new}, 0} = \vec{r}_0 + d \cdot \hat{n} rnew,0=r0+d⋅n^
代入到新的平面方程中,得到新的常数项:
D ′ = − ( A x new , 0 + B y new , 0 + C z new , 0 ) = − ( A x 0 + B y 0 + C z 0 + d ( A 2 + B 2 + C 2 ) / N ) (将 r 0 代入) = D − d ⋅ N D' = - (A x_{\text{new},0} + B y_{\text{new},0} + C z_{\text{new},0}) \\ = - (A x_0 + B y_0 + C z_0 + d(A^2 + B^2 + C^2)/N ) (将 r0 代入)\\ = D - d \cdot N D′=−(Axnew,0+Bynew,0+Cznew,0)=−(Ax0+By0+Cz0+d(A2+B2+C2)/N)(将r0代入)=D−d⋅N
因此,若原始平面方程为:
A x + B y + C z + D = 0 Ax + By + Cz + D = 0 Ax+By+Cz+D=0
则沿其法向量方向移动 d d d 个单位后的新平面方程为:
A x + B y + C z + ( D − d ⋅ A 2 + B 2 + C 2 ) = 0 Ax + By + Cz + (D - d \cdot \sqrt{A^2 + B^2 + C^2}) = 0 Ax+By+Cz+(D−d⋅A2+B2+C2)=0