From bd75743800504beae9f1107a1817d0d4e797f331 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 12 May 2017 18:39:09 +0200 Subject: [PATCH] Much improved AI_FORMATION version not the different models supported, but the core logic to route the followers. fiew! Was the whole day busy with this! --- Moose Development/Maths/Distance.ggb | Bin 0 -> 11178 bytes Moose Development/Moose/AI/AI_Formation.lua | 76 +++++++++----------- 2 files changed, 34 insertions(+), 42 deletions(-) create mode 100644 Moose Development/Maths/Distance.ggb diff --git a/Moose Development/Maths/Distance.ggb b/Moose Development/Maths/Distance.ggb new file mode 100644 index 0000000000000000000000000000000000000000..dc32fd5afc04428e387a7d48385f574251da3c85 GIT binary patch literal 11178 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 literal 0 HcmV?d00001 diff --git a/Moose Development/Moose/AI/AI_Formation.lua b/Moose Development/Moose/AI/AI_Formation.lua index 5be95857e..976549720 100644 --- a/Moose Development/Moose/AI/AI_Formation.lua +++ b/Moose Development/Moose/AI/AI_Formation.lua @@ -406,7 +406,7 @@ end -- @param #nubmer ZStart The start position on the Z-axis in meters for the first group. -- @param #number ZSpace The space between groups on the Z-axis in meters for each sequent group. function AI_FORMATION:onafterFormationLeftLine( FollowGroupSet, From , Event , To, XStart, YStart, ZStart, ZSpace ) - self:E( { FollowGroupSet, From , Event ,To, XStart, YStart, ZStart, ZSpace } ) + self:F( { FollowGroupSet, From , Event ,To, XStart, YStart, ZStart, ZSpace } ) FollowGroupSet:Flush() @@ -422,7 +422,6 @@ function AI_FORMATION:onafterFormationLeftLine( FollowGroupSet, From , Event , T PointVec3:SetZ( ZStart + i * ZSpace ) local Vec3 = PointVec3:GetVec3() - self:E( Vec3 ) FollowGroup:SetState( self, "Vec3", Vec3 ) FollowGroup:OptionROTPassiveDefense() FollowGroup:OptionROEReturnFire() @@ -444,7 +443,7 @@ end -- @param #nubmer ZStart The start position on the Z-axis in meters for the first group. -- @param #number ZSpace The space between groups on the Z-axis in meters for each sequent group. function AI_FORMATION:onafterFormationRightLine( FollowGroupSet, From , Event , To, XStart, YStart, ZStart, ZSpace ) - self:E( { FollowGroupSet, From , Event , To, XStart, YStart, ZStart, ZSpace } ) + self:F( { FollowGroupSet, From , Event , To, XStart, YStart, ZStart, ZSpace } ) local FollowSet = FollowGroupSet:GetSet() @@ -458,7 +457,6 @@ function AI_FORMATION:onafterFormationRightLine( FollowGroupSet, From , Event , PointVec3:SetZ( -(ZStart + i * ZSpace) ) local Vec3 = PointVec3:GetVec3() - self:E( Vec3 ) FollowGroup:SetState( self, "Vec3", Vec3 ) FollowGroup:OptionROTPassiveDefense() FollowGroup:OptionROEReturnFire() @@ -494,7 +492,6 @@ function AI_FORMATION:onafterFormationLeftWing( FollowGroupSet, From , Event , T PointVec3:SetZ( ZStart + i * ZSpace ) local Vec3 = PointVec3:GetVec3() - self:E( Vec3 ) FollowGroup:SetState( self, "Vec3", Vec3 ) FollowGroup:OptionROTPassiveDefense() FollowGroup:OptionROEReturnFire() @@ -530,7 +527,6 @@ function AI_FORMATION:onafterFormationRightWing( FollowGroupSet, From , Event , PointVec3:SetZ( -(ZStart + i * ZSpace) ) local Vec3 = PointVec3:GetVec3() - self:E( Vec3 ) FollowGroup:SetState( self, "Vec3", Vec3 ) FollowGroup:OptionROTPassiveDefense() FollowGroup:OptionROEReturnFire() @@ -565,14 +561,11 @@ function AI_FORMATION:onafterFormationCenterWing( FollowGroupSet, From , Event , local Side = ( i % 2 == 0 ) and 1 or -1 local Row = i / 2 + 1 - self:E(Side) - PointVec3:SetX( XStart + Row * XSpace ) PointVec3:SetY( YStart ) PointVec3:SetZ( Side * ( ZStart + i * ZSpace ) ) local Vec3 = PointVec3:GetVec3() - self:E( Vec3 ) FollowGroup:SetState( self, "Vec3", Vec3 ) FollowGroup:OptionROTPassiveDefense() FollowGroup:OptionROEReturnFire() @@ -629,12 +622,10 @@ function AI_FORMATION:onenterFollowing( FollowGroupSet ) local CD = ( ( CV2.x - CV1.x )^2 + ( CV2.y - CV1.y )^2 + ( CV2.z - CV1.z )^2 ) ^ 0.5 local CT = CT2 - CT1 - local CS = ( 3600 / CT ) * ( CD / 1000 ) + local CS = ( 3600 / CT ) * ( CD / 1000 ) / 3.6 - local CDV = { x = CV2.x - CV1.x, y = CV2.y - CV1.y, z = CV2.z - CV1.z } - local Ca = math.atan2( CDV.z, CDV.x ) - - self:T2( { "Client:", CS, CD, CT, CV2, CV1, CT2, CT1 } ) + local CDv = { x = CV2.x - CV1.x, y = CV2.y - CV1.y, z = CV2.z - CV1.z } + local Ca = math.atan2( CDv.x, CDv.z ) local GT1 = GroupUnit:GetState( self, "GT1" ) local GT2 = timer.getTime() @@ -646,27 +637,24 @@ function AI_FORMATION:onenterFollowing( FollowGroupSet ) local GD = ( ( GV2.x - GV1.x )^2 + ( GV2.y - GV1.y )^2 + ( GV2.z - GV1.z )^2 ) ^ 0.5 local GT = GT2 - GT1 - local GS = ( 3600 / GT ) * ( GD / 1000 ) - - --self:E( { "Group:", GS = GS,GD = GD, GT = GT, GV2 = GV2, GV1 = GV1, GT2 = GT2, GT1 = GT1 } ) - - local GVx = FollowFormation.x * math.cos(Ca) - FollowFormation.z * math.sin(Ca) - local GVz = FollowFormation.z * math.cos(Ca) + FollowFormation.x * math.sin(Ca) -- Calculate the group direction vector - local GV = { x = GV2.x - CV2.x + GVx, y = GV2.y - CV2.y, z = GV2.z - CV2.z + GVz } + local GV = { x = GV2.x - CV2.x, y = GV2.y - CV2.y, z = GV2.z - CV2.z } -- Calculate GH2, GH2 with the same height as CV2. local GH2 = { x = GV2.x, y = CV2.y, z = GV2.z } -- Calculate the angle of GV to the orthonormal plane - local alpha = math.atan2( GV.z, GV.x ) + local alpha = math.atan2( GV.x, GV.z ) + local GVx = FollowFormation.z * math.cos( Ca ) + FollowFormation.x * math.sin( Ca ) + local GVz = FollowFormation.x * math.cos( Ca ) - FollowFormation.z * math.sin( Ca ) + -- Now we calculate the intersecting vector between the circle around CV2 with radius FollowDistance and GH2. -- From the GeoGebra model: CVI = (x(CV2) + FollowDistance cos(alpha), y(GH2) + FollowDistance sin(alpha), z(CV2)) - local CVI = { x = CV2.x + FollowDistance * math.cos(alpha), + local CVI = { x = CV2.x + CS * 10 * math.sin(Ca), y = GH2.y, -- + FollowFormation.y, - z = CV2.z + FollowDistance * math.sin(alpha), + z = CV2.z + CS * 10 * math.cos(Ca), } -- Calculate the direction vector DV of the escort group. We use CVI as the base and CV2 as the direction. @@ -678,18 +666,15 @@ function AI_FORMATION:onenterFollowing( FollowGroupSet ) local DVu = { x = DV.x / FollowDistance, y = DV.y, z = DV.z / FollowDistance } -- Now we can calculate the group destination vector GDV. - local GDV = { x = DVu.x * CS + CVI.x, y = CVI.y, z = DVu.z * CS + CVI.z } + local GDV = { x = CVI.x, y = CVI.y, z = CVI.z } local ADDx = FollowFormation.x * math.cos(alpha) - FollowFormation.z * math.sin(alpha) local ADDz = FollowFormation.z * math.cos(alpha) + FollowFormation.x * math.sin(alpha) - self:E( { ALPHA = alpha, GDVx = GDV.x, GDVz = GDV.z, ADDx = ADDx, ADDz = ADDz, FOLLOWx = FollowFormation.x, FOLLOWz = FollowFormation.z } ) - --- local GDV_Formation = GDV local GDV_Formation = { - x = GDV.x + GVx, + x = GDV.x - GVx, y = GDV.y, - z = GDV.z + GVz + z = GDV.z - GVz } if self.SmokeDirectionVector == true then @@ -697,28 +682,35 @@ function AI_FORMATION:onenterFollowing( FollowGroupSet ) trigger.action.smoke( GDV_Formation, trigger.smokeColor.White ) end - -- Measure distance between client and group - local CatchUpDistance = ( ( GDV_Formation.x - GV2.x )^2 + ( GDV_Formation.y - GV2.y )^2 + ( GDV_Formation.z - GV2.z )^2 ) ^ 0.5 - - -- The calculation of the Speed would simulate that the group would take 30 seconds to overcome - -- the requested Distance). - local Time = 10 - local CatchUpSpeed = ( CatchUpDistance - ( CS * 15 ) ) / Time - - local Speed = CS + CatchUpSpeed + + -- Calculate the distance + + local GDv = { x = GV2.x - CV1.x, y = GV2.y - CV1.y, z = GV2.z - CV1.z } + + local Alpha_T = math.atan2( GDv.x, GDv.z ) - math.atan2( CDv.x, CDv.z ) + local Alpha_R = ( Alpha_T < 0 ) and Alpha_T + 2 * math.pi or Alpha_T + local Position = math.cos( Alpha_R ) + local GD = ( ( GDv.x )^2 + ( GDv.z )^2 ) ^ 0.5 + local Distance = GD * Position + FollowDistance - CS * 2 + + + + local Time = 40 + local Speed = - Distance / Time + local GS = Speed + CS if Speed < 0 then Speed = 0 end - + -- Now route the escort to the desired point with the desired speed. - FollowGroup:RouteToVec3( GDV_Formation, Speed / 3.6 ) -- DCS models speed in Mps (Miles per second) + FollowGroup:RouteToVec3( GDV_Formation, GS ) -- DCS models speed in Mps (Miles per second) end end end, ClientUnit, CT1, CV1, CT2, CV2 ) - self:__Follow( -10 ) + self:__Follow( -2 ) end end