【问题标题】:How to rotate character's head around the body's up and right vectors?如何围绕身体的上下矢量旋转角色的头部?
【发布时间】:2018-09-09 06:46:35
【问题描述】:

我正在编写一个第一人称射击风格的相机和角色控制器。我的角色模型是超级基本的——身体是矩形,头部是立方体。我的头部有一个关节,这样我就可以围绕那个关节旋转头部。在 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 ...

【问题讨论】:

  • 您的代码中transform 指的是什么对象?头,身体,整个角色……?
  • 整个角色。这是我角色的主要游戏对象。
  • 我刚刚更新了原始帖子以包含指向我的脚本代码的完整链接。我最初忘记包含它。

标签: c# unity3d


【解决方案1】:

你说你可以理解为什么会发生这种情况,但这里有一个 great post 在 gamedev.stackexchange 上关于这个主题。
这是一个快速修复:围绕身体向上向量水平旋转头部(在“身体空间”中)并围绕头部右向量垂直旋转头部(在“头部空间”中)。这里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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2015-09-25
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多