【问题标题】:Unity AddRelativeForce lock axisunity AddRelativeForce 锁轴
【发布时间】:2020-06-12 22:14:43
【问题描述】:

我有一个自上而下的可变旋转相机。我正在尝试实现平移手势,以便相机在世界空间中的 x、z 平面内移动。我正在使用 AddRelativeForce,它工作得很好,但有一个不受欢迎的缩放副作用。我通过在加力后改变速度来解决这个问题(velocity.y=0)。这工作正常,但感觉有点脏,分两步做。它还需要一些管道来尊重来自其他来源的 y 速度。

所以我的问题是:这可以简化/改进吗?

Rigidbody rb = GetComponent<Rigidbody>();
rb.AddRelativeForce(new Vector3(-panGesture.DeltaX, 0, -panGesture.DeltaY) * Speed, ForceMode.Impulse);
rb.velocity = new Vector3(rb.velocity.x, 0, rb.velocity.z);

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    我将使用transform.TransformDirection 进行从相对世界到世界的转换,然后删除世界力量的y 组件。最后,您可以使用rb.AddForce 代替rib.AddRelativeForce

    Rigidbody rb = GetComponent<Rigidbody>();
    Vector3 relativeForceVec = new Vector3(-panGesture.DeltaX, 0f, -panGesture.DeltaY) * Speed;
    Vector3 worldForceVec = transform.TransformDirection(relativeForceVec);
    rb.AddForce(Vector3.Scale(worldForceVec, new Vector3(1f, 0f, 1f)), ForceMode.Impulse);
    

    【讨论】:

    • 谢谢,效果很好,只是我收到一个错误,即运算符 * 不能应用于 Vector3 和 Vector3。使用 Vector3.Scale 修复:rb.AddForce(Vector3.Scale(worldForceVec, new Vector3(1f, 0f, 1f)), ForceMode.Impulse);
    • @Fuczak 太棒了!感谢您的修复,这就是我在回答这个问题之前做着色器代码得到的:p
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多