弓箭弹道计算

public class BallisticAlgorithms
{

    public static float NormalBallistic(float V, Vector3 StartPoint, Vector3 EndPoint)
    {
        float angleX;
        float distX = Vector2.Distance(new Vector2(EndPoint.x, EndPoint.z), new Vector2(StartPoint.x, StartPoint.z));
        float distY = EndPoint.y - StartPoint.y;
        float posBase = (Physics.gravity.y * Mathf.Pow(distX, 2.0f)) / (2.0f * Mathf.Pow(V, 2.0f));
        float posX = distX / posBase;
        float posY = (Mathf.Pow(posX, 2.0f) / 4.0f) - ((posBase - distY) / posBase);
        if (posY >= 0.0f)
        {
            angleX = Mathf.Rad2Deg * Mathf.Atan(-posX / 2.0f - Mathf.Pow(posY, 0.5f));
        }
        else
        {
            //angleX = 45;
            angleX = Mathf.Rad2Deg * Mathf.Atan(-posX / 2.0f - Mathf.Pow(posY, 0.5f));
        }

        if (float.IsNaN(angleX))
        {
            angleX = 45;
        }
        return angleX;
    }


    public static float HighestBallistic(float V, Vector3 StartPoint, Vector3 EndPoint, Vector3 CameraPos, float TanZ)
    {
        /*
        float angleX = 0;

        float distX = Vector2.Distance(new Vector2(EndPoint.x, EndPoint.z), new Vector2(StartPoint.x, StartPoint.z));
        float distY = EndPoint.y - StartPoint.y;
        float a = distX * Mathf.Sin(AngleThreePoint(StartPoint, EndPoint, CameraPos));
        */


        float Ez = Vector2.Distance(new Vector2(EndPoint.x, EndPoint.z), new Vector2(CameraPos.x, CameraPos.z));

        float K = (0 - Ez) / (CameraPos.y - EndPoint.y);

        float Py = TanZ * (0 - 3.3f) + (CameraPos.y - StartPoint.y) - TanZ * TanZ * (EndPoint.y) / (1 - TanZ * TanZ);
        Py = ((CameraPos.y - StartPoint.y) - K * (-3.3f)) / (1 - K * K);

        return Py;

        /* 坐标全部转换到 相机矩阵,相机为原点。 则目标直线 为 Z轴平面上一条线。
        *未知参数 角A 上下的角  角B  左右的角 
        *
        *射线终点E(Ex,Ey,Ez) 相机点为 C() 水平面 距离 distX
        *相机水平的角度。即 相机到射线终点的水平角度 Rce
        *
        *假设最高点PM(Px,Py,Pz) 其中 高度为Py 起点为St(Sx,Sy,Sz) 速度V 发射角度 A(Y轴) ,B(Z轴);
        *则  Px Pz满足公式 (Py-Cy)/(Cy-Ey)  = (Px-Cx)/(Cx-Ex)  =  (Pz-Cz)/(Cz-Ez)
        * (Py-Cy)*(Cx-Ex)/(Cy-Ey) + Cx= Px
        * (Py-Cy)*(Cz-Ez)/(Cy-Ey) + Cz= Pz
        * 
        * 
        * flaot K =(Cz-Ez)/(Cy-Ey)
        * 
        * Py = (Cy - Sy) + K*(Pz-Sz)
        *    = (Cy - Sy) + K*((Py-Cy)*K + Cz-Sz)
        *    = (Cy - Sy) + K^2*(Py-Cy)+   K*( Cz-Sz)
        *              = (Cy - Sy) + K^2*(Py)-K^2*Cy + K*( Cz-Sz) 
        * Py - K^2*(Py)= (Cy - Sy)          -K^2*Cy + K*( Cz-Sz) 
        * Py = ((Cy - Sy)+ K*( Cz-Sz) -Cy*K^2)/(1-k^2)
        * 


        *Vy = V*SinA 
        *Vx = V*CosA
        *T = V*SinA/g 
        *Py = Sy + Vy*T = Sy+ V*SinA*V*SinA/2g 
        * (Px-Sx)^2 +(Pz-Sz)^2    = (V*CosA* V*SinA/g )^2



        *Dx= S到直线 CPM直线 水平投影的 垂线 即 
        *  float Ds2l = distX * Mathf.Sin(AngleThreePoint(StartPoint, EndPoint, CameraPos));
        *
        *知道Px 
        *
        */


    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值