LUADOC - Farming Simulator 19

Script v1.7.1.0

Engine v1.7.1.0

Foundation Reference

AITurnStrategyBulb3

Description
- / \ | | \ | \ | | | Copyright (C) GIANTS Software GmbH, Confidential, All Rights Reserved.
Parent
AITurnStrategy
Functions

delete

Description
Definition
delete()
Code
28function AITurnStrategyBulb3:delete()
29 self.maxTurningSizeBox = {}
30 self.maxTurningSizeBox2 = {}
31end

new

Description
Definition
new()
Code
15function AITurnStrategyBulb3:new(customMt)
16 if customMt == nil then
17 customMt = AITurnStrategyBulb3_mt
18 end
19
20 local self = AITurnStrategy:new(customMt)
21 self.strategyName = "AITurnStrategyBulb3"
22
23 return self
24end

startTurn

Description
Definition
startTurn()
Code
35function AITurnStrategyBulb3:startTurn(driveStrategyStraight)
36 if not AITurnStrategyDefault:superClass().startTurn(self, driveStrategyStraight) then
37 return false
38 end
39 local turnData = driveStrategyStraight.turnData
40
41 local sideOffset
42 if self.turnLeft then
43 sideOffset = turnData.sideOffsetLeft
44 else
45 sideOffset = turnData.sideOffsetRight
46 end
47
48 --#
49 --self.usePredictionToSkipToNextSegment = true
50
51 -- first circle
52 local c1X,c1Y,c1Z
53 if sideOffset >= 0 then
54 c1X,c1Y,c1Z = -turnData.radius,0,0
55 else
56 c1X,c1Y,c1Z = turnData.radius,0,0
57 end
58
59 local alpha = math.acos( math.abs(sideOffset) / turnData.radius )
60
61 -- second circle
62 local c2X,c2Y,c2Z
63 if sideOffset >= 0 then
64 c2X = 2*sideOffset - turnData.radius
65 else
66 c2X = 2*sideOffset + turnData.radius
67 end
68 c2Y = 0
69 c2Z = math.sin(alpha) * 2 * turnData.radius
70
71 c1Z = c1Z + turnData.zOffsetTurn
72 c2Z = c2Z + turnData.zOffsetTurn
73
74 local rvX,rvY,rvZ = getWorldRotation(self.vehicle:getAIVehicleDirectionNode())
75
76 self:addNoFullCoverageSegment(self.turnSegments)
77
78 --# first straight
79 local segment = {}
80 segment.isCurve = false
81 segment.moveForward = true
82 segment.slowDown = true
83 segment.startPoint = self:getVehicleToWorld(0,0,0, true)
84 segment.endPoint = self:getVehicleToWorld(0,0,c1Z, true)
85 table.insert(self.turnSegments, segment)
86
87 --# first curve
88 local segment = {}
89 segment.isCurve = true
90 segment.moveForward = true
91 segment.radius = turnData.radius
92 segment.o = createTransformGroup("segment1")
93 link(getRootNode(), segment.o)
94 setTranslation(segment.o, self:getVehicleToWorld(c1X,c1Y,c1Z) )
95 setRotation(segment.o, rvX,rvY,rvZ)
96 if sideOffset >= 0 then
97 segment.startAngle = 0
98 segment.endAngle = alpha
99 else
100 segment.startAngle = math.pi
101 segment.endAngle = math.pi - alpha
102 end
103 table.insert(self.turnSegments, segment)
104
105 --# second curve
106 local segment = {}
107 segment.isCurve = true
108 segment.moveForward = true
109 segment.radius = turnData.radius
110 segment.o = createTransformGroup("segment2")
111 --segment.checkForValidArea = not self.vehicle.aiAlignedProcessing --true
112 link(getRootNode(), segment.o)
113 setTranslation(segment.o, self:getVehicleToWorld(c2X,c2Y,c2Z) )
114 setRotation(segment.o, rvX,rvY,rvZ)
115 if sideOffset >= 0 then
116 segment.startAngle = math.pi + alpha
117 segment.endAngle = 0
118 else
119 segment.startAngle = -alpha
120 segment.endAngle = math.pi
121 end
122 table.insert(self.turnSegments, segment)
123
124 --# final straight
125 local segment = {}
126 segment.isCurve = false
127 segment.moveForward = true
128 segment.slowDown = true
129 --segment.checkForValidArea = not self.vehicle.aiAlignedProcessing --true
130 local x = 2*sideOffset
131 segment.startPoint = self:getVehicleToWorld(x,0,c2Z, true)
132 segment.endPoint = self:getVehicleToWorld(x,0,math.min(turnData.zOffset, c2Z-0.1), true)
133 table.insert(self.turnSegments, segment)
134
135 self:startTurnFinalization()
136
137 return true
138end

updateTurningSizeBox

Description
Definition
updateTurningSizeBox()
Code
143function AITurnStrategyBulb3:updateTurningSizeBox(box, turnLeft, turnData, lookAheadDistance)
144
145 local sideOffset
146 if turnLeft then
147 sideOffset = turnData.sideOffsetLeft
148 else
149 sideOffset = turnData.sideOffsetRight
150 end
151
152 -- first circle
153 local c1X,c1Y,c1Z
154 if sideOffset >= 0 then
155 c1X,c1Y,c1Z = -turnData.radius,0,0
156 else
157 c1X,c1Y,c1Z = turnData.radius,0,0
158 end
159
160 local alpha = math.acos( math.abs(sideOffset) / turnData.radius )
161
162 -- second circle
163 local c2X,c2Y,c2Z
164 if sideOffset >= 0 then
165 c2X = 2*sideOffset - turnData.radius
166 else
167 c2X = 2*sideOffset + turnData.radius
168 end
169 c2Y = 0
170 c2Z = math.sin(alpha) * 2 * turnData.radius
171
172 c1Z = c1Z + turnData.zOffsetTurn
173 c2Z = c2Z + turnData.zOffsetTurn
174
175 --# 3) estimate final size of bounding box
176
177 local xb = math.max(turnData.toolOverhang.front.xb, turnData.toolOverhang.back.xb)
178 --local zb = math.max(turnData.toolOverhang.front.zb, turnData.toolOverhang.back.zb)
179 local xt = math.max(turnData.toolOverhang.front.xt, turnData.toolOverhang.back.xt)
180 --local zt = math.max(turnData.toolOverhang.front.zt, turnData.toolOverhang.back.zt)
181 local delta = math.max(xb, turnData.radius + xt)
182
183 local maxX = c2X + delta
184 local minX = c2X - delta
185 local maxZ = c2Z + delta
186
187 box.center[1], box.center[2], box.center[3] = maxX - (maxX-minX)/2, 0, maxZ/2 + lookAheadDistance/2
188 box.size[1], box.size[2], box.size[3] = (maxX-minX)/2, 5, maxZ/2 + lookAheadDistance/2
189
190 self:adjustHeightOfTurningSizeBox(box)
191
192 return box
193end