本篇文章和上篇文章相似都是做物体的运动,难点在于怎样找到物体旋转所要绕的是哪个方向上的轴。
比如鼠标横着划过,那么物体应该绕的是竖直方向上的轴;如果鼠标从左上划向右下,那么物体绕的就应该是从右上到左下方向上的轴。
总结一下即是物体旋转绕轴方向应该是垂直于鼠标划动方向,重点就是求出这个方向。
同样需要声明两个变量来储存鼠标移动时在屏幕上X方向Y方向的偏移量
float yRotation = 0f;
float xRotation = 0f;
由于需要实现物体随时间慢慢停下来的效果所以需要再声明一个变量储存鼠标划动的距离
float mouseDistance;
需要计算方向,声明两个三维向量,一个储存鼠标划动的方向,一个储存旋转绕轴的方向
Vector3 mouseDirection = Vector3.zero;
Vector3 rotationDirection = Vector3.zero;
然后在鼠标左键按下去的时候开始记录位移偏移量
yRotation = Input.GetAxis("Mouse Y");
xRotation = Input.GetAxis("Mouse X");
并且以此计算出鼠标划动的方向,因为是基于平面的(Z轴为0)所以记录鼠标划动方向的三维向量应该是
mouseDirection = new Vector3(xRotation, yRotation, 0);
那么鼠标划动的距离就可以这样计算出来
mouseDistance = Vector3.Magnitude(mouseDirection)*10;//该函数用于求三维向量的大小
重点来了,其实数学学的好的话,可以很明了的明白如何求出该方向向量,在这里我们用到了空间向量的叉乘,即通过表示鼠标划动方向的三维向量叉乘垂直于屏幕方向的三维向量,得出一条垂直于两者的三位向量
rotationDirection = Vector3.Cross(mouseDirection, Vector3.forward); //该函数用于求三维向量的叉乘
当鼠标左键松开之后物体开始旋转并且越转越慢最后停止。这个效果通过使上边得到的鼠标划动的距离慢慢减小实现
mouseDistance = Mathf.Clamp(mouseDistance-=0.1f, 0, Mathf.Infinity);//该数学函数表示的意思可以上圣典查,大致就是限制第一个参数处于第二个和第三个之间
一切计算妥当之后,最后的旋转实现如下
transform.Rotate(rotationDirection, mouseDistance, Space.World);
OK!脚本写好,建一个cube,附上脚本,运行Unity,按着鼠标左键划动鼠标松开之后就可以实现所要效果啦~