unity3d - 同一角色多次旋转
问题描述
我有一个沿运动方向旋转的角色
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)
解决方案
正如我所知道的,你想要有两个旋转层 - 首先,你的角色看起来在运动方向。然后,您可以从鼠标输入中添加旋转。这样对吗?
如果是这样,我可以推荐的第一件事就是将你的角色分成两个对象。父变换将跟随您的移动。然后,它是孩子,将根据鼠标输入改变它的局部旋转。
对于后续旋转,恕我直言,最好的方法是处理向量,而不是四元数:
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);
然后您可以像您所做的那样将旋转应用于子对象(仅更改 - 应用为局部旋转)。
如果这种装备不适合您,您需要结合两个旋转。为此,再次处理向量。应用移动跟随旋转后,如上所述,添加如下内容:
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
. 请参阅您的本地变换轴。
推荐阅读
- ios - Tableview 单元格未按预期覆盖整个区域
- swift - iOS 在使用 NSAttributedString 时更改 uilabel 的链接颜色
- python - 避免在 tensorflow while_loop 中重新分配内存
- python - 如何将元素列表附加到数据框的单个特征中?
- sql - DB2 Toad 可视化表关系
- javascript - 如何通过过滤嵌套属性返回父对象
- .net - 如何使用 C#.NET 的 PEM 文件中的 P-256 密钥计算 ECDSA 签名?
- python - 烧瓶,从 app.route 内部重新读取 app.route 范围之外的 YAML
- node.js - 使用 jenkins 将节点应用程序部署到 docker 容器
- java - 为什么 EJB 注入在拦截器上不起作用?