原理
坐标空间C的3个坐标轴在父坐标空间P下表示 Xc 、Yc 、Zc,即其原点位置Oc,给定一个子坐标空间中的一点Ac = (a,b,c), 我们可以等到父亲空间坐标系下位置Ap:
Ap = Oc + a * Xc + b * Yc + c * Zc;
利用矩阵变化的原理可以得到以下源码(Unity环境下)
源码
/// <summary>
/// 坐标轴转换 目标坐标轴下的点 转换到原坐标轴下
/// </summary>
/// <param name="original">目标坐标轴下的点</param>
/// <param name="axisPoint">目标坐标轴原点在原坐标轴下的坐标</param>
/// <param name="xAxis">目标坐标在原坐标轴下的X轴表示</param>
/// <param name="yAxis">目标坐标在原坐标轴下的Y轴表示</param>
/// <param name="zAxis">目标坐标在原坐标轴下的Z轴表示</param>
/// <returns>在 原坐标轴下 的坐标</returns>
public static Vector3 ChangeAxis(Vector3 original, Vector3 axisPoint, Vector3 xAxis, Vector3 yAxis, Vector3 zAxis)
{
Vector4 column0 = new Vector4(xAxis.x, yAxis.x, zAxis.x, axisPoint.x);
Vector4 column1 = new Vector4(xAxis.y, yAxis.y, zAxis.y, axisPoint.y);
Vector4 column2 = new Vector4(xAxis.z, yAxis.z, zAxis.z, axisPoint.z);
Vector4 column3 = new Vector4(0, 0, 0, 1);
Matrix4x4 ma4 = new Matrix4x4(column0, column1, column2, column3);
Vector4 originalV4 = new Vector4(original.x, original.y, original.z, 1);
Vector4 outPoint = ma4 * originalV4;
return new Vector3(outPoint.x, outPoint.y, outPoint.z);
}
/// <summary>
/// 左右手坐标系转换
/// </summary>
/// <param name="original"></param>
/// <returns></returns>
public static Vector3 LeftToRightAxis(Vector3 original)
{
return Tools.ChangeAxis(original, Vector3.zero, Vector3.left, Vector3.up, Vector3.forward);
}
|