当前位置: 首页 > news >正文

平面方程在不同坐标系下的变换与平移

平面方程在不同坐标系下的变换

已知条件:

  1. 在世界坐标系中,平面的一般方程为:
    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 表示该平面到原点的有向距离(即带符号的距离)。
  2. 世界坐标系下的点 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 pwR3:世界坐标系中的点(3×1 向量);
    • p c ∈ R 3 \mathbf{p}_c \in \mathbb{R}^3 pcR3:相机坐标系中的点(3×1 向量);
    • R ∈ R 3 × 3 \mathbf{R} \in \mathbb{R}^{3\times3} RR3×3:旋转矩阵,表示从相机坐标系到世界坐标系的旋转;
    • t ∈ R 3 \mathbf{t} \in \mathbb{R}^3 tR3:平移向量,表示相机在世界坐标系中的位置。

目标:

将世界坐标系下的平面方程转换为相机坐标系下的表达式。


方法一:

表达一个平面方程只需要确认法向量和D值,因此为了将这个平面方程转换到相机坐标系下,我们需要做的是:

  1. 变换平面的法向量:因为旋转矩阵 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

  2. 计算新的 D ′ D' D:由于平面的位置也受平移的影响,所以我们还需要调整 D D D 值。首先,考虑平面上的一点 p \mathbf{p} p,它满足原始的平面方程。该点在相机坐标系中的位置可以通过 p ′ = R T ( p − t ) \mathbf{p'} = R^T(\mathbf{p} - t) p=RT(pt) 来计算。然后,利用新坐标系下的平面方程 n ′ ⋅ p ′ + D ′ = 0 \mathbf{n'} \cdot \mathbf{p'} + D' = 0 np+D=0,我们可以解出 D ′ D' D。但是,直接计算 D ′ D' D 更简单的方式是注意到 D = − n ⋅ p D = -\mathbf{n} \cdot \mathbf{p} D=np,因此在变换后我们有:
    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)=nRTt

总结起来,给定世界坐标系下的平面方程 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=nRTt

最终,在相机坐标系下的平面方程为 A ′ x + B ′ y + C ′ z + D ′ = 0 A'x + B'y + C'z + D' = 0 Ax+By+Cz+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 Axc+Byc+Czc+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+6z12=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= 010100001 ,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=R1,所以:

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= 010100001

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 = 02+13+0612+03+0602+03+16 = 326

步骤二:计算 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]=21+32+63=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 3xc2yc+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、具体推导过程
  1. 任取平面上的一点

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


  1. 构造向量 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 =(x0x1, y0y1, z0z1)


  1. 向量在法向量上的投影长度(即点到平面的有向距离)

投影公式是:

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(x0x1)+B(y0y1)+C(z0z1)=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+C2 Ax0+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=D4A2+B2+C2

符号取决于你希望平面是朝法向量方向移动(−),还是反方向移动(+):

  • 若沿法向量方向移动(即从原点往法向量方向移动平面),使用 减号

    D ′ = D − 4 ⋅ A 2 + B 2 + C 2 D' = D - 4 \cdot \sqrt{A^2 + B^2 + C^2} D=D4A2+B2+C2

  • 若沿法向量相反方向移动,使用 加号

    D ′ = D + 4 ⋅ A 2 + B 2 + C 2 D' = D + 4 \cdot \sqrt{A^2 + B^2 + C^2} D=D+4A2+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} r new=r +dn^

也就是说,原来的点 r ⃗ 0 \vec{r}_0 r 0 移动后变成:

r ⃗ new , 0 = r ⃗ 0 + d ⋅ n ^ \vec{r}_{\text{new}, 0} = \vec{r}_0 + d \cdot \hat{n} r new,0=r 0+dn^

代入到新的平面方程中,得到新的常数项:

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代入)=DdN


因此,若原始平面方程为:
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+(DdA2+B2+C2 )=0


相关文章:

  • Ubuntu 配置使用 zsh + 插件配置 + oh-my-zsh 美化过程
  • TongWeb7.0动态密钥说明
  • 设计一个算法:删除非空单链表L中结点值为x的第一个结点的前驱结点
  • 【LLM】fast-api 流式生成测试
  • 计算机是如何⼯作的
  • Day15
  • 长期施肥下红壤温湿度及电导率数据集
  • 【HarmonyOS 5】运动健康开发实践介绍以及详细案例
  • 篇章十 数据结构——Java对象的比较
  • 【Linux庖丁解牛】—系统文件I/O !
  • springCloud2025+springBoot3.5.0+Nacos集成redis从nacos拉配置起服务
  • 基于Java Swing的办公自动化系统设计与实现:附完整源码与论文
  • 创建一个纯直线组成的字体库
  • DenseNet算法 实现乳腺癌识别
  • 算法练习-回溯
  • 【题解-洛谷】P10448 组合型枚举
  • 学而思网校发布AI编程新品,四重升级培育未来创新人才
  • Vue 中 v-show 与 v-if 的深度对比与性能分析
  • 第二十六章 流程控制: case分支
  • 乐观锁与悲观锁的实现和应用
  • 邢台经济开发区网站/网络营销品牌推广
  • wordpress 设置版权/seo优化代理
  • 广西网站建设营销公司/百度极速版推广
  • easyui做网站/网络营销的手段包括
  • 旅游公司网站 优帮云/关键词排名查询软件
  • 做伊朗的外贸公司网站/在线制作网页网站