You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何对3D坐标执行平移与旋转变换?含自定义坐标系约束需求

3D坐标变换:把点B移到原点并对齐其局部坐标系

嘿,我来帮你捋清楚这个问题!其实整个操作拆成平移旋转两步就很清晰了,完全能满足你的需求——把B挪到原点,同时让所有点(包括原来在原点的A)完成适配变换,还能遵守B的三个坐标系轴约束。

第一步:先平移,把B拉到原点

这一步是基础,没什么复杂的。对于所有点(A、B还有其他批量点),我们只需要给每个点的坐标都减去B的原始坐标就行。用公式表示的话,任意点P(x,y,z)平移后的坐标P_trans是:

P_trans = P - B
  • 原来的点B这么一算,直接就变成(0,0,0),完美达到第一个目标。
  • 初始在(0,0,0)的点A,平移后就变成(-B.x, -B.y, -B.z),自然就不在原点了,符合要求。

第二步:旋转对齐B的局部坐标系(x', y', z')

接下来处理B的三个轴向量约束。这里有个关键前提:你的x'、y'、z'得是正交且长度为1的向量(也就是标准的坐标系轴)。如果原始的三个向量不满足这个条件,得先做正交化(比如用Gram-Schmidt方法)和单位化处理,不然旋转之后会出现拉伸、扭曲的问题。

构建旋转矩阵

旋转矩阵的作用是把平移后的点,从原来的世界坐标系转换到以B为原点、x'/y'/z'为轴的坐标系(或者反过来,看你具体要对齐的方向)。

如果你的需求是让B的局部x'轴对齐世界X轴,y'对齐Y轴,z'对齐Z轴,那旋转矩阵R列向量就是单位化后的x'、y'、z':

R = [ x'_unit  y'_unit  z'_unit ]

这里的x'_unit就是x'向量除以它的长度,y'_unit和z'_unit同理。

应用旋转变换

对于平移后的点P_trans,旋转后的最终坐标P_final计算方式是:

P_final = R^T * P_trans

(这里用转置矩阵R^T是因为我们要把世界坐标系的点转换到B的局部坐标系;如果你是想把B的局部轴转到世界轴的方向,直接用R * P_trans就行,根据你的实际需求调整就行)

完整变换流程

把两步合起来,每个点的完整变换公式就是:

P_final = R^T * (P - B)

(或者R*(P-B),取决于你要的对齐方向)

额外提醒

  • 一定要先检查x'、y'、z'是否正交归一化!如果不是,先做Gram-Schmidt正交化,再把每个向量单位化,不然旋转会出问题。
  • 旋转矩阵是正交矩阵,它的逆矩阵等于转置矩阵,计算起来很方便,不用复杂的矩阵求逆。

内容的提问来源于stack exchange,提问作者Velexior

火山引擎 最新活动