Unity如何保存和加载物体的旋转

在上一篇文章中我使用了MessagePack For C#在Unity中实现了场景的保存和加载,其中存储了物体的Transform信息。

 

这里其实有2个坑需要说一说

1.Transform中的Position,Rotation,Scale三个属性其实都是结构体类型的,也就是

IObj.transform.position = 10; 这样赋值是错误的

IObj.transform.position = new Vector3(0,0,0); 这样赋值才是正确的

Position和Scale使用New一个Vector3的形式赋值就行,但是Rotation却是不行

2.IObj.transform.rotation 其实是一个四元数,什么是四元数?简单解释就是4个数来表示物体的旋转

IObj.transform.rotation = new Quaternion(0,0,0,0);  所以说需要这样赋值

那你可能会问,明明图上面显示的是3个数字,怎么又冒出了第四个数?

其实上面的Rotaiton属性框里面的3个数是四元数转换成欧拉角的表示形式。

简单理解就是,欧拉角的表示方便观察,四元数的形式方便计算

那到底要怎么获取物体的Rotation以欧拉角表示的这三个数呢,很简单

gameObject.transform.rotation.eulerAngles.x;

gameObject.transform.rotation.eulerAngles.y;

gameObject.transform.rotation.eulerAngles.z;

eulerAngle就是欧拉角的英文。

那获取了之后要怎么赋值给物体呢?

因为rotaiton是一个四元数,那就是说必须要四个数了,但是我们才获得了三个数啊,这样就好了:

IObj.transform.rotation = Quaternion.Euler(new Vector3(itemData.rotation_x[i], itemData.rotation_y[i], itemData.rotation_z[i]));

使用Quaternion.Euler()方法把前面获取到的代表物体的旋转的Vector3类型的欧拉角转换成四元数就OK了。

可能又有小伙伴要问,rotation本来就是四元数,那我直接获取物体的这个四元数,然后就可以赋值了,根本不需要转换啊,就像这样:

gameObject.transform.rotation.x;
gameObject.transform.rotation.y;
gameObject.transform.rotation.z;
gameObject.transform.rotation.w;

很遗憾,四元数确实可以获取,也确实可以赋值,但是会发生角度错乱。这里博主也还没有深入了解为什么,只是觉得可能是局部坐标和世界坐标的原因。如果有知道的小伙伴可以在下面留言。

放一个链接,对四元数和欧拉角的测试:https://blog.csdn.net/tianhunyishui/article/details/89372526

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值