Unity 抛物线 弹道(一)

已知目的地,高度差,重力 

1.根据发射角度,求初速度

 Wiki公式

推导出V

 

    public static float LaunchSpeed(float distance, float yOffset, float gravity, float angle)
    {
        float speed = (distance 
            * Mathf.Sqrt(gravity) 
            * Mathf.Sqrt(1 / Mathf.Cos(angle)))
            / Mathf.Sqrt(2 * distance * Mathf.Sin(angle) + 2 * yOffset * Mathf.Cos(angle));

        return speed;
    }

2.根据发射速度,求角度 

 Wiki地址

 注意根号不能为负数,也就是初始速度不足以到达目的地

求解会得到两个角度,一般都用小的角度

    public static bool LaunchAngle(float speed, float distance, float yOffset, float gravity, out float angle0, out float angle1)
    {
        angle0 = angle1 = 0;

        float speedSquared = speed * speed;

        float operandA = Mathf.Pow(speed, 4);
        float operandB = gravity * (gravity * (distance * distance) + (2 * yOffset * speedSquared));

        // Target is not in range
        if (operandB > operandA)
            return false;

        float root = Mathf.Sqrt(operandA - operandB);

        angle0 = Mathf.Atan((speedSquared + root) / (gravity * distance));
        angle1 = Mathf.Atan((speedSquared - root) / (gravity * distance));

        return true;
    }

3.得到飞行总时间

Wiki地址

    public static float TimeOfFlight(float speed, float angle, float yOffset, float gravity)
    {
        float ySpeed = speed * Mathf.Sin(angle);

        float time = (ySpeed + Mathf.Sqrt((ySpeed * ySpeed) + 2 * gravity * yOffset)) / gravity;

        return time;
    }

 PS:我们需要把先distance投影到平面,注意GIF上的红线和白线

    public static Vector3 ProjectVectorOnPlane(Vector3 planeNormal, Vector3 vector)
    {

        return vector - (Vector3.Dot(vector, planeNormal) * planeNormal);
    }

 标 准 结 局

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Unity是一款强大的游戏开发引擎,支持创建各种3D和2D游戏。在Unity中,要创建抛物线效果的网格(mesh),可以使用以下步骤: 1. 首先,在Unity中创建一个空物体作为抛物线网格的父物体。 2. 在该空物体上添加一个Mesh Filter(网格过滤器)组件,并设置其Mesh属性为一个新创建的Mesh实例。 3. 继续在该空物体上添加一个Mesh Renderer(网格渲染器)组件,这样就可以在游戏场景中看到抛物线网格的显示效果。 4. 在代码中,先创建一个空的Mesh实例,并获取其顶点、法线、三角形索引等属性的引用。 5. 使用for循环来生成抛物线上的顶点位置。 6. 将顶点位置数据赋值给Mesh实例的vertices属性。 7. 计算并赋值Mesh实例的法线数据,以确保抛物线网格正确渲染光照效果。 8. 生成并赋值Mesh实例的三角形索引数据,用于指定顶点之间的连接顺序。 9. 调用Mesh实例的RecalculateBounds()方法来重新计算其边界,以确保抛物线网格在场景中正确显示。 10. 使用Mesh Filter组件的sharedMesh属性引用生成的Mesh实例,进而实现抛物线网格的显示。 通过以上步骤,我们可以在Unity中创建一个抛物线的网格。这个网格可以用于渲染游戏场景中的物体,或者用于创建一些特殊的游戏效果,如飞行轨迹、弹道轨迹等。而Mesh这个类则是Unity中用于创建和操纵网格的重要组件,通过设置其顶点、法线、纹理等属性,我们可以根据需求生成不同形状和效果的网格。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值