坐标系转换

坐标系转换

原理

坐标空间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);
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值