Unity3D 控制物体旋转详解 —— 自身绕轴旋转缓慢旋转鼠标控制旋转欧拉数和四元数的关系

Posted wayne-tao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D 控制物体旋转详解 —— 自身绕轴旋转缓慢旋转鼠标控制旋转欧拉数和四元数的关系相关的知识,希望对你有一定的参考价值。


问题描述:昨天需要实现一个功能是根据指令左转90度或者右转90度,当时脑汁可能是有浆糊吧,居然要用直接赋值rotation,这样一来就要牵扯到eulerAngles和四元数的Euler函数了,结果忙活了好久没解决,bug层出,今天经过详细了解,解决了相关问题,一并把其他关于角度和旋转的知识点整理出来。


一、问题的解决:如何让物体绕自身轴旋转

直接上关键代码:

player_cube.Rotate(-90, 0, 0);

player_cube是获取的需要旋转的物体的Transform,其中-90意味着,在unity面板中 rotation 中的 x 减少90,从而实现旋转;

如果想让物体直接旋转多少度,这个是最方便快捷的方法!


二、缓慢旋转

 多见于FPS游戏中使用,用于转换摄像头角度,以下为自己以前做过的例子:(仅作参考)

//获取鼠标移动
mouse_move_velocity.y = Input.GetAxis("Mouse X");
mouse_move_velocity.x = -Input.GetAxis("Mouse Y");
//rote camera 
Vector3 target_angle = transform.rotation.eulerAngles + mouse_move_velocity; 
//限定角度
//调整周期,限定角度
if (target_angle.x > 180) target_angle.x -= 360;
if (target_angle.y > 180) target_angle.y -= 360;
target_angle = new Vector3(Mathf.Clamp(target_angle.x, X_min, X_max), Mathf.Clamp(target_angle.y, Y_min, Y_max), 0);
//转化四元角度
transform.rotation = Quaternion.Euler(target_angle);

对于限定角度的旋转实现


三、实现鼠标拖拽旋转

 以前的项目在另一个硬盘上,找不到相关的示例暂时,这里只说一下思路:

  1. 像第二部分说的那样,获取鼠标移动,当然要判断一下鼠标是否点击了要旋转的物体;
  2. 当获取到鼠标移动的时候,设置移动后所对应的旋转目标;
  3. 利用Rotate实现跟随旋转;
  4. 如果想有渐缓效果可以加额外的中间变量记录,从而达到缓慢的跟随效果,如果需要更精细,可以加animation;

四、欧拉数和四元数之间的千丝万缕

 最简单的对比就是,欧拉数是一个三维向量,在Unity的定义中就是个Vector3,而四元数顾名思义则是包含四个参数的量-Quaternion。

关于两者之间的转换:

private Quaternion quaternion;
private Vector3 transform_rotation;
public void Init()

    transform_rotation = quaternion.eulerAngles;
    quaternion = Quaternion.Euler(transform_rotation);

到这里其实就差不多能满足基本的旋转要求了,但是还有许多细节值得展开学习说明。比如四元数的本质,世界轴和自身轴,等等等等

2019/8/9 更新于鹏城实验室

以上是关于Unity3D 控制物体旋转详解 —— 自身绕轴旋转缓慢旋转鼠标控制旋转欧拉数和四元数的关系的主要内容,如果未能解决你的问题,请参考以下文章

unity 如何让物体绕自己的中心轴转

unity3d物体旋转

Unity3D 控制物体移动旋转缩放

unity3d小小白之代码控制物体通过键盘输入移动

Unity3D 在运行时实现物体的移动旋转伸缩控制

你好,请问在UNITY3D中如何实现用鼠标左键拖拽控制一个组合物体的旋转啊?