我将使用什么公式将速度与Unity的旋转相关联?

问题描述

我在Unity上乱七八糟,试图为基于物理的箭头创建脚本。 我的弧线正确,但在整个飞行过程中仍保持直线上升。 我正在尝试使用Quaternion.LookRotation来根据速度(R = 0 at V = Vinitial,R = 90 at V = 0,and R = 180 at V = -Vinitial)来更改其旋转度,但是我一直无法弄清楚我将使用什么公式。 任何帮助将不胜感激。

编辑

回复的帮助下,我得以按预期工作。如果有人偶然发现此寻求帮助,我的最终代码将如下所示:

private void Update()
{
    if (ForceSet)
    {
        ForceSet = false;
        initialVeLocity = rb.veLocity;
        EndAngleOffset = .33f * rb.veLocity.y;
    }
    if (stuckTarget == null)
    {
        Vector3 Forward;
        Vector3 Upward;
        if (rb.veLocity.y > 0)
        {
            Forward = new Vector3(rb.veLocity.x,-((-initialVeLocity.y + rb.veLocity.y - EndAngleOffset) * (-initialVeLocity.y + rb.veLocity.y - EndAngleOffset)),rb.veLocity.z);
            Upward = new Vector3(0,1,0);
        }
        else
        {
            Forward = new Vector3(rb.veLocity.x,((initialVeLocity.y + rb.veLocity.y + EndAngleOffset) * (initialVeLocity.y + rb.veLocity.y + EndAngleOffset)),-1,0);
        }
        rb.rotation = Quaternion.LookRotation(Forward,Upward);

}

(将发射力施加到“箭头”时,ForceSet设置为true)

解决方法

如果您有权访问箭头Rigidbody组件,则可以访问其velocity属性,并将其rotation设置为等于其velocity

我建议在使用Rigidbody方法对Rigidbody的变换进行修改时。这样可以确保使用Unity的物理系统正确更新值。

using UnityEngine;

public class ArrowBehaviour : MonoBehaviour
{
    private Rigidbody rigidbody;

    private void Awake()
    {
        rigidbody = GetComponent<Rigidbody>();
    }

    private void Update()
    {
        rigidbody.rotation = Quaternion.LookRotation(rigidbody.velocity,Vector3.up);
    }
}

根据情况,您可能需要将Update更改为FixedUpdate

编辑:

我修复了以上代码中的错误;那就是您在凌晨2点写的内容。我会再试一遍,看看是否适合您。

在理想的世界中,您将预先计算箭头的路径,以便可以对所需的箭头执行任何程序动画。

您还可以计算X旋转来代替,这会伪造效果。

using UnityEngine;

public class ArrowBehaviour : MonoBehaviour
{
    [SerializeField] private float lookMagnitude = 45.0f;
    [SerializeField] private float velocitySensitivity;

    private Rigidbody rigidbody;

    private void Awake()
    {
        rigidbody = GetComponent<Rigidbody>();
    }

    private void Update()
    {
        // Determine how much we want to fake the rotation by.
        var lookStrength = Mathf.InverseLerp(-velocitySensitivity,velocitySensitivity,rigidbody.velocity)

        var targetEulerAngles = new Vector3(
         Mathf.Lerp(-lookMagnitude,lookMagnitude,lookStrength),transform.localEulerAngles.y,transform.localEulerAngles.z
        );

        // Rotate the transform
        transform.localEulerAngles = targetEulerAngles;

        // Alternatively,interpolate to the target angle.
        /* transform.localEulerAngles = Vector3.Lerp(
         *  transform.localEulerAngles,*  targetEulerAngles,*  Time.deltaTime * rotationSpeed
         * );
         */
    }
}

,

只要获得变换旋转并将其设置为等于Quaternion.LookRotation(velocity)

,就可以了