Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @name Simple PN Guidance
- @inputs N:number TargetPos:vector
- @persist LastR:vector LastTime:time LastPos:vector LastVel:vector
- @outputs OutForce:vector
- interval(1)
- # 1) Time & positions
- local t = clk()
- local dt = t - (LastTime?:t)
- if (dt <= 0) { LastTime = t return }
- LastTime = t
- local Pos = entity():pos()
- local R = TargetPos - Pos
- local Range = R:length()
- if (Range <= 0) { return }
- # 2) LOS unit & relative velocity
- local u = R / Range
- local Vel = (Pos - (LastPos?:Pos)) / dt
- local Vrel = Vel - (LastVel?:vec(0,0,0))
- LastPos = Pos
- LastVel = Vel
- # 3) Closing speed
- local Vc = -Vrel:dot(u)
- # 4) LOS rate
- # ū̇ = (Vrel − u*(Vrel·u)) / R
- local uDot = (Vrel - u*(Vrel:dot(u))) / Range
- # 5) Commanded accel
- local aCmd = uDot * (N * Vc)
- # 6) Turn into force for a vector thruster: F = m·a
- # assume you set mass elsewhere, e.g. Mass input or convar
- local mass = entity():getMass() # or pass in as @input
- OutForce @= aCmd * mass
Advertisement
Add Comment
Please, Sign In to add comment