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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_29412103/article/details/90489102

在上一篇文章中我使用了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

猜你喜欢

转载自blog.csdn.net/qq_29412103/article/details/90489102