Hello all, I'm back with more Funky Trees magic... This time around, here's some juicy math for a computerized artillery system. Enjoy.
The objective of this system is to generate an input statement for a rotator such that given an range
defined by the operator, the system automatically calculates the required elevation in degrees for the gun such that it will reach that defined range
. Here's a diagram of the situation:
As with the diagram, we'll call the initial velocity of the projectile Vi and the angle that it is launched at Ø. We assume no air resistance. This means that to go range
you need exactly Ø amount of elevation. As such, we can derive the following equation from the diagram:
- range = vi * cosØ * t
where range
is the horizontal distance we want the projectile to travel, and t the time it takes for the projectile to reach the target area. We now need to solve for t, which we do not know- luckily, since the projectile travels in a parabola, we know that the time spent for the projectile to reach the maximum height is the same coming down. As such, the total time spent by the projectile in the air will be defined as:
- t = ((vi * sinØ) / 9.81)*2
Now if we substitute this expression in for t in the original equation, we get:
- range = vi * cosØ * vi * sinØ * 1/9.81 * 2
- Which simplifies to:
- range = vi^2 * 2cosØsinØ / 9.81
Ah, very nice! We see a Pythagorean identity here- the double angle formula. According to this Pythagorean identity, we know that: 2sinØcosØ = sin(2Ø), therefore if we substitute for that in the equation above, we get:
- range = v^2 * sin(2Ø) / 9.81
Now we can do algebra to solve for Ø:
- (range * 9.81)/(v^2) = sin(2Ø)
- asin((range * 9.81)/(v^2)) = 2Ø, so
- Ø = asin((range * 9.81)/(v^2))/2
Now that we have the mathematical equation for the angle Ø in the initial launch of a projectile, we now need to convert it into a format that SimplePlanes recognizes. To do this, we need to think of how our system will work. My system works by the operator (you, the user) inputting the range by changing the Trim
input. It will be actuated by a piston, so we now need to set a maximum value for the system. Let's try 5000m (5km) as our max range. Then this means the for an Trim
input value of 1, the range
should be set as 5000m... Therefore, if we determine the function for range, R(Trim), using Trim
, we get:
- Range = 5000 * Trim
Which makes sense as trim should be the respective proportion of the range 5000m. Now if we replace range
as 5000 * Trim
, we get that our angle equation is:
- Ø = asin((5000 * Trim * 9.81)/(pow(vi, 2)))/2
I also converted the square of the projectile velocity into the pow() function. Now, if we consider that our cannon will be placed on a rotator with an allowed angle of 90º, then we know that the angle Ø should be a proportion of 90º. If we do this, we finally get that the input statement for the cannon elevation rotator is:
(asin((5000 * Trim * 9.81)/(pow(vi, 2)))/2)/a
Where vi is the projectile initial velocity and a the allowed angle of the rotator. For my system, the statement is set to (asin((5000 * Trim * 9.81)/(pow(300, 2)))/2)/90
, as my rotator is set to 90º and the projectile velocity 300m/s.
Well, I've gone ahead and done exactly that. Here's a view of the interface:
The clock on the righthand corner is a shell splash timer, displaying the expected airtime of the projectile. This is just regulated by the expression for t we found earlier converted into SP syntax ((((vi * sin(asin((5000 * Trim * 9.81)/(pow(vi, 2)))/2))/9.81) * 2) * (12/90))
).
I'll release this computerized artillery system by maybe tomorrow. If you liked my work, please leave an upvote or two. Stay tuned for the actual build!
Expect this to be out by today!
Forgot about air resistance
@BaconAircraft
.
Hahaha, this wouldn't have worked if drag was modelled for the ingame cannons...
Great work.
A sSuMe AiR rEsIstA nC e and OThE r NoN-c OnsEva Tive foRcEs aRe Ne g Lig i ble gives me PTSD from my shitty dynamics prof
@GeneralOliverVonBismarck
.
Sure, it's out now so go give it a look. Feel free to use.
@BuiltBionixInd10
.
Not yet. I'm not so good with mechs, but I will look into them given the chance.
@SnoWFLakE0s have you tried making a mech with this one with the use of Funky trees
Making a new SPG, this will be useful.
Once again, we have been outdone by a simple snowflake...
@XxMegamonsterxX
.
It's not a setting or anything.
The setting for the funky trees.
I couldn’t find it on my SP on iOS
Ah. Makes sense. Well done!
@spefyjerbf
.
Yep, it's a distance approximator essentially. You just adjust the viewing angle to the target, the computer calculates the distance traveled by the target and divides it by a reference timeframe to obtain the target velocity.
I probably wouldn’t be able to follow the math, but I assume that some sort of trig is responsible?
@spefyjerbf
.
Ah, I've already created an object velocity approximator device to do exactly that. The math is solid, if you want to view it I can show you my work related to it.
My head is burning, but I'm fine
Leading a target would be difficult as there are no inputs that are directly related to its velocity. Perhaps some sort of estimation might have to happen.
Sweet! Way too much math for me, but I can’t wait to test it out
@spefyjerbf
.
Thanks. Originally, meant to make a full-on fire control system with automatic lead compensation based on flight time and target velocity, but I can only solve it via vector mathematics right now and I'm figuring out a way to convert that into the appropriate syntax for the input system. This was possible to do with normal kinematics so I did this first.
Nice, I wish y’all the best of luck. I hope to see this in the game!
Very nice. Good use of projectile motion functions.