diff --git a/koptilnya/.idea/.gitignore b/koptilnya/.idea/.gitignore
new file mode 100644
index 0000000..b58b603
--- /dev/null
+++ b/koptilnya/.idea/.gitignore
@@ -0,0 +1,5 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/koptilnya/.idea/koptilnya.iml b/koptilnya/.idea/koptilnya.iml
new file mode 100644
index 0000000..0c8867d
--- /dev/null
+++ b/koptilnya/.idea/koptilnya.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/koptilnya/.idea/modules.xml b/koptilnya/.idea/modules.xml
new file mode 100644
index 0000000..22e25db
--- /dev/null
+++ b/koptilnya/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/koptilnya/.idea/vcs.xml b/koptilnya/.idea/vcs.xml
new file mode 100644
index 0000000..6c0b863
--- /dev/null
+++ b/koptilnya/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/koptilnya/better_steering/config/sample.txt b/koptilnya/better_steering/config/sample.txt
index 0831ccc..f88cba4 100644
--- a/koptilnya/better_steering/config/sample.txt
+++ b/koptilnya/better_steering/config/sample.txt
@@ -6,37 +6,23 @@ require('/koptilnya/better_steering/steering.txt')
Steering:new({
Sensitivity = 0.04,
- Slaves = {{
+ PowerSteer = 0.5,
+ Axles = {{
Lock = 30,
Camber = -2,
- Caster = 5,
+ Caster = 8,
Ackermann = 15.43,
Toe = 0,
- Offset = 180
+ LeftOffset = 180,
+ RightOffset = 180
}, {
- Lock = 30,
- Camber = -2,
- Caster = 5,
- Ackermann = 15.43,
- Toe = 0,
- Offset = 180,
- IsRight = true
- }, {
- Lock = 1,
+ Lock = 0,
Camber = -2,
Caster = 0,
Ackermann = 0,
Toe = 0,
- Offset = 180,
- Direction = -1
- }, {
- Lock = 1,
- Camber = -2,
- Caster = 0,
- Ackermann = 0,
- Toe = 0,
- Offset = 180,
- IsRight = true,
+ LeftOffset = 180,
+ RightOffset = 180,
Direction = -1
}}
})
diff --git a/koptilnya/better_steering/slave.txt b/koptilnya/better_steering/slave.txt
index 846ab17..f219ebc 100644
--- a/koptilnya/better_steering/slave.txt
+++ b/koptilnya/better_steering/slave.txt
@@ -1,7 +1,9 @@
-- @include /koptilnya/libs/wire_component.txt
-- @include /koptilnya/libs/constants.txt
+-- @include /koptilnya/libs/entity.txt
require('/koptilnya/libs/wire_component.txt')
require('/koptilnya/libs/constants.txt')
+require('/koptilnya/libs/entity.txt')
Slave = class('Slave', WireComponent)
@@ -19,26 +21,19 @@ function Slave:initialize(options)
self.order = options.Order or 0
- self.entity = nil
- self.wheel = nil
+ self.entity = options.Slave
+ self.wheel = options.Wheel
self.base = options.Base or nil
self.steer = 0
self.steeringAngle = 0
self.lateralVel = 0
+ self.baseLngVel = 0
self.lateralForce = 0
self.selfAligningTorque = 0
self.correctingAngle = 0
end
-function Slave:getInputs()
- local inputs = {}
- inputs['SL_' .. self.order] = 'entity'
- inputs['W_' .. self.order] = 'entity'
-
- return inputs
-end
-
function Slave:getOutputs()
local outputs = {}
@@ -46,6 +41,8 @@ function Slave:getOutputs()
outputs['SL_' .. self.order .. '_SelfAligningTq'] = 'number'
outputs['SL_' .. self.order .. '_CorrectingAngle'] = 'number'
outputs['W_' .. self.order .. '_LateralVel'] = 'number'
+ outputs['SL_' .. self.order .. '_SteeringAngle'] = 'number'
+ outputs['SL_' .. self.order .. '_BaseLngVel'] = 'number'
return outputs
end
@@ -55,42 +52,24 @@ function Slave:updateOutputs()
wire.ports['SL_' .. self.order .. '_SelfAligningTq'] = self.selfAligningTorque
wire.ports['SL_' .. self.order .. '_CorrectingAngle'] = self.correctingAngle
wire.ports['W_' .. self.order .. '_LateralVel'] = self.lateralVel
+ wire.ports['SL_' .. self.order .. '_SteeringAngle'] = self.steeringAngle
+ wire.ports['SL_' .. self.order .. '_BaseLngVel'] = self.baseLngVel
end
function Slave:update()
- self.entity = wire.ports['SL_' .. self.order]
- self.wheel = wire.ports['W_' .. self.order]
-
if isValid(self.entity) and isValid(self.base) and isValid(self.wheel) then
- local wheelMass = self.wheel:getMass()
- local wheelInertia = self.wheel:getInertia():getLength()
- local wheelRadius = self.wheel:getModelRadius() / UNITS_PER_METER
- local wheelFriction = self.wheel:getFriction()
- local lateralVel = self.wheel:worldToLocal(self.wheel:getVelocity() + self.wheel:getPos())[2]
-
- self.lateralVel = lateralVel
-
- if math.abs(self.steer) > 0 then
- self.correctingAngle = 0
- else
- self.lateralForce = wheelFriction * wheelMass * lateralVel / TICK_INTERVAL /
- UNITS_PER_METER
- self.selfAligningTorque = self.lateralForce * wheelRadius * 2
- self.correctingAngle = self.selfAligningTorque / wheelInertia * TICK_INTERVAL
- end
-
- if self.isRight then
- self.correctingAngle = self.correctingAngle * -1
- end
-
- self.correctingAngle = 0
-
if not self.entity:isFrozen() and not self.entity:isPlayerHolding() then
self.entity:setFrozen(1)
end
- local inc = self.steer * self.lock * self.direction
- self.steeringAngle = math.clamp(self.steeringAngle + inc + self.correctingAngle, -self.lock, self.lock)
+ local wheelMass = self.wheel:getMass()
+ local wheelInertia = self.wheel:getInertia():getLength()
+ local wheelRadius = self.wheel:getModelRadius() / UNITS_PER_METER
+ local wheelFriction = self.wheel:getFriction()
+ local wheelLocalVel = getLocalVelocity(self.wheel)
+ local baseLocalVel = getLocalVelocity(self.base)
+ local lateralVel = wheelLocalVel[2]
+ local baseLngVel = baseLocalVel[1]
local camber = self.isRight and -self.camber or self.camber
local steerRatio = self.lock ~= 0 and self.steeringAngle / self.lock or 0
@@ -104,11 +83,23 @@ function Slave:update()
ackermann = self.isRight and steerRatio * self.ackermann or -steerRatio * self.ackermann
end
+ self.lateralForce = wheelFriction * wheelMass * lateralVel / UNITS_PER_METER
+ self.selfAligningTorque = self.lateralForce * wheelRadius
+
+ self.correctingAngle = self.selfAligningTorque / wheelInertia * math.sin(math.rad(math.abs(self.caster * 2))) *
+ math.sign(baseLngVel) * (self.isRight and -1 or 1)
+
+ local inc = self.steer * self.lock * self.direction * math.cos(math.rad(math.abs(self.caster * 2)))
+ self.steeringAngle = math.clamp(self.steeringAngle + inc + self.correctingAngle, -self.lock, self.lock)
+
-- Dividing ackermann by 2 because ackermann angle is difference between wheels angle
-- So if we don't divide it by 2, the result angle will be 2 times more than expected
- local angle = Angle(0, self.offset + self.steeringAngle + toe + ackermann / 2, camber - caster)
+ local angle = Angle(0, self.offset + self.steeringAngle + toe + ackermann / 2, camber + caster)
local localizedAngle = self.base:localToWorldAngles(angle)
self.entity:setAngles(localizedAngle)
+
+ self.lateralVel = lateralVel
+ self.baseLngVel = baseLngVel
end
end
diff --git a/koptilnya/better_steering/steering.txt b/koptilnya/better_steering/steering.txt
index 112368f..fd682d6 100644
--- a/koptilnya/better_steering/steering.txt
+++ b/koptilnya/better_steering/steering.txt
@@ -1,22 +1,22 @@
-- @include /koptilnya/libs/wire_component.txt
--- @include ./slave.txt
+-- @include ./steering_axle.txt
-- @include /koptilnya/libs/table.txt
require('/koptilnya/libs/wire_component.txt')
-require('./slave.txt')
+require('./steering_axle.txt')
require('/koptilnya/libs/table.txt')
Steering = class('Steering', WireComponent)
function Steering:initialize(options)
options = options or {}
- self.slaves = {}
+ self.axles = {}
self.steer = 0
self.sensitivity = options.Sensitivity or 1
- for key, slave in ipairs(options.Slaves) do
- slave.Order = key
- slave.Base = wire.ports.Base
- table.insert(self.slaves, Slave:new(slave))
+ for key, axle in ipairs(options.Axles) do
+ axle.Order = key
+ axle.Base = wire.ports.Base
+ table.insert(self.axles, SteeringAxle:new(axle))
end
self:_adjustPorts()
@@ -33,9 +33,9 @@ function Steering:_adjustPorts()
inputs = table.merge(inputs, self:getInputs())
outputs = table.merge(outputs, self:getOutputs())
- for _, slave in ipairs(self.slaves) do
- inputs = table.merge(inputs, slave:getInputs())
- outputs = table.merge(outputs, slave:getOutputs())
+ for _, axle in ipairs(self.axles) do
+ inputs = table.merge(inputs, axle:getInputs())
+ outputs = table.merge(outputs, axle:getOutputs())
end
wire.adjustPorts(inputs, outputs)
@@ -55,15 +55,15 @@ function Steering:getOutputs()
end
function Steering:updateOutputs()
- local totalSteeringAngle = table.reduce(self.slaves, function(steer, slave)
- return steer + slave.direction * slave.steeringAngle / (slave.lock ~= 0 and slave.lock or 1)
- end, 0)
+ -- local totalSteeringAngle = table.reduce(self.slaves, function(steer, slave)
+ -- return steer + slave.direction * slave.steeringAngle / (slave.lock ~= 0 and slave.lock or 1)
+ -- end, 0)
- local steerableSlaves = table.filter(self.slaves, function(slave)
- return slave.lock ~= 0
- end)
+ -- local steerableSlaves = table.filter(self.slaves, function(slave)
+ -- return slave.lock ~= 0
+ -- end)
- wire.ports.Steer = totalSteeringAngle / #steerableSlaves
+ -- wire.ports.Steer = totalSteeringAngle / #steerableSlaves
end
function Steering:update()
@@ -71,9 +71,9 @@ function Steering:update()
self:updateOutputs()
- for _, slave in ipairs(self.slaves) do
- slave.steer = self.steer
- slave:update()
- slave:updateOutputs()
+ for _, axle in ipairs(self.axles) do
+ axle.steer = self.steer
+ axle:update()
+ axle:updateOutputs()
end
end
diff --git a/koptilnya/better_steering/steering_axle.txt b/koptilnya/better_steering/steering_axle.txt
new file mode 100644
index 0000000..7f43432
--- /dev/null
+++ b/koptilnya/better_steering/steering_axle.txt
@@ -0,0 +1,69 @@
+-- @include /koptilnya/libs/wire_component.txt
+-- @include /koptilnya/libs/constants.txt
+-- @include /koptilnya/libs/entity.txt
+-- @include ./slave.txt
+require('/koptilnya/libs/wire_component.txt')
+require('/koptilnya/libs/constants.txt')
+require('/koptilnya/libs/entity.txt')
+require('./slave.txt')
+
+SteeringAxle = class('SteeringAxle', WireComponent)
+
+function SteeringAxle:createSlave(options, isRight)
+ local config = {
+ Lock = options.Lock,
+ Camber = options.Camber,
+ Caster = options.Caster,
+ Ackermann = options.Ackermann,
+ Toe = options.Toe,
+ Direction = options.Direction,
+ IsRight = isRight,
+ Slave = wire.ports[self._prefix .. (isRight and '_RightSlave' or '_LeftSlave')],
+ Wheel = wire.ports[self._prefix .. (isRight and '_RightWheel' or '_LeftWheel')],
+ Offset = isRight and options.RightOffset or options.LeftOffset,
+ Prefix = self._prefix .. (isRight and '_RightWheel' or '_LeftWheel'),
+ Base = wire.ports.Base
+ }
+
+ return Slave:new(config)
+end
+
+function SteeringAxle:initialize(options)
+ options = options or {}
+
+ self.steer = 0
+ self._prefix = 'Axle' .. options.Order
+
+ self.leftSlave = self:createSlave(options, false)
+ self.rightSlave = self:createSlave(options, true)
+end
+
+function SteeringAxle:getInputs()
+ local inputs = {}
+
+ inputs[self._prefix .. '_LeftSlave'] = 'entity'
+ inputs[self._prefix .. '_RightSlave'] = 'entity'
+ inputs[self._prefix .. '_LeftWheel'] = 'entity'
+ inputs[self._prefix .. '_RightWheel'] = 'entity'
+
+ return inputs
+end
+
+function SteeringAxle:getOutputs()
+ local outputs = {}
+
+ table.merge(outputs, self.leftSlave:getOutputs())
+ table.merge(outputs, self.rightSlave:getOutputs())
+
+ return outputs
+end
+
+function SteeringAxle:updateOutputs()
+ self.leftSlave:updateOutputs()
+ self.rightSlave:updateOutputs()
+end
+
+function SteeringAxle:update()
+ self.leftSlave:update()
+ self.rightSlave:update()
+end
\ No newline at end of file
diff --git a/koptilnya/engine_remastered/configs/sx240.txt b/koptilnya/engine_remastered/configs/sx240.txt
index aaae9aa..1dbad92 100644
--- a/koptilnya/engine_remastered/configs/sx240.txt
+++ b/koptilnya/engine_remastered/configs/sx240.txt
@@ -26,7 +26,8 @@ Vehicle:new({
Clutch = {Stiffness = 20, Damping = 0.5, MaxTorque = 400},
Gearbox = {Type = 'MANUAL', ShiftDuration = 0.2, ShiftSmoothness = 0.3, Ratios = {3.321, 1.902, 1.308, 1, 0.838}, Reverse = 3.382},
Axles = {
- {Power = 0.96, Coast = 0.96, Preload = 10, UsePowerBias = 10, ViscousCoeff = 0.96, Axle = Vector(1, 0, 0), DistributionCoeff = 1, FinalDrive = 3.9}
+ {Power = 0.96, Coast = 0.96, Preload = 10, UsePowerBias = 10, ViscousCoeff = 0.96, Axle = Vector(1, 0, 0), DistributionCoeff = 0.8, FinalDrive = 3.9},
+ {Power = 0.96, Coast = 0.96, Preload = 10, UsePowerBias = 10, ViscousCoeff = 0.96, Axle = Vector(1, 0, 0), DistributionCoeff = 1.2, FinalDrive = 3.9},
},
Systems = {{Type = 'LAUNCH', Limit = 3500}, {Type = 'TRACTION', Limit = 1.5}}
})
diff --git a/koptilnya/input_system/configs/sample.txt b/koptilnya/input_system/configs/sample.txt
index c36a5da..8fc6217 100644
--- a/koptilnya/input_system/configs/sample.txt
+++ b/koptilnya/input_system/configs/sample.txt
@@ -15,6 +15,11 @@ Axles = {
Gravity = 0.15,
Sensitivity = 0.25
},
+ Brakes = {
+ Positive = KEY.S,
+ Gravity = 0.15,
+ Sensitivity = 0.25
+ },
Shifter = {
Positive = MOUSE.LEFT,
Negative = MOUSE.RIGHT,