Veteran Member
05-22-2021
, 11:51
X Y Problem Projectile motion
#1
I am trying to code a mortar device to target enemies behind a wall or not behind anything, so far i am failing bad with the calculations...
Knowing the two kinematics formulas that i do need to use they're..
Velo (Final) = Velo (Initial) + ( [acceleration or gravity] * time )
distance = Velo(Initial) * time + 0.5 * [acceleration or gravity] * tiime ^ 2.0
Here's the code where i am trying to calculate the initial velocity in order for the projectile to bypass the wall or to hit its target.
code
PHP Code:
bool: mortar_get_target_info ( mortar , target , & Float : flInitalVelo = 0.0 , & Float : fMortar_X_Angle = 0.0 , & Float : fMortar_Y_Angle = 0.0 ) { static iTr2 , bool : bPotentialHIT = false , Float : fStart [ 3 ], Float : fEnd [ 3 ], Float : fWallDistance , Float : fAngle , Float : fVecTemp [ 3 ], Float : flFraction , Float : fVecDest [ 3 ], Float : fVecTempEnd [ 3 ], Float : fWallHeight , Float : fVecTargetPos [ 3 ]; iTr2 = create_tr2 (); bPotentialHIT = false ; fMortar_X_Angle = 0.0 ; fMortar_Y_Angle = 0.0 ; flInitalVelo = 0.0 ; engfunc ( EngFunc_GetBonePosition , mortar , MORTAR_BARREL_BOLT_BONE , fStart , fVecTemp ) pev ( target , pev_origin , fEnd ); xs_vec_copy ( fEnd , fVecTargetPos ); // Checking if there's a wall between for(new i ; i < 20 ; i ++) { engfunc ( EngFunc_TraceLine , fStart , fEnd , IGNORE_MONSTERS | IGNORE_MISSILE , mortar , iTr2 ); #if defined DEBUG_FOLLOWING beam_bet_2origin ( fStart , fEnd ); #endif get_tr2 ( iTr2 , TR_flFraction , flFraction ); // We probably can land a hit on the target if( flFraction >= 0.9 ) { pev ( target , pev_origin , fVecTemp ); engfunc ( EngFunc_TraceLine , fEnd , fVecTemp , IGNORE_MONSTERS | IGNORE_MISSILE , target , iTr2 ); get_tr2 ( iTr2 , TR_flFraction , flFraction ); #if defined DEBUG_FOLLOWING beam_bet_2origin ( fEnd , fVecTemp ); #endif if( flFraction >= 0.9 ) { xs_vec_sub ( fEnd , fStart , fVecTemp ); xs_vec_normalize ( fVecTemp , fVecDest ); vector_to_angle ( fVecDest , fVecDest ); xs_vec_sub ( fVecTargetPos , fStart , fVecTemp ); fMortar_X_Angle = fVecDest [ 0 ]; fMortar_Y_Angle = fVecDest [ 1 ]; if( flInitalVelo == 0.0 ) { fWallHeight = fVecTargetPos [ 2 ] - fStart [ 2 ]; fWallDistance = xs_vec_len_2d ( fVecTemp ); flInitalVelo = floatsqroot ( floatabs (( fWallDistance * 800.0 ) / ( (( fWallHeight * ( floatcos ( fMortar_X_Angle )^ 2.0 / fWallDistance )) - ( floatcos ( fMortar_X_Angle )* floatsin ( fMortar_X_Angle ))) * 2.0 ))); client_print ( 0 , print_chat , "flInitalVelo: %.2f AngleX: %.2f distance: %.2f" , flInitalVelo , fMortar_X_Angle , xs_vec_len_2d ( fVecTemp )) } bPotentialHIT = true break; } } get_tr2 ( iTr2 , TR_vecEndPos , fVecTempEnd ); get_ceiling ( fVecTempEnd , fVecTemp ); xs_vec_sub ( fEnd , fStart , fVecDest ); xs_vec_normalize ( fVecDest , fVecDest ); fVecTemp [ 0 ] += fVecDest [ 0 ] * 1.0 ; fVecTemp [ 1 ] += fVecDest [ 1 ] * 1.0 ; floor_origin ( fVecTemp , fVecDest ); #if defined DEBUG_FOLLOWING beam_bet_2origin ( fVecTemp , fVecDest ); #endif if( get_distance_f ( fVecTemp , fVecDest ) >= 50.0 ) { xs_vec_sub ( fVecDest , fStart , fVecTemp ); xs_vec_normalize ( fVecTemp , fVecTemp ); vector_to_angle ( fVecTemp , fVecTemp ); fAngle = fVecTemp [ 0 ]; xs_vec_sub ( fVecDest , fStart , fVecTemp ); fWallDistance = xs_vec_len_2d ( fVecTemp ); fWallHeight = ( fVecDest [ 2 ] - fStart [ 2 ]) + 5.0 ; xs_vec_sub ( fStart , fVecTargetPos , fVecTemp ); flInitalVelo = floatsqroot ( floatabs (( fWallDistance * 800.0 ) / ( (( fWallHeight * ( floatcos ( fAngle )^ 2.0 / fWallDistance )) - ( floatcos ( fAngle )* floatsin ( fAngle ))) * 2.0 ))); //flInitalVelo = floatsqroot( (fWallDistance ^ 2.0) / ((2.0 / 800.0) * (fWallHeight - fWallDistance * floattan(fAngle,degrees)) * floatcos(fAngle,degrees) ^ 2.0) ); xs_vec_copy ( fVecDest , fEnd ); fEnd [ 2 ] += 50.0 ; } } // free trace handler... free_tr2 ( iTr2 ); set_pev ( mortar , pev_fuser4 , fMortar_X_Angle ); set_pev ( mortar , pev_fuser2 , flInitalVelo ); return bPotentialHIT ; }
How am i calculating the velocity ( iknow its wrong i had change it many times lol )
opsy
PHP Code:
fInitVelo = floatsqroot ( xs_vec_len_2d ( fDest ) * 800.0 / floatsin ( 2.0 * fAngle )) fVelo [ 0 ] = fDirection [ 0 ] * ( fInitVelo * floatcos ( fAngle , degrees )); fVelo [ 1 ] = fDirection [ 1 ] * ( fInitVelo * floatcos ( fAngle , degrees )); fVelo [ 2 ] = floatsin ( fAngle , degrees ) * - fInitVelo ;
Any help is appreciated !!!
Some other formulas :-
to find the initial speed and/or find the angle!
Vi = ( X * g / sin( 2 * angle ) )
angle = 0.5 * arcsin ( ( (g * x ) / Vi^2.0 ) )
times = X / (Vi * cos (angle))
DEFINITION OF characters :-
Vi = Initial Velocity
X = Distance in the x axis
angle = the angle of the XY Plane
g = Gravity which is 800unit/s^2 for the goldsrc
Similar to my problem
__________________
Last edited by Natsheh; 05-22-2021 at 12:26 .