Some helpers for you (not tested in game)
Not a lua coder, so hope it aint too crufty
function VecDot(v1,v2)
local ret = 0
for k,_ in pairs(v1) do
ret = ret + v1[k] * v2[k]
end
return ret
end
-- transform a vector from frame local (body) coordinate system into global (world)
-- takes
-- Pos3 frame (unit.getPosition())
-- Vec3 localVec
-- boolean ispoint (will translate vector if true)
-- returns
-- Vec3 globalVec
function LocalToGlobal(frame,localVec,ispoint)
local ret={}
for k,_ in pairs(localVec) do
ret[k] = VecDot({x=frame.x[k], y=frame.y[k], z=frame.z[k]},localVec)
end
-- do translation if vector is point vector
if ispoint == 1 then
for k,v in pairs(ret) do
ret[k] = ret[k] + frame.p[k]
end
end
return ret
end
-- transform a vector from global coordinate system (world) into frame local (body)
-- takes
-- Pos3 frame (unit.getPosition())
-- Vec3 globalVec
-- boolean ispoint (will translate vector if true)
-- returns
-- Vec3 localVec
function GlobalToLocal(frame,globalVec,ispoint)
local ret={}
for k,_ in pairs(globalVec) do
ret[k] = VecDot(frame[k],globalVec)
end
-- do translation if vector is point vector
if ispoint == 1 then
for k,v in pairs(ret) do
ret[k] = ret[k] + (VecDot(frame[k],frame.p) * -1)
end
end
return ret
end
-- example usage
-- For your "Fast/Slow" calls
-- Assumes unit x vector corresponds to wing chord
-- returns AoA in radians
function getAoA(unit)
local p = unit.getPosition()
local v_world = unit.getVelocity()
v_local = GlobalToLocal(p,v_world)
return math.atan2(v_local.y,v_local.x)
end