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
*
*/
}
}