如何计算物体在给定点处步进的3d投影角度?

时间:2016-09-18 15:55:34

标签: math unity3d physics game-physics projectile

我需要计算在给定速度下通过球在该方向上的角度以及投掷后应落地的角度。

水平角度很容易(我们知道起点和步点)。如何计算投影的垂直角度。对物体施加肉汁。

根据视频,旅行时间通常为保龄球时间(球释放和发生步骤之间的时间)。

有没有直接在unity3d的方式?

观看this视频8秒,以明确了解此问题。

1 个答案:

答案 0 :(得分:1)

根据维基百科页面Trajectory of a projectile,“达到的角度”(您想知道的角度)计算如下:

θ= 1/2 * arcsin(gd/v²)

在这个公式中,g是引力常数9.81,d是你希望抛射物行进的距离,v是投掷物体的速度。

计算此代码的代码可能如下所示:

float ThrowAngle(Vector3 destination, float velocity)
{
    const float g = 9.81f;
    float distance = Vector3.Distance(transform.position, destination);
    //assuming you want degrees, otherwise just drop the Rad2Deg.
    return Mathf.Rad2Deg * (0.5f * Asin((g*distance)/Mathf.Pow(velocity, 2f)));
}

如果你的游戏中没有空气阻力等,这将给你一个角度。 如果您的目的地和“投掷点”不在同一高度,您可能需要先将两者都设置为y = 0,否则可能会出现错误。

修改

考虑到您的发布点高于目标位置,同一页面中的此公式应该有效:

θ= arctan(v²(+/-)√(v ^ 4-g(gx²+2yv²))/ gx)

这里,x是范围或距离,y是海拔高度(相对于发射点)。

代码:

float ThrowAngle(Vector3 start, Vector3 destination, float v)
    {
        const float g = 9.81f;
        float xzd = Mathf.Sqrt(Mathf.Pow(destination.x - start.x, 2) + Mathf.Pow(destination.z - start.z, 2));
        float yd = destination.y - start.y;
        //assuming you want degrees, otherwise just drop the Rad2Deg. Split into two lines for better readability.
        float sqrt = (Mathf.Pow(v,4) - g * (g*Mathf.Pow(xzd,2) + 2*yd*Mathf.Pow(v,2))/g*xzd);
        //you could also implement a solution which uses both values in some way, but I left that out for simplicity.
        return Mathf.Atan(Mathf.Pow(v, 2) + sqrt);
    }