同一角色多次旋转
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.right
和transform.forward
可以根据你的性格不同,也许,你需要使用transform.up
,或者-transform.forward
。查看您的局部变换轴。
我有一个角色在运动方向旋转
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.right
和transform.forward
可以根据你的性格不同,也许,你需要使用transform.up
,或者-transform.forward
。查看您的局部变换轴。