在Unity中利用刚体RigidBody
使物体运动是非常容易的事,但是有时有时不希望物体倒下,这就要复杂一些,因为Unity使用四元数Quaternion
来表示旋转。
但其实四元数也不算难
先上代码,将这段代码放在Update()
函数中
1 2 3 4 5 6 7 8 9 10 11 12
| var dst_quaternion = transform.rotation; var angle = Mathf.Acos(dst_quaternion.w); if(dst_quaternion.y < 0) { angle = -angle; } var sin_value = Mathf.Sin(angle); dst_quaternion.z = 0; dst_quaternion.y = sin_value; dst_quaternion.x = 0;
transform.rotation=dst_quaternion;
|
解释
四元数的一种几何解释是如果物体围绕一个轴 (ax,ay,az) 旋转 θ ,那么四元数为
{x,y,z,w}={ax⋅sin(2θ),ay⋅sin(2θ),ay⋅sin(2θ),cos(2θ)}
将 2θ 看做一个整体为 angle ,又因为一开始物体是正的,相应旋转轴为 (0,1,0) 注且Unity中的角度 ∈[−2π,2π] ,而 {y∣y=arccos(x),x∈[−1,1]}=[0,π]
angle={arccos(w)−arccos(w)θ≥0 Also y≥0θ≤0 Also y≤0
为使旋转轴始终为y轴,那么
(ax,ay,az)=(0,1,0)
相应的四元数为
{0,sin(2θ),0,w}={0,sin(angle),0,w}
进一步,设置一个插值可以让物体运动得更自然
1
| transform.rotation = Quaternion.Lerp(transform.rotation,dst_quaternion,Time.deltaTime*4);
|
注:其实初始时四元数为{0,0,0,1},这时这种几何解释是有问题的,但经过这个变换后答案仍然正确
参考资料
四元数与三维旋转
Microsoft Docs