Rotate(Vector3 axis, float angle,Space relativeTo);轴角旋转的坑

测试该函数用法:public void Rotate(Vector3 axis, float angle, [DefaultValue(“Space.Self”)] Space relativeTo);
(1)第一种旋转方式:旋转轴new Vector3(0,1,0),绕轴每秒旋转10度,坐标系:世界。

Rotate(Vector3.up, Time.DeltaTime10,  Space.World);

在世界系下,Vector3.up=(0,1,0)可以认为是世界坐标下的(0,1,0),表示绕世界系(0,1,0)轴旋转,
(1)第二种旋转方式:旋转轴new Vector3(0,1,0),绕轴每秒旋转10度,坐标系:物体。

Rotate(Vector3.up, Time.DeltaTime10,  Space.Self);

自身系下,Vector3.up=(0,1,0)可以认为是自身系坐标表示,表示绕物体自身(0,1,0)轴旋转
(1)第三种旋转方式:旋转轴transform.up,绕轴每秒旋转10度,坐标系:世界。

Rotate(transform.up, Time.DeltaTime10,  Space.World);

坑:transform.up是物体的y轴,但是transform.up的坐标是在世界坐标下表示的。
世界系下,绕世界系坐标为transform.up的轴旋转。
(1)第四种旋转方式:旋转轴axis,绕轴每秒旋转10度,坐标系:自身。

Vector3 axis=transform.worldToLocalMatrix.MultiplyPoint(transform.up);
Rotate(axis, Time.DeltaTime10,  Space.Self);

坑:因为transform.up是世界系坐标,这里的axis需要的是自身系的坐标,所以旋转轴是transform.up,要将transform.up进行坐标变换成transform.worldToLocalMatrix.MultiplyPoint(transform.up)才行。
总结:Space为World的,旋转轴一定是世界系表示的坐标;Space为Self的,旋转轴一定是self系表示的坐标,不是的要变过来。

你可能感兴趣的:(unity3d游戏开发)