LUADOC - Farming Simulator 22

Script v1_7_1_0

Engine v1_7_1_0

Foundation Reference

AITurnStrategyBulb2

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

delete

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

new

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

startTurn

Description
Definition
startTurn()
Code
37function AITurnStrategyBulb2:startTurn(driveStrategyStraight)
38 if not AITurnStrategyBulb2:superClass().startTurn(self, driveStrategyStraight) then
39 return false
40 end
41 local turnData = driveStrategyStraight.turnData
42
43 local sideOffset
44 if self.turnLeft then
45 sideOffset = turnData.sideOffsetLeft
46 else
47 sideOffset = turnData.sideOffsetRight
48 end
49
50 --#
51 --self.usePredictionToSkipToNextSegment = true
52
53 -- start with centre of second circle
54 local c2X,c2Y,c2Z
55 if sideOffset >= 0 then
56 c2X,c2Y,c2Z = turnData.radius+2*sideOffset,0,0
57 else
58 c2X,c2Y,c2Z = -turnData.radius+2*sideOffset,0,0
59 end
60
61 local alpha = math.acos(math.abs(sideOffset)/turnData.radius)
62
63 -- center of first circle
64 local c1X,c1Y,c1Z
65 if sideOffset >= 0 then
66 c1X = turnData.radius
67 else
68 c1X = -turnData.radius
69 end
70 c1Y = 0
71 c1Z = math.sin(alpha)*2*turnData.radius
72
73 c1Z = c1Z + turnData.zOffsetTurn
74 c2Z = c2Z + turnData.zOffsetTurn
75
76 local rvX,rvY,rvZ = getWorldRotation(self.vehicle:getAIDirectionNode())
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 = math.pi
98 segment.endAngle = -alpha
99 else
100 segment.startAngle = 0
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.checkForValidArea = not self.vehicle.aiAlignedProcessing --true
111 segment.o = createTransformGroup("segment2")
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 = math.pi
118 else
119 segment.startAngle = alpha
120 segment.endAngle = 0
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 AITurnStrategyBulb2: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 -- start with centre of second circle
153 local c2X,c2Y,c2Z
154 if sideOffset >= 0 then
155 c2X,c2Y,c2Z = turnData.radius+2*sideOffset,0,0
156 else
157 c2X,c2Y,c2Z = -turnData.radius+2*sideOffset,0,0
158 end
159
160 local alpha = math.acos(math.abs(sideOffset)/turnData.radius)
161
162 -- center of first circle
163 local c1X,c1Y,c1Z
164 if sideOffset >= 0 then
165 c1X = turnData.radius
166 else
167 c1X = -turnData.radius
168 end
169 c1Y = 0
170 c1Z = 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 = c1X + delta
184 local minX = c1X - delta
185 local maxZ = c1Z + 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)
191end