Unity中左右手系转换

在unity上整了一个机器人位姿正解,unity的左手系带来了一定的麻烦。

坐标系设置:为了减少对Unity内坐标系的更改,DH参数正解时直接将y轴和z轴对调,就成了右手系,可以应用各种右手系的参数,后续要将计算结果转为Unity内左手系的话,对调回来就行。

位移和Scale这样操作是没有任何问题的,右手系的(1,0,1)放到unity里面就是(1,1,0),(a,b,c)转换下就是(a,c,b)。但是要表达旋转就比较麻烦,用欧拉角涉及到一个顺序的问题,相当麻烦,用四元数稍微好点,但是四元数在左右手系下也有所不同。

目前采用的方法如下:

首先在右手系下,把旋转矩阵转换为四元数表达:

 其中ε0123在右手系四元数里分别对应xyzw。这样计算出xyzw之后,再将其转为左手系:

 也就是只需要把z和y对调,然后w取相反数就行,从直觉上很好理解,由于左右手系角度的增量方向相反,左手系顺时针为正,右手系逆时针为正(轴垂直纸面向外),而w一定程度表示了旋转的角度,二者反一下就行了。实际上取(-x,-z,-y,w)也是一样的效果。

但是四元数存在一个没法表达绝对值≥180°的问题,超过180的好弄,减360就行,但等于180度也会出问题。好在工程上不要求什么绝对的等于,设置一个角度绝对值上限为179.99999就可以了。

### Unity右手坐标系左手坐标系之间的转换Unity 中,默认情况下使用的是左手坐标系。然而,在某些场景下,特别是当与其他软件(如 Blender 或者特定的游戏引擎)交互时,可能需要将数据从右手坐标系转换左手坐标系,反之亦然。 对于这种需求,并不存在官方推荐的专门插件来完成此操作;但是可以通过编写脚本来实现这一功能。下面是一个简单的 C# 方法,可以用来处理模型导入时的手动坐标系转换: ```csharp using UnityEngine; public static class CoordinateSystemConverter { public static Transform ConvertRightHandedToUnity(Transform transform) { Vector3 position = new Vector3(transform.localPosition.x, transform.localPosition.y, -transform.localPosition.z); Quaternion rotation = new Quaternion(-transform.localRotation.w, transform.localRotation.x, transform.localRotation.y, -transform.localRotation.z); transform.localPosition = position; transform.localRotation = rotation; foreach (Transform child in transform) { ConvertRightHandedToUnity(child); // 对子对象递归调用 } return transform; } } ``` 该方法会遍历传入变换节点及其所有后代节点,调整其位置向量 z 坐标并翻转四元数 w 和 z 分量以适应 Unity左手坐标表示法[^1]。 需要注意的是,上述代码片段仅适用于已加载至场景内的 GameObjects 上的应用程序内转换。如果要针对 Asset 导入过程中的自动转换,则需考虑创建自定义编辑器工具或修改现有的资产管道逻辑[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值