如何围绕身体的上下左右矢量旋转角色的头部?

时间:2018-09-08 19:39:51

标签: c# unity3d

我正在编写第一人称射击风格的相机和角色控制器。我的角色模型非常基础-它是用于身体的矩形和用于头部的立方体。我的头部只有一个关节,因此我可以围绕该关节旋转头部。在Unity中,我已经将相机锁定在头部,这样无论指向哪个头部,相机都可以看到。

我有一个C#脚本,在其中我执行所有字符和头部移动的平移和旋转。我通过Unity编辑器提供了我的头部Transform脚本。

我的问题是,每当我在垂直和水平方向旋转头部时,头部都会开始滚桶运动。头部将倒置,或者实际上处于任何方位。我能理解为什么-如果我向左看然后向上看,那么随后又向右看会导致头部旋转成真实头部的奇数方向-它会开始执行滚桶动作。

我试图更改代码,以使其“旋转”角色身体的左右矢量,但这似乎并没有改变。我仍然经历着滚滚滚滚的事情。

我还尝试将相对空间从自我改变为世界,只要我的角色在世界上直立就可以“修正”它。如果我的角色开始旋转,那么头部旋转就会看起来很奇怪。

如何限制我的头部只能绕角色的向上和向右旋转?我的角色是上下颠倒,侧面颠倒等等都不重要,头部旋转应如您所愿左右旋转。

这是我的代码,对头部关节进行旋转。 HeadJoint是移动头部的联合变换。 transform是角色的变形。在这段代码中,我尝试绕着角色的上下矢量旋转头部,但这似乎仍会产生桶形滚动效果...

private void ApplyHeadVerticalRotation()
{
    var amountX = (-Input.GetAxis("Mouse Y")) * Time.deltaTime * RotationSpeed;

    HeadJoint.Rotate(transform.right, amountX);
}

private void ApplyHeadHorizontalRotation()
{
    var amountY = Input.GetAxis("Mouse X") * Time.deltaTime * RotationSpeed;

    HeadJoint.Rotate(transform.up, amountY);
}

编辑:

我打算在脚本的代码中包含this link ...

1 个答案:

答案 0 :(得分:3)

您说您可以理解为什么会发生这种情况,但这是关于gamedev.stackexchange上这个主题的great post
这是一个快速解决方案:将头围绕身体向上矢量水平旋转(在“身体空间”中),并围绕头右矢量垂直旋转头部(在“头部空间”中)。这里的headbody的子代。

public Transform body;
public Transform head;   

public float rotationSpeed; 

void Update()
{
    var amountX = (-Input.GetAxis("Mouse Y")) * Time.deltaTime * rotationSpeed;
    var amountY =   Input.GetAxis("Mouse X")  * Time.deltaTime * rotationSpeed;

    head.Rotate(body.up,    amountY, Space.World);        
    head.Rotate(head.right, amountX, Space.World);
}