同一角色多次旋转

multiple rotations on the same character

我有一个角色在运动方向旋转

var rot = (x, y, z); //motion vector
 rot.y = 0f;
 var movementRot = Quaternion.LookRotation(rot);
 transform.rotation = Quaternion.Lerp(transform.rotation, movementRot, Time.deltaTime * speedRot);}

我想旋转它的Y轴旋转,即使是鼠标的X轴

 loat r = Input.GetAxisRaw("Mouse X");
    float Xrot = Input.GetAxisRaw("Mouse X") * speedRotation;
    transform.Rotate(0, Xrot, 0);

这些方法单独使用但一起使用时却不起作用。 我已经尝试将 transform.Rotate 转换为四元数以进行乘法运算:

var Xrotation = Quaternion.Euler(0f, Xrot, 0f);
transform.rotation = Xrotation * movementRot;

结果是一个不自行旋转的角色(尝试时被保留)。 我尝试了逆并将四元数转换为度数以添加到变换中。旋转。但它没有帮助:

float angle = Quaternion.Angle(transform.rotation, movementRot)//The result is perfect is on its own on transform.Rotate it works

transform.Rotate(0,f angle + Xrot, 0f); //Together, however, the character rotates at times and turns, on itself only to one side

有谁知道怎么做..? (或者如果可以的话 xd)

据我所知,你想要两个旋转层 - 首先,你的角色看起来在移动方向。然后,您可以通过鼠标输入添加旋转。对吗?

如果是这样,我首先推荐的是将您的角色分成两个 object。 Parent 变换将跟随您的移动。然后,它child,会根据鼠标输入改变它的局部旋转。

对于 follow-course 旋转,恕我直言,最好的方法是处理向量,而不是四元数:

transform.forward = movementVector;

如果您需要更顺畅的跟随,可以这样做:

float rotationSpeed = 0.5f;
        transform.forward = Vector3.RotateTowards(transform.forward, movementVector, rotationSpeed * Time.deltaTime, 0);

float rotationSpeed = 1f;
transform.forward = Vector3.Lerp(transform.forward, movementVector, rotationSpeed * Time.deltaTime);

然后您可以像以前一样将旋转应用到 child object(仅更改 - 应用为局部旋转)。

如果这种钻机不适合您,您需要结合两个旋转。为此,再次处理矢量。如上所述应用 movement-follow 旋转后,添加如下内容:

float Xrot = Input.GetAxisRaw("Mouse X") * speedRotation;
transform.forward += transform.right * Xrot * Time.deltaTime;

注意两点:

  • 在这种情况下,speedRotation可能要小很多。您甚至可以将它乘以 0.1f。
  • transform.righttransform.forward可以根据你的性格不同,也许,你需要使用transform.up,或者-transform.forward。查看您的局部变换轴。