如何将世界空间位置转换为基于旋转的局部空间位置
如何将世界空间位置转换为基于旋转的局部空间位置
假设我们有一个世界空间中的点P,示意图如下:
现在我想把这个点转换到另一个叫“L”的局部空间里。这个局部空间L由两个核心部分定义:
- 它在世界空间中的中心点C
- 由三个单位向量组成的旋转朝向R(也就是局部空间的三个坐标轴在世界空间中的方向)
接下来咱们一步步说怎么完成转换:
第一步:平移到局部空间原点
首先得把世界空间的点P,平移到以局部空间L的中心点C为原点的临时空间里,计算方式很简单:P' = P - C
这一步就是把坐标系的原点从世界原点挪到C的位置,所以用P的坐标减去C的坐标就行,非常直观。
第二步:旋转到局部坐标系
接下来要把平移后的点P'转换到局部空间的坐标轴方向上。这里的旋转矩阵R是由局部空间三个坐标轴的世界空间单位向量组成的(通常是列向量形式),因为旋转矩阵是正交矩阵,它的转置就等于逆矩阵,所以我们用R的转置矩阵来乘P',就能得到局部空间中的位置L_P:L_P = R^T * P'
举个小例子验证一下:如果局部空间L和世界空间完全重合,那C就是(0,0,0),R就是单位矩阵,转置后还是单位矩阵,算出来的L_P就等于P,完全符合咱们的预期。
另外提一句,要是你用的是Unity、Unreal这类3D引擎,其实不用手动算这些,引擎已经帮你封装好了现成的方法,比如Unity里的Transform.InverseTransformPoint(P),Unreal里的UKismetMathLibrary::InverseTransformLocation(LTransform, P),直接调用就能得到结果啦。
备注:内容来源于stack exchange,提问作者TheChamp




