【问题标题】:Move object relative to camera move to wrong direction when rotate it相对于相机移动对象在旋转时移动到错误的方向
【发布时间】:2021-11-11 10:26:46
【问题描述】:

我正在尝试做的是相对于相机所面对的位置移动一个对象。

到目前为止,我写了这段丑陋的代码

private bool ApplyPan_XZ(Vector2 old0, Vector2 new0)
{
    Vector2 panDirection = old0 - new0;

    Vector3 newDirection = new Vector3(panDirection.x, 0f, panDirection.y);

    if (newDirection.magnitude < PanMagnitudeThreshold)
        return false;

    Vector3 movementX = myCamera.right * panDirection.x;
    Vector3 movementZ = myCamera.forward * panDirection.y;
    Vector3 movement = movementX + movementZ;
    movement.y = 0f;

    transform.Translate(panSpeed * Time.deltaTime * movement);

    return true;
}

基本上,我得到一个旧位置和一个新位置,我比较两个位置以获得方向,然后将结果轴乘以相机右侧和相机向前以获得相对位置。

到目前为止一切正常,除了我旋转变换时。在这种情况下,由于某种原因,移动被应用到前向对象,而不是相机。

我尝试了什么:

  • 使用transform.Translate 参数的最后一个 relativeTo => 我只需要在 x 和 z 轴上是相对的,这也适用于 y 轴
  • 更改/转换单词/本地位置,反之亦然

我想要完成的事情:

  • 始终相对于相机移动变换,即使我旋转它。

我尝试过的额外内容: Stuff More stuff

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    如果您说一般情况下,除非您旋转此对象,否则它会按预期运行:

    Translate 有一个可选参数Space relativeTo,默认情况下(如果未提供)为Space.Self

    应用相对于局部坐标系的变换。

    例如

    transform.Translate(Vector3.forward);
    

    等于使用

    transform.localPosition += Vecto3.forward;
    

    也可以

    transform.position += transform.forward;
    

    同时

    transform.Translate(Vector3.forward, Space.World);
    

    等于做

    transform.position += Vector3.forward;
    

    因此,如果您想忽略任何旋转和缩放,请改用全局 Space.World

    应用相对于世界坐标系的变换。

    transform.Translate(panSpeed * Time.deltaTime * movement, Space.World);
    

    也可以

    transform.position += panSpeed * Time.deltaTime * movement;
    

    【讨论】:

    • 设置 Space.World 工作。由于某种原因,我第一次尝试更改它没有用。谢谢!
    猜你喜欢
    • 2013-01-27
    • 2021-04-18
    • 1970-01-01
    • 2017-01-11
    • 2013-03-14
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多