Um Kommentare schreiben zu können musst du dich einloggen. Du kannst dich auch kostenlos registrieren, falls du noch keinen Account hast - dauert nur eine Minute.
Die V1.5 der Ground Response.lua ist endlich fertig.
(Die V1.5 beruht noch auf einem umgeschriebenen 4Real Modul 3: V1.0.0.0, und behebt nicht das Verrutschen durch beladene Frontlader).
V1.5 Final
Realismus Version
- Einsinkverhalten und Grip auf nassem und trockenem Boden individuell angepasst
- das Einsinken verhält sich je nach Bodenart anders
- die sinktirefriction richtet sich speziell nach den steerable`s (lenkbaren Fahrzeugen), damit diese mit stark einsinkenden Rädern fast keine Zugkraft mehr haben
- Anhänger und Geräte haben hohe Längs- und Quersteiffigkeit, damit wird das um die Ecke ziehen bei weichem Boden sehr viel schwieriger
- asynchrone Tragfähigkeit zum Reifendurchmesser damit sich das Einsinkverhalten mehr echten Schleppern in verschiedensten Klassen entspricht
- das Auf- und Abwandern der Anhängerreifen ist nun behoben
- Einsinktiefe der Anhängerräder angepasst
In dieser Version gilt wieder : Auf nassem Boden starkes Einsinken, wenig Grip...bestimmte Bodenarten haben aber auch auf trockem Boden bei hohem Gewicht/cm² hohes Einsinken (z.B. gegrubberter Boden ist sehr weich, gepflügter richtig weich,...)
Damit das "Festbuddeln" auch so gelingt, wie ich es in ungefähr in echt habe, habe ich die Friction Werte der StuffAndThings auf overall 0.85, und field auf 0.60 gestellt !!
(Keine Sorge, dies passt jetzt, da die Anhänger ja nicht von der sinkTireFriction betroffen sind, und somit etwas mehr Quersteiffigkeit beim fahren am Hang bieten.)
Des weiteren hat Giants Stellung bezogen, bezüglich meiner Anfrage nach einem einbaufertigem Modul 3: Ground Response V1.5
Sie möchten dieses nicht selbst als Volldownload anbieten, da sie ja grade ein Update mit diversen fixes (V1.0.1.0) ausgeliefert haben (und wir alle kennen das Ergebnis...)
und möchten auch NICHT das ich es zum Download anbiete, wegen der Verwechslungsgefahr mit ihrem.
Deshalb bleibt uns/euch leider weiterhin nichts anderes übrig, als die .lua ins Originale Modul einzubauen (passt bei V1.0.0.0 und V1.0.1.0).
Schade ist, das ihr so nicht die angepassten Matschpartikel nutzen könnt aus der soilwet.i3D,..
Private Nutzung und Verbreitung ist aber weiterhin kein Problem für sie.
Deshalb wird hilfsbedürftigen auch weiterhin unter die Arme gegriffen! Wie gehabt.
Sobald ich Zeit habe, werde ich auch ein paar Videos hochladen.
Also ich nutze ja schon von Anfang an deine LUA-Änderungen und finde die Lösung, einfach und Bequem, die LUA einfach nur austauschen zu müssen. Bei Bedarf noch etwas, nach deiner Anleitung, die Werte ändern und man hat einen riesen Spaß.
Für die Offroader unter uns kann man sogar noch mehr Schwierigkeit rein bringen und richtige Geschicklichkeitsrennen ausfechten.
Für deine Mühe und das Einbringen von mehr Realismus bin ich sehr dankbar. Jetzt kommt auch der von Giants so gepriesene dynamische Boden erst richtig zur Wirkung.
Deine Bemühungen, immer noch mehr daran zu feilen, kann man gar nicht mit genug Lob aufwiegen.
1000 Dank dafür.
...hier ist eine bebilderte Einbauanleitung ziemlich weit unten auf der Seite, mit der Überschrift ".lua ins Modul einbauen". Bitte nach dieser Anleitung verfahren.
Wem die Bilder zu klein sind, kann diese mir strg+ auf seiner Tastatur vergrößern (anschließend mit strg- wieder verkleinern).
Bei dem Entpacken (sowie auch wieder an ZIP-Kompremierten Ordner senden) des "FS17_ForRealModule03_GroundResponse" bitte beachten:
Entpacken: Wenn ihr die"FS17_ForRealModule03_GroundResponse" entpackt, müssten da Folgende Dateien seinen:
Dann die GroundResponse.lua durch meine neue hier erstzen.
Verpacken: zum "verpacken" markiert ihr alle Dateien bis auf die "FS17_ForRealModule03_GroundResponse"-Zip und sendet diese per Rechtsklick eurer Maus an einen "ZIP-kompremierten" Ordner.
Jetzt habt ihr 2 ZIP-Dateien stehen, davon sollte die alte ursprüngliche gelöscht werden, und die neue ZIP (die vorläufig einen Namen der 6 Unterdateien annimmt).
Diese bitte noch umbenennen in "FS17_ForRealModule03_GroundResponse" und dann ab in de LS17 Modordner.
Ich kann mir die mod nicht downloaden dann kommt dieser Text:
-- -- GroundResponse -- -- -- @author GIANTS Software -- @date 15/10/2016 -- @tester rachederasen 28/02/2017 -- Copyright (C) GIANTS Software GmbH, Confidential, All Rights Reserved. GroundResponse = {}; function GroundResponse.prerequisitesPresent(specializations) return true; end function GroundResponse:load(savegame) self.loadParticleSystemsForWheel = GroundResponse.loadParticleSystemsForWheel; self.updateWheelDirtPS = GroundResponse.updateWheelDirtPS; self.updateWheelSink = GroundResponse.updateWheelSink; self.getWheelCurrentSink = GroundResponse.getWheelCurrentSink; self.updateWheelTireFriction = Utils.overwrittenFunction(self.updateWheelTireFriction, GroundResponse.updateWheelTireFriction); self.applyRandomForceToWheels = GroundResponse.applyRandomForceToWheels; if g_currentMission.wheelDirt ~= nil and g_currentMission.wheelDirt.referenceShape ~= nil and g_currentMission.wheelDirt.referencePS["soilDry"] ~= nil and g_currentMission.wheelDirt.referencePS["soilWet"] ~= nil then if self.wheels ~= nil and table.getn(self.wheels) > 0 then local numWheels = table.getn(self.wheels); for iWheel=1,numWheels do local wheel = self.wheels[iWheel]; if wheel.hasParticles then local refNode = wheel.node; self:loadParticleSystemsForWheel(refNode, wheel) if wheel.additionalWheels ~= nil then for _,additionalWheel in pairs(wheel.additionalWheels) do self:loadParticleSystemsForWheel(refNode, additionalWheel); end end end end for iWheel=1,numWheels do local wheel1 = self.wheels[iWheel]; if wheel1.oppositeWheelIndex == nil then for jWheel=1,numWheels do if iWheel ~= jWheel then local wheel2 = self.wheels[jWheel]; if math.abs(wheel1.positionX + wheel2.positionX) < 0.1 and math.abs(wheel1.positionZ - wheel2.positionZ) < 0.1 and math.abs(wheel1.positionY - wheel2.positionY) < 0.1 then wheel1.oppositeWheelIndex = jWheel; wheel2.oppositeWheelIndex = iWheel; break; end end end end end end end self.dirtParticleSystemDirtyFlag = self:getNextDirtyFlag(); end function GroundResponse:postLoad(savegame) for _,wheel in pairs(self.wheels) do wheel.sink = 0; wheel.sinkTarget = 0; wheel.radiusOriginal = wheel.radius; wheel.sinkFrictionScaleFactor = 1; wheel.sinkLongStiffnessFactor = 1; wheel.sinkLatStiffnessFactor = 1; end end function GroundResponse:loadParticleSystemsForWheel(refNode, wheel) wheel.dirtPS = {}; local psEmitterShape = clone(g_currentMission.wheelDirt.referenceShape, false, false, false); link(refNode, psEmitterShape); local x,y,z; if wheel.wheelTire == nil then x,y,z = localToLocal(wheel.driveNode, refNode, 0, 0, 0); else x,y,z = localToLocal(wheel.wheelTire, refNode, 0, 0, 0); end setTranslation(psEmitterShape, x+wheel.xOffset,y,z); setRotation(psEmitterShape, 0, 0, 0); setScale(psEmitterShape, 2*wheel.width, 2*wheel.radius, 2*wheel.radius); for _,name in pairs( {"soilDry", "soilWet"} ) do if g_currentMission.wheelDirt.referencePS[name] ~= nil then wheel.dirtPS[name] = {}; local psClone = clone(g_currentMission.wheelDirt.referencePS[name].shape, true, false, true); ParticleUtil.loadParticleSystemFromNode(psClone, wheel.dirtPS[name], false, g_currentMission.wheelDirt.referencePS[name].worldSpace, g_currentMission.wheelDirt.referencePS[name].forceFullLifespan); ParticleUtil.setEmitterShape(wheel.dirtPS[name], psEmitterShape); wheel.dirtPS[name].isActive = false; wheel.dirtPS[name].isActiveSend = false; wheel.dirtPS[name].particleSpeed = ParticleUtil.getParticleSystemSpeed(wheel.dirtPS[name]); wheel.dirtPS[name].particleRandomSpeed = ParticleUtil.getParticleSystemSpeedRandom(wheel.dirtPS[name]); --wheel.dirtPS[name].particleNormalSpeed = ParticleUtil.getParticleSystemNormalSpeed(wheel.dirtPS[name]); --wheel.dirtPS[name].particleTangentSpeed = ParticleUtil.getParticleSystemTangentSpeed(wheel.dirtPS[name]); end end end function GroundResponse:delete() for _,wheel in pairs(self.wheels) do ParticleUtil.deleteParticleSystems(wheel.dirtPS); if wheel.additionalWheels ~= nil then for _,additionalWheel in pairs(wheel.additionalWheels) do ParticleUtil.deleteParticleSystems(additionalWheel.dirtPS); end end end end function GroundResponse:mouseEvent(posX, posY, isDown, isUp, button) end function GroundResponse:keyEvent(unicode, sym, modifier, isDown) end function GroundResponse:readUpdateStream(streamId, timestamp, connection) if connection:getIsServer() then local dirty = streamReadBool(streamId); if dirty then for _,wheel in pairs(self.wheels) do wheel.dirtParticlesActive = streamReadBool(streamId); end end end end function GroundResponse:writeUpdateStream(streamId, connection, dirtyMask) if not connection:getIsServer() then if streamWriteBool(streamId, bitAND(dirtyMask, self.dirtParticleSystemDirtyFlag) ~= 0) then for _,wheel in pairs(self.wheels) do streamWriteBool(streamId, wheel.dirtParticlesActive); end end end end function GroundResponse:update(dt) if self.isServer then if self:getIsActive() then self:updateWheelSink(dt); self:applyRandomForceToWheels(dt); end end end function GroundResponse:updateTick(dt) if self.isClient then for _,wheel in pairs(self.wheels) do if wheel.dirtPS ~= nil then if wheel.netInfo.xDriveLast == nil then wheel.netInfo.xDriveLast = wheel.netInfo.xDrive; end local xDriveDiff = wheel.netInfo.xDrive - wheel.netInfo.xDriveLast; if xDriveDiff > math.pi then wheel.netInfo.xDriveLast = wheel.netInfo.xDriveLast + 2*math.pi; elseif xDriveDiff < -math.pi then wheel.netInfo.xDriveLast = wheel.netInfo.xDriveLast - 2*math.pi; end xDriveDiff = wheel.netInfo.xDrive - wheel.netInfo.xDriveLast; wheel.netInfo.xDriveLast = wheel.netInfo.xDrive; local wheelRotSpeed = math.deg(xDriveDiff) / (0.001 * dt); local maxWheelRotSpeed = 1080; local wheelRotFactor = math.abs(wheelRotSpeed) / maxWheelRotSpeed; wheelRotFactor = wheelRotFactor * wheel.radius; self:updateWheelDirtPS(wheel, wheelRotFactor, wheel.steeringAngle); if wheel.additionalWheels ~= nil then for _,additionalWheel in pairs(wheel.additionalWheels) do self:updateWheelDirtPS(additionalWheel, wheelRotFactor, wheel.steeringAngle); end end end end end end function GroundResponse:updateWheelDirtPS(wheel, wheelRotFactor, steeringAngle) if wheel.dirtPS ~= nil then local sizeScale = 2 * wheel.width * wheel.radius; for _,ps in pairs(wheel.dirtPS) do ParticleUtil.setEmittingState(ps, ps.isActive); if ps.isActive then -- emit count local speedEmitScale = wheelRotFactor * sizeScale; local speedEmitScaleWet = math.pow( 2*wheelRotFactor*sizeScale*g_currentMission.environment.groundWetness, 2 ); local emitScale = 0.5 * (speedEmitScale + speedEmitScaleWet); ParticleUtil.setEmitCountScale(ps, emitScale); -- speeds local speedFactor = 0.3 * wheelRotFactor; local speed = ps.particleSpeed * speedFactor; speed = math.min(speed, 0.001); ParticleUtil.setParticleSystemSpeed(ps, speed); --ParticleUtil.setParticleSystemNormalSpeed(ps, 1.0 ); --ParticleUtil.getParticleSystemTangentSpeed(ps, 0.4 ); ParticleUtil.setParticleSystemSpeedRandom(ps, ps.particleRandomSpeed * speedFactor); -- adjust position local dirSign = 1; if self.movingDirection < 0 then dirSign = -1; end local x,y,z; if wheel.wheelTire == nil then x,y,z = localToLocal(wheel.driveNode, getParent(ps.emitterShape), wheel.xOffset, 0, 0); else x,y,z = localToLocal(wheel.wheelTire, getParent(ps.emitterShape), 0, 0, 0); end setTranslation(ps.emitterShape, x,y,z); if self.movingDirection < 0 then setRotation(ps.emitterShape, 0,math.pi+steeringAngle,0); else setRotation(ps.emitterShape, 0,steeringAngle,0); end end end end end function GroundResponse:draw() end function GroundResponse:updateWheelSink(dt) local speed = self:getLastSpeed(); local detailId = g_currentMission.terrainDetailId; for _,wheel in pairs(self.wheels) do local width = 0.25 * wheel.width; local length = 0.25 * wheel.width; local x0,y0,z0; local x1,y1,z1; local x2,y2,z2; if wheel.repr == wheel.driveNode then x0,y0,z0 = localToWorld(wheel.node, wheel.positionX + width, wheel.positionY, wheel.positionZ - length); x1,y1,z1 = localToWorld(wheel.node, wheel.positionX - width, wheel.positionY, wheel.positionZ - length); x2,y2,z2 = localToWorld(wheel.node, wheel.positionX + width, wheel.positionY, wheel.positionZ + length); else local x,_,z = localToLocal(wheel.driveNode, wheel.repr, 0,0,0); x0,y0,z0 = localToWorld(wheel.repr, x + width, 0, z - length); x1,y1,z1 = localToWorld(wheel.repr, x - width, 0, z - length); x2,y2,z2 = localToWorld(wheel.repr, x + width, 0, z + length); end local x,z, widthX,widthZ, heightX,heightZ = Utils.getXZWidthAndHeight(nil, x0,z0, x1,z1, x2,z2); setDensityCompareParams(detailId, "greater", 0); local density, area, _ = getDensityParallelogram(detailId, x,z, widthX,widthZ, heightX,heightZ, g_currentMission.terrainDetailTypeFirstChannel, g_currentMission.terrainDetailTypeNumChannels); setDensityCompareParams(detailId, "greater", -1); local terrainValue = 0; if area > 0 then terrainValue = math.floor(density/area + 0.5); end local minVal, maxVal = 0, 1; local sinkSpeed = (dt/1000) * (speed/10) * (0.01 * math.random(120)); local maxSink = math.min(0.3, wheel.radius*0.7 * (0.8 + 0.5*g_currentMission.environment.groundWetness)) * 1.0; -- Multiplikator Zieleinsinktiefe von 0.6 - 1.3 if terrainValue == 1 then -- cultivator_gegrubberter Boden minVal, maxVal = 180, 180; -- Verhealtniswert im Ziel zum maximalem Einsinken sinkSpeed = sinkSpeed * 0.5; elseif terrainValue == 2 then -- plough_gepflügter Boden minVal, maxVal = 100, 100; sinkSpeed = sinkSpeed * 0.6; elseif terrainValue == 3 then -- sowing_gesähter Boden wie Weizen_Gerste_Raps minVal, maxVal = 110, 110; sinkSpeed = sinkSpeed * 0.3; elseif terrainValue == 4 then -- sowingWidth_gedrillter Boden wie Mais_Sonnenblumen minVal, maxVal = 120, 120; sinkSpeed = sinkSpeed * 0.4; elseif terrainValue == 5 then -- grass_Gras minVal, maxVal = 20, 30; sinkSpeed = sinkSpeed * 0.5; end local ploughEffect = false; if area == 0 then wheel.sinkTarget = 0; else if wheel.sink == wheel.sinkTarget or wheel.lastTerrainValue ~= terrainValue then local currentSink = self:getWheelCurrentSink(wheel); wheel.sinkTarget = math.min(maxSink, 0.01 * math.random(minVal, maxVal) * currentSink); -- 'ploughing effect' if terrainValue == 2 and wheel.oppositeWheelIndex ~= nil then local oppositeWheel = self.wheels[wheel.oppositeWheelIndex]; if oppositeWheel.lastTerrainValue ~= nil and oppositeWheel.lastTerrainValue ~= 2 then wheel.sinkTarget = wheel.sinkTarget * 1.5; ploughEffect = true; end end end end if wheel.sinkTarget ~= wheel.sink then local sinkDelta = maxSink * sinkSpeed; if terrainValue ~= wheel.lastTerrainValue then sinkDelta = maxSink * (dt/250); end if wheel.sink < wheel.sinkTarget then wheel.sink = math.min(wheel.sinkTarget, wheel.sink + sinkDelta); elseif wheel.sink > wheel.sinkTarget then wheel.sink = math.max(wheel.sinkTarget, wheel.sink - sinkDelta); end wheel.radius = wheel.radiusOriginal - wheel.sink; self:updateWheelBase(wheel); local sinkFactor = (wheel.sink/maxSink) * (0.4 + 0.6*g_currentMission.environment.groundWetness); -- bestimmt Einsinkverhalten_erste Zahl trockener Boden_zweite Zahl nasser Boden wheel.sinkFrictionScaleFactor = (1.0 - math.min(0.7, sinkFactor)); -- Traktion bei Einsinktiefe wheel.sinkLongStiffnessFactor = (1.0 - math.min(0.2, sinkFactor)); -- Bodensteiffigkeit in Fahrtrichtung beim Einsinken wheel.sinkLatStiffnessFactor = (1.0 - math.min(0.0, sinkFactor)); -- Bodensteiffigkeit in Querrichtung beim Einsinken self:updateWheelTireFriction(wheel); end wheel.lastTerrainValue = terrainValue; if wheel.dirtPS ~= nil then local enableSoilPS = false; if terrainValue == 1 then -- cultivator enableSoilPS = true; elseif terrainValue == 2 then -- plough enableSoilPS = true; elseif terrainValue == 3 then -- sowing enableSoilPS = true; elseif terrainValue == 4 then -- sowingWidth enableSoilPS = true; elseif terrainValue == 5 then -- grass enableSoilPS = false; end for _,ps in pairs(wheel.dirtPS) do ps.isActive = false; end if enableSoilPS and (speed > 1) and wheel.sink > 0 then if g_currentMission.environment.groundWetness > 0.2 then if wheel.dirtPS["soilWet"] ~= nil then wheel.dirtPS["soilWet"].isActive = true; end else if wheel.dirtPS["soilDry"] ~= nil then wheel.dirtPS["soilDry"].isActive = true; end end end if wheel.additionalWheels ~= nil then for _,additionalWheel in pairs(wheel.additionalWheels) do for _,ps in pairs(additionalWheel.dirtPS) do ps.isActive = enableSoilPS and (speed > 1) and wheel.sink > 0; end end end end end end function GroundResponse:getWheelCurrentSink(wheel) if wheel.maxDeformation == nil or wheel.wheelTire == nil then return 0; end local gravity = 9.81; local tireLoad = getWheelShapeContactForce(wheel.node, wheel.wheelShape); if tireLoad ~= nil then local nx,ny,nz = getWheelShapeContactNormal(wheel.node, wheel.wheelShape); local dx,dy,dz = localDirectionToWorld(wheel.node, 0,-1,0); tireLoad = -tireLoad*Utils.dotProduct(dx,dy,dz, nx,ny,nz); tireLoad = tireLoad + math.max(ny*gravity, 0.0) * wheel.mass; -- add gravity force of tire else tireLoad = 0; end tireLoad = tireLoad / gravity; local loadFactor = (tireLoad / wheel.restLoad); local totalWidth = wheel.width; if wheel.additionalWheels ~= nil then for _,additionalWheel in pairs(wheel.additionalWheels) do totalWidth = totalWidth + additionalWheel.width; end end local length = 2 * math.pi * (wheel.radius *1.5) * (20/360); -- Tragfähigkeit Reifenumfang local area = totalWidth * length; local loadFactor = math.min(10, loadFactor * 0.4 * (1.0/area) * (0.5 + (0.5*g_currentMission.environment.groundWetness))); -- bestimmt Einfluss der Ladung auf das Einsinken maxSink = loadFactor * wheel.maxDeformation; return maxSink; end function GroundResponse:updateWheelTireFriction(superFunc, wheel) if self.isServer and self.isAddedToPhysics then setWheelShapeTireFriction(wheel.node, wheel.wheelShape, wheel.sinkFrictionScaleFactor*wheel.maxLongStiffness, wheel.sinkLatStiffnessFactor*wheel.maxLatStiffness, wheel.maxLatStiffnessLoad, wheel.sinkFrictionScaleFactor*wheel.frictionScale*wheel.tireGroundFrictionCoeff); end; end function GroundResponse:applyRandomForceToWheels(dt) local numWheels = table.getn(self.wheels); if numWheels == 0 or not self:getIsActive() then return; end local speed = self:getLastSpeed(); local forceFactor = 0.001; local totalMass = 0; for _,component in pairs(self.components) do totalMass = totalMass + getMass(component.node); end for i=1, numWheels do local wheel = self.wheels[i]; if speed > 1 then if wheel.nextRandomHitTime == nil then local hitDistance = math.random(1, numWheels) * 0.5; local speedMS = speed / 3.6; local timeDelta = math.min(1000, (1000 * hitDistance / speedMS)); wheel.nextRandomHitTime = g_currentMission.time + timeDelta; end end if wheel.nextRandomHitTime ~= nil and wheel.nextRandomHitTime < g_currentMission.time then if wheel.hasGroundContact and wheel.contact == Vehicle.WHEEL_GROUND_CONTACT and wheel.forcePercentage == nil then local r1, r2 = Utils.getNormallyDistributedRandomVariables(5, 5*0.333); r1 = math.max(0.0001, r1); r2 = math.max(1, r2); -- linear influence of speed results in too intense hits --local force = forceFactor * totalMass * speed * r1; -- square root is better local force = forceFactor * totalMass * math.sqrt(speed) * r1 * 0.2; local maxForce = forceFactor * (totalMass * 0.5); force = math.min(force, maxForce); wheel.timeTillFullForce = r2 * 50; -- max. ~500ms wheel.forcePercentage = 0; wheel.currentForce = force; end end if wheel.currentForce ~= nil then local delta = (dt/wheel.timeTillFullForce) * 0.01 * math.random(20); if speed > 1 and not wheel.maxForceReached then wheel.forcePercentage = math.min(1, wheel.forcePercentage + delta); else wheel.forcePercentage = math.max(0, wheel.forcePercentage - delta); end local currentForce = wheel.forcePercentage * wheel.currentForce; local dx,dy,dz = 0,-currentForce,0; --local dx,dy,dz = localDirectionToWorld(wheel.node, 0,-currentForce,0); local px,py,pz = localToLocal(wheel.driveNode, wheel.node, 0,0,0); addImpulse(wheel.node, dx,dy,dz, px,py,pz, true); --addForce(wheel.node, dx,dy,dz, px,py,pz, true); if wheel.forcePercentage == 1 then wheel.maxForceReached = true; end if wheel.maxForceReached and wheel.forcePercentage == 0 then wheel.forcePercentage = nil; wheel.currentForce = nil; wheel.nextRandomHitTime = nil; wheel.maxForceReached = false end end end end
Das Ground Response Modul 3: V1.0.2.0 von Giants ist kompatibel mit meiner GroundResponse.lua V1.5 und V1.6
(Da beim Update nur die ModDesc und register.lua von Giants Modul 3 V1.0.2.0 bestehen bleiben und ja identisch zu deren V1.0.1.0 ist, braucht ihr das Update ohnehin nicht machen, denn die groundResponse.lua ist ja entscheidend).
Habe grade gesehen, das die Register.lua verändert wurde in der 1.0.4.0 (Anpassung an anderes Modul und pref. für 1.51 GE)
Muss mir das am Woe mal ansehen.
Sieht so aus, als wäre jetzt die Bedingung von Giants erfüllt, das Ganze Modul 3:Ground Response als Rollback 1.0 verändert hochladen zu dürfen (weil es eine andere Mod darstellt und keine Verwechslungsgefahr mehr besteht,..muss nur in der ModDesc eingetragen werden und der Titel angepasst),
somit muss die groundResponse.lua nicht mehr "eingebaut" werden...
Hatte vorher viel Zeit investiert in MR und GR +GB V1.44 GE, doch seit Patch 1.5 ist wieder einiges anders, und mir fehlt einfach die Zeit und die Lust alles wieder aufeinander abzustimmen.
Einer hat die Kombi von mir mal getestet.
Weis nicht wie die angekommen ist, mir hatte es schon sehr gut gefallen, aber jetzt wieder von vorne habe ich keine Lust mehr zu.
Deshalb werde ich wohl auf September 2018 warten, auf C&C.
ich habe mal eine Frage. Dein Script läuft super und es macht riesig Spaß aber beim Mod-Traktor "John Deere 7R TechMod V2" klappt es nicht! Dieser rutscht und hat auf dem Feld nur durchdrehende Reifen. Die einsinktiefen auf den Böden sind auch deutlich höher!
Muss ich bei dem Traktor (Reifen) noch etwas anpassen?
Ich suche schon länger nach einer Lösung innerhalb der Fahrzeugmods (z.B. der Xerion, sobald der Breitreifen drauf hat, das gleiche Problem, der JD 7030 Premium auf der Vorderachse, der 6R,..usw).
Die Werte sehen aber scheinbar alle richtig aus, die Pfade zu den Trelleborg stimmen auch,...
War nur die letzte Zeit sehr verhindert durch einen Banscheibenvorfalls.
Deshalb kann ich nur 5 min am Tag am PC sitzen...
Moin Andy,
erst einmal Danke, dass du dich so bemühst den Fehler zu finden!
Ich habe noch ein bisschen getestet und ich weis nicht woran es lag, aber der Fehler ist weg. Frag mich nicht woran es jetzt lag. Ich habe zwar immer noch den ,,Fehler", dass die Trecker beim original Modul ein/zwei mal schaukeln, aber bei der überarbeiteten Version ist dies weg.
Falls du mal sehen willst, was ich meine kann ich dir ein Video schicken, wo das zu sehen ist.
danke für die Info.
Habe jetzt noch mal kurz auf der Testmap getestet nur mit dem Modul 3 V1.5.2, Drive Controll, FillMassAdjust, Gearbox, und den Fahrzeugmods...Kein Schaukeln :( bin ratlos
Kanns mir net erklären, habe den 7700 MF mal aufgenommen auf der "an der Ostsee"-Map, meinem TestAreal, der hat die beladenen Bandit 750 und den Fetten Krone Tridem hinter, auf 3 verschidenen Untergründen (Gras, Feld, Straße), kein Schaukeln, auf der neuen Südharz-Map schon.
Das ist für mich grad unverständlich...
Lade gerne ein Video hoch zum Beweis.
Das Problem, das du beschreibst, mit dem Schaukeln ist mir (wenn auch nur in abgeschwächter Form) auch aufgefallen.
Nur bei mir sind nur einige Tridem (und auch nur voll beladen) betroffen. Der Bandit 750 machts z.B. net.
Wenn ich die nächsten Tage mal wieder Zeit finde mich etwas länger an den PC zu setzen, als nur 5 min, dann schaue ich mal wo durch dies ausgelöst werden könnte.
Hatte auch schon mal in einem meiner unzähligen Tests beobachtet, dass das Schaukeln mit dem Standart Modul 3 genau so auftritt.
Könnte auch an einer anderen Mod liegen,...
Um nach dem Problem mit einigen Rädern von Modschleppern zu suchen bin ich auch nocht nicht gekommen,...
Guten Tag,
ich habe selber gestern ein bisschen rumgetestet und mir ist aufgefallen das es nicht an einer anderen Mod liegt und das der Effekt durch die bearbeitete lua nur verstärkt wird. Der Effekt tritt nämlich auch auf wenn man das Original Modul ohne überarbeitete lua verwendet, allerdings schaukelt das Gespann dann nur ein/zwei mal und dann steht es.
Außerdem habe ich bemerkt, dass der Effekt am stärksten mit dem MF 7700 ist und z.B. mit dem Fendt 900 gar nicht auftritt.
Vielleicht hilft dir das weiter bei der Lösung.
LG Omat
Moin Moin,
ich habe dieses Skript runtergeladen und war erst einmal begeistert. Endlich müssen die Schlepper auch mal n bisschen Leistung haben um die Maschinen zu ziehen.
Jetzt habe ich aber folgendes Problem entdeckt:
Wenn ich an einen Schlepper einen Tandem oder Tridem Hänger hänge fängt dieser im Stillstand an zu schaukeln, was sich nur ändert wenn ich den Hänger abkoppel.
Besonders fällt es auf mit dem MF 7700 und dem Krampe Bandit 750 auf einem Feld (egal ob gegrubert/gepflügt oder abgeerntet).
Ich habe schon viel ausprobiert finde den Fehler aber nicht.
Ich nutze das Modul 03 in der neuesten Version ( 1.0.1.0 ) und die Ground Response Version 1.5.
kann mir einer helfen oder hat einer das gleiche Problem ?
Grüße Omat
Habe erst kürzlich mal Zeit gefunden es zu testen die neueste Version und muss sagen Top. Volle Punktzahl und klare Empfehlung aufjedenfall. Einzig bei einem vollen Ballenwagen wie dem Brandtner den man über Modhub beziehen kann, kann es passieren das der Hinterteil manchmal wegdriftet. Aufjedenfall genial und ein muss auf der Sosnovkamap da es ja in den Ostblockstaaten ja eh etwas rauher und schwerer zugeht mit dem lehmartigen Boden. Wer es noch realistischer mag kann auch den Manual Attacher nutzen. Danke fürs teilen.
Genialer Mod war mit einem Xerion 5000 unterwegs und bin im Schlamm (bei Regen) auf dem Feld stecken geblieben trotz Allrad und Vorder- und Hinterachssperre. Einfach fehlende Traction aber der Kirovets 9450 zieht sauber durch wobei er sich auch quält mit dem Lemken 800 Dolomit Tiefenlockerer, genail manchmal zählt doch das größere Eigengewicht und nicht die PS-Anzahl :D
Die Xerion Mod-Schlepper haben Fehler mit der Bereifung und deren Werte (..die ich noch nicht finden konnte...), denn mit Standart Bereifung zieht der Xerion entsprechend der Reifenbreite und dem Durchmesser, wenn du aber die Breitreifen wählst, dann sinkt der Schlepper mehr ein, obwohl die Werte für width (Breite) und Radius stimmen.
Hatte auch kurz mal ein Video hochgeladen, für jemanden der das Problem mit nem anderen Schlepper hatte.
Möglicherweise ist der Wert [widthAndDiam=] schuld, denn hier gibt es abweichungen zu den Standart einstellungen in den Trelleborg XML`s
Ist mir auch gerade aufgefallen bei dem Xerion.
Mit Standard Bereifung ist er im Regen besser auf dem Feld fahrbar als mit Breitreifen oder den Michelin Reifen.
Das ist Schade, denn gerade mit Breitreifen sieht er am besten aus ;-)
Vielleicht findest du ja eine Lösung die du uns mitteilen kannst.
Grüße und ein großes Dankeschön für den tollen Mod!
Servus, ich hatte die vorherige Version der 4Real Module 03 - Bodenbeschaffenheit von ModHub installiert und dort diese lua Datei eingefügt. Es funktionierte Einwandfrei. Als ich aber mit einem Freund MP spielen wollte, (er hatte die neue Version der 4Real Module 03 Bodenbeschaffenheit) habe ich die neue Version runtergeladen und die alte durch die neue Version ersetzt. Jetzt aber wird der Mod im Spiel nicht mehr angezeigt, obwohl ich ihn im Modsordner habe. Kann mir da jemand helfen? Danke im voraus
Schaue bitte nach, ob das Modul nicht doppelt drin ist im Modordner, und installiere bitte, was ich dir per PN schicke, musst dann nur noch auf den Dedi hochladen.
Die neue Version von Giants tut nichts zur Sache.
Hat sich nichts verbessert.
Man kann getrost die V1.5 auch in das Modul3 V1.0.1.0 installieren, darin ist ja auch nur die GroundResponse.lua verändert worden von Giants, register und ModDesc sind im Fundament bis auf das Changelog identisch.
Ich will mich auch bei Dir für deine geniale Arbeit bedanken.
Du hast es echt drauf, da kann sich Giants eine Scheibe abschneiden, dein skript
ist einfach nur der Hammer jetzt macht der LS richtig Spass.
Vielen ,vielen Dank ,das du deine Arbeit mit uns teilst.
Empfehlung und alle Sterne die es gibt gehören Dir.
Die"realismUpdate_Plough.lua" den Multiplikator auf 1.4 stellen. Die max Einsinktiefe in der GroundResponse zu erhöhen ist für die kleinen Schlepper gefährlich. Würde die lieber auf normal lassen. Gruß Andy
sry vllt hab ich die frage falsch formuliert ..ich meint es wird ja auch eine furche beim pflügen simuliert und die beiden reifen sind zwar drinne aber das Hinterrad is nicht so tief drinne wie das vorderrad
also ich müsste wissen, welcher Schlepper dies ist.
Normalerweise wenn du die Stuffandthings so eingestellt hast, wie in der Beschreibung, dann passt das gut.
Doch weiß ich aus Erfahrung das es Mod Schlepper wie den Xerion 4000 z.B. gibt, die wenig Bodenfreiheit und eine zu niedrige Kolli haben, und sich tatsächlich mit dem Pflug oder Grubber festfahren.
Ist aber schnell im GE angepasst, so habe ich auch den Radium 45 repariert.
Okay danke :D ist nen Mod schlepper aktuell der Claas Axion 950 :D der buddelt sich sofort ein :D aber okay dann weiß ich das jetzt dann nehme ich zum Pflügen und grubbern einen anderen :D zb einen standart schlepper :D Danke für die hilfe
135 Kommentare
Hier eine Video Demo zur V1.5
https://www.youtube.com/watch?v=-69hhRQXO2w
Gruß Andy
Die V1.5 der Ground Response.lua ist endlich fertig.
(Die V1.5 beruht noch auf einem umgeschriebenen 4Real Modul 3: V1.0.0.0, und behebt nicht das Verrutschen durch beladene Frontlader).
V1.5 Final
Realismus Version
- Einsinkverhalten und Grip auf nassem und trockenem Boden individuell angepasst
- das Einsinken verhält sich je nach Bodenart anders
- die sinktirefriction richtet sich speziell nach den steerable`s (lenkbaren Fahrzeugen), damit diese mit stark einsinkenden Rädern fast keine Zugkraft mehr haben
- Anhänger und Geräte haben hohe Längs- und Quersteiffigkeit, damit wird das um die Ecke ziehen bei weichem Boden sehr viel schwieriger
- asynchrone Tragfähigkeit zum Reifendurchmesser damit sich das Einsinkverhalten mehr echten Schleppern in verschiedensten Klassen entspricht
- das Auf- und Abwandern der Anhängerreifen ist nun behoben
- Einsinktiefe der Anhängerräder angepasst
In dieser Version gilt wieder : Auf nassem Boden starkes Einsinken, wenig Grip...bestimmte Bodenarten haben aber auch auf trockem Boden bei hohem Gewicht/cm² hohes Einsinken (z.B. gegrubberter Boden ist sehr weich, gepflügter richtig weich,...)
Damit das "Festbuddeln" auch so gelingt, wie ich es in ungefähr in echt habe, habe ich die Friction Werte der StuffAndThings auf overall 0.85, und field auf 0.60 gestellt !!
(Keine Sorge, dies passt jetzt, da die Anhänger ja nicht von der sinkTireFriction betroffen sind, und somit etwas mehr Quersteiffigkeit beim fahren am Hang bieten.)
Des weiteren hat Giants Stellung bezogen, bezüglich meiner Anfrage nach einem einbaufertigem Modul 3: Ground Response V1.5
Sie möchten dieses nicht selbst als Volldownload anbieten, da sie ja grade ein Update mit diversen fixes (V1.0.1.0) ausgeliefert haben (und wir alle kennen das Ergebnis...)
und möchten auch NICHT das ich es zum Download anbiete, wegen der Verwechslungsgefahr mit ihrem.
Deshalb bleibt uns/euch leider weiterhin nichts anderes übrig, als die .lua ins Originale Modul einzubauen (passt bei V1.0.0.0 und V1.0.1.0).
Schade ist, das ihr so nicht die angepassten Matschpartikel nutzen könnt aus der soilwet.i3D,..
Private Nutzung und Verbreitung ist aber weiterhin kein Problem für sie.
Deshalb wird hilfsbedürftigen auch weiterhin unter die Arme gegriffen! Wie gehabt.
Sobald ich Zeit habe, werde ich auch ein paar Videos hochladen.
Gruß Andy
Also ich nutze ja schon von Anfang an deine LUA-Änderungen und finde die Lösung, einfach und Bequem, die LUA einfach nur austauschen zu müssen. Bei Bedarf noch etwas, nach deiner Anleitung, die Werte ändern und man hat einen riesen Spaß.
Für die Offroader unter uns kann man sogar noch mehr Schwierigkeit rein bringen und richtige Geschicklichkeitsrennen ausfechten.
Für deine Mühe und das Einbringen von mehr Realismus bin ich sehr dankbar. Jetzt kommt auch der von Giants so gepriesene dynamische Boden erst richtig zur Wirkung.
Deine Bemühungen, immer noch mehr daran zu feilen, kann man gar nicht mit genug Lob aufwiegen.
1000 Dank dafür.
https://www.youtube.com/watch?v=hDYKXnZPhXI
Hier ein Video zur Installation
Noch mal für alle, die Fragen zur Installation haben:
http://marhu.net/phpBB3/viewtopic.php?f=194&t=5849&start=10
...hier ist eine bebilderte Einbauanleitung ziemlich weit unten auf der Seite, mit der Überschrift ".lua ins Modul einbauen". Bitte nach dieser Anleitung verfahren.
Wem die Bilder zu klein sind, kann diese mir strg+ auf seiner Tastatur vergrößern (anschließend mit strg- wieder verkleinern).
Bei dem Entpacken (sowie auch wieder an ZIP-Kompremierten Ordner senden) des "FS17_ForRealModule03_GroundResponse" bitte beachten:
Entpacken: Wenn ihr die"FS17_ForRealModule03_GroundResponse" entpackt, müssten da Folgende Dateien seinen:
particleSystems (gelber Ordner)
shaders (gelber Ordner)
GroundResponse (.lua Datei)
icon (Bild, DDS DAtei)
modDesc (xml Datei)
register (.lua Datei)
(und nochmal die ursprüngliche "FS17_ForRealModule03_GroundResponse"-Zip)
Dann die GroundResponse.lua durch meine neue hier erstzen.
Verpacken: zum "verpacken" markiert ihr alle Dateien bis auf die "FS17_ForRealModule03_GroundResponse"-Zip und sendet diese per Rechtsklick eurer Maus an einen "ZIP-kompremierten" Ordner.
Jetzt habt ihr 2 ZIP-Dateien stehen, davon sollte die alte ursprüngliche gelöscht werden, und die neue ZIP (die vorläufig einen Namen der 6 Unterdateien annimmt).
Diese bitte noch umbenennen in "FS17_ForRealModule03_GroundResponse" und dann ab in de LS17 Modordner.
Das wars schon.
Ich kann mir die mod nicht downloaden dann kommt dieser Text:
-- -- GroundResponse -- -- -- @author GIANTS Software -- @date 15/10/2016 -- @tester rachederasen 28/02/2017 -- Copyright (C) GIANTS Software GmbH, Confidential, All Rights Reserved. GroundResponse = {}; function GroundResponse.prerequisitesPresent(specializations) return true; end function GroundResponse:load(savegame) self.loadParticleSystemsForWheel = GroundResponse.loadParticleSystemsForWheel; self.updateWheelDirtPS = GroundResponse.updateWheelDirtPS; self.updateWheelSink = GroundResponse.updateWheelSink; self.getWheelCurrentSink = GroundResponse.getWheelCurrentSink; self.updateWheelTireFriction = Utils.overwrittenFunction(self.updateWheelTireFriction, GroundResponse.updateWheelTireFriction); self.applyRandomForceToWheels = GroundResponse.applyRandomForceToWheels; if g_currentMission.wheelDirt ~= nil and g_currentMission.wheelDirt.referenceShape ~= nil and g_currentMission.wheelDirt.referencePS["soilDry"] ~= nil and g_currentMission.wheelDirt.referencePS["soilWet"] ~= nil then if self.wheels ~= nil and table.getn(self.wheels) > 0 then local numWheels = table.getn(self.wheels); for iWheel=1,numWheels do local wheel = self.wheels[iWheel]; if wheel.hasParticles then local refNode = wheel.node; self:loadParticleSystemsForWheel(refNode, wheel) if wheel.additionalWheels ~= nil then for _,additionalWheel in pairs(wheel.additionalWheels) do self:loadParticleSystemsForWheel(refNode, additionalWheel); end end end end for iWheel=1,numWheels do local wheel1 = self.wheels[iWheel]; if wheel1.oppositeWheelIndex == nil then for jWheel=1,numWheels do if iWheel ~= jWheel then local wheel2 = self.wheels[jWheel]; if math.abs(wheel1.positionX + wheel2.positionX) < 0.1 and math.abs(wheel1.positionZ - wheel2.positionZ) < 0.1 and math.abs(wheel1.positionY - wheel2.positionY) < 0.1 then wheel1.oppositeWheelIndex = jWheel; wheel2.oppositeWheelIndex = iWheel; break; end end end end end end end self.dirtParticleSystemDirtyFlag = self:getNextDirtyFlag(); end function GroundResponse:postLoad(savegame) for _,wheel in pairs(self.wheels) do wheel.sink = 0; wheel.sinkTarget = 0; wheel.radiusOriginal = wheel.radius; wheel.sinkFrictionScaleFactor = 1; wheel.sinkLongStiffnessFactor = 1; wheel.sinkLatStiffnessFactor = 1; end end function GroundResponse:loadParticleSystemsForWheel(refNode, wheel) wheel.dirtPS = {}; local psEmitterShape = clone(g_currentMission.wheelDirt.referenceShape, false, false, false); link(refNode, psEmitterShape); local x,y,z; if wheel.wheelTire == nil then x,y,z = localToLocal(wheel.driveNode, refNode, 0, 0, 0); else x,y,z = localToLocal(wheel.wheelTire, refNode, 0, 0, 0); end setTranslation(psEmitterShape, x+wheel.xOffset,y,z); setRotation(psEmitterShape, 0, 0, 0); setScale(psEmitterShape, 2*wheel.width, 2*wheel.radius, 2*wheel.radius); for _,name in pairs( {"soilDry", "soilWet"} ) do if g_currentMission.wheelDirt.referencePS[name] ~= nil then wheel.dirtPS[name] = {}; local psClone = clone(g_currentMission.wheelDirt.referencePS[name].shape, true, false, true); ParticleUtil.loadParticleSystemFromNode(psClone, wheel.dirtPS[name], false, g_currentMission.wheelDirt.referencePS[name].worldSpace, g_currentMission.wheelDirt.referencePS[name].forceFullLifespan); ParticleUtil.setEmitterShape(wheel.dirtPS[name], psEmitterShape); wheel.dirtPS[name].isActive = false; wheel.dirtPS[name].isActiveSend = false; wheel.dirtPS[name].particleSpeed = ParticleUtil.getParticleSystemSpeed(wheel.dirtPS[name]); wheel.dirtPS[name].particleRandomSpeed = ParticleUtil.getParticleSystemSpeedRandom(wheel.dirtPS[name]); --wheel.dirtPS[name].particleNormalSpeed = ParticleUtil.getParticleSystemNormalSpeed(wheel.dirtPS[name]); --wheel.dirtPS[name].particleTangentSpeed = ParticleUtil.getParticleSystemTangentSpeed(wheel.dirtPS[name]); end end end function GroundResponse:delete() for _,wheel in pairs(self.wheels) do ParticleUtil.deleteParticleSystems(wheel.dirtPS); if wheel.additionalWheels ~= nil then for _,additionalWheel in pairs(wheel.additionalWheels) do ParticleUtil.deleteParticleSystems(additionalWheel.dirtPS); end end end end function GroundResponse:mouseEvent(posX, posY, isDown, isUp, button) end function GroundResponse:keyEvent(unicode, sym, modifier, isDown) end function GroundResponse:readUpdateStream(streamId, timestamp, connection) if connection:getIsServer() then local dirty = streamReadBool(streamId); if dirty then for _,wheel in pairs(self.wheels) do wheel.dirtParticlesActive = streamReadBool(streamId); end end end end function GroundResponse:writeUpdateStream(streamId, connection, dirtyMask) if not connection:getIsServer() then if streamWriteBool(streamId, bitAND(dirtyMask, self.dirtParticleSystemDirtyFlag) ~= 0) then for _,wheel in pairs(self.wheels) do streamWriteBool(streamId, wheel.dirtParticlesActive); end end end end function GroundResponse:update(dt) if self.isServer then if self:getIsActive() then self:updateWheelSink(dt); self:applyRandomForceToWheels(dt); end end end function GroundResponse:updateTick(dt) if self.isClient then for _,wheel in pairs(self.wheels) do if wheel.dirtPS ~= nil then if wheel.netInfo.xDriveLast == nil then wheel.netInfo.xDriveLast = wheel.netInfo.xDrive; end local xDriveDiff = wheel.netInfo.xDrive - wheel.netInfo.xDriveLast; if xDriveDiff > math.pi then wheel.netInfo.xDriveLast = wheel.netInfo.xDriveLast + 2*math.pi; elseif xDriveDiff < -math.pi then wheel.netInfo.xDriveLast = wheel.netInfo.xDriveLast - 2*math.pi; end xDriveDiff = wheel.netInfo.xDrive - wheel.netInfo.xDriveLast; wheel.netInfo.xDriveLast = wheel.netInfo.xDrive; local wheelRotSpeed = math.deg(xDriveDiff) / (0.001 * dt); local maxWheelRotSpeed = 1080; local wheelRotFactor = math.abs(wheelRotSpeed) / maxWheelRotSpeed; wheelRotFactor = wheelRotFactor * wheel.radius; self:updateWheelDirtPS(wheel, wheelRotFactor, wheel.steeringAngle); if wheel.additionalWheels ~= nil then for _,additionalWheel in pairs(wheel.additionalWheels) do self:updateWheelDirtPS(additionalWheel, wheelRotFactor, wheel.steeringAngle); end end end end end end function GroundResponse:updateWheelDirtPS(wheel, wheelRotFactor, steeringAngle) if wheel.dirtPS ~= nil then local sizeScale = 2 * wheel.width * wheel.radius; for _,ps in pairs(wheel.dirtPS) do ParticleUtil.setEmittingState(ps, ps.isActive); if ps.isActive then -- emit count local speedEmitScale = wheelRotFactor * sizeScale; local speedEmitScaleWet = math.pow( 2*wheelRotFactor*sizeScale*g_currentMission.environment.groundWetness, 2 ); local emitScale = 0.5 * (speedEmitScale + speedEmitScaleWet); ParticleUtil.setEmitCountScale(ps, emitScale); -- speeds local speedFactor = 0.3 * wheelRotFactor; local speed = ps.particleSpeed * speedFactor; speed = math.min(speed, 0.001); ParticleUtil.setParticleSystemSpeed(ps, speed); --ParticleUtil.setParticleSystemNormalSpeed(ps, 1.0 ); --ParticleUtil.getParticleSystemTangentSpeed(ps, 0.4 ); ParticleUtil.setParticleSystemSpeedRandom(ps, ps.particleRandomSpeed * speedFactor); -- adjust position local dirSign = 1; if self.movingDirection < 0 then dirSign = -1; end local x,y,z; if wheel.wheelTire == nil then x,y,z = localToLocal(wheel.driveNode, getParent(ps.emitterShape), wheel.xOffset, 0, 0); else x,y,z = localToLocal(wheel.wheelTire, getParent(ps.emitterShape), 0, 0, 0); end setTranslation(ps.emitterShape, x,y,z); if self.movingDirection < 0 then setRotation(ps.emitterShape, 0,math.pi+steeringAngle,0); else setRotation(ps.emitterShape, 0,steeringAngle,0); end end end end end function GroundResponse:draw() end function GroundResponse:updateWheelSink(dt) local speed = self:getLastSpeed(); local detailId = g_currentMission.terrainDetailId; for _,wheel in pairs(self.wheels) do local width = 0.25 * wheel.width; local length = 0.25 * wheel.width; local x0,y0,z0; local x1,y1,z1; local x2,y2,z2; if wheel.repr == wheel.driveNode then x0,y0,z0 = localToWorld(wheel.node, wheel.positionX + width, wheel.positionY, wheel.positionZ - length); x1,y1,z1 = localToWorld(wheel.node, wheel.positionX - width, wheel.positionY, wheel.positionZ - length); x2,y2,z2 = localToWorld(wheel.node, wheel.positionX + width, wheel.positionY, wheel.positionZ + length); else local x,_,z = localToLocal(wheel.driveNode, wheel.repr, 0,0,0); x0,y0,z0 = localToWorld(wheel.repr, x + width, 0, z - length); x1,y1,z1 = localToWorld(wheel.repr, x - width, 0, z - length); x2,y2,z2 = localToWorld(wheel.repr, x + width, 0, z + length); end local x,z, widthX,widthZ, heightX,heightZ = Utils.getXZWidthAndHeight(nil, x0,z0, x1,z1, x2,z2); setDensityCompareParams(detailId, "greater", 0); local density, area, _ = getDensityParallelogram(detailId, x,z, widthX,widthZ, heightX,heightZ, g_currentMission.terrainDetailTypeFirstChannel, g_currentMission.terrainDetailTypeNumChannels); setDensityCompareParams(detailId, "greater", -1); local terrainValue = 0; if area > 0 then terrainValue = math.floor(density/area + 0.5); end local minVal, maxVal = 0, 1; local sinkSpeed = (dt/1000) * (speed/10) * (0.01 * math.random(120)); local maxSink = math.min(0.3, wheel.radius*0.7 * (0.8 + 0.5*g_currentMission.environment.groundWetness)) * 1.0; -- Multiplikator Zieleinsinktiefe von 0.6 - 1.3 if terrainValue == 1 then -- cultivator_gegrubberter Boden minVal, maxVal = 180, 180; -- Verhealtniswert im Ziel zum maximalem Einsinken sinkSpeed = sinkSpeed * 0.5; elseif terrainValue == 2 then -- plough_gepflügter Boden minVal, maxVal = 100, 100; sinkSpeed = sinkSpeed * 0.6; elseif terrainValue == 3 then -- sowing_gesähter Boden wie Weizen_Gerste_Raps minVal, maxVal = 110, 110; sinkSpeed = sinkSpeed * 0.3; elseif terrainValue == 4 then -- sowingWidth_gedrillter Boden wie Mais_Sonnenblumen minVal, maxVal = 120, 120; sinkSpeed = sinkSpeed * 0.4; elseif terrainValue == 5 then -- grass_Gras minVal, maxVal = 20, 30; sinkSpeed = sinkSpeed * 0.5; end local ploughEffect = false; if area == 0 then wheel.sinkTarget = 0; else if wheel.sink == wheel.sinkTarget or wheel.lastTerrainValue ~= terrainValue then local currentSink = self:getWheelCurrentSink(wheel); wheel.sinkTarget = math.min(maxSink, 0.01 * math.random(minVal, maxVal) * currentSink); -- 'ploughing effect' if terrainValue == 2 and wheel.oppositeWheelIndex ~= nil then local oppositeWheel = self.wheels[wheel.oppositeWheelIndex]; if oppositeWheel.lastTerrainValue ~= nil and oppositeWheel.lastTerrainValue ~= 2 then wheel.sinkTarget = wheel.sinkTarget * 1.5; ploughEffect = true; end end end end if wheel.sinkTarget ~= wheel.sink then local sinkDelta = maxSink * sinkSpeed; if terrainValue ~= wheel.lastTerrainValue then sinkDelta = maxSink * (dt/250); end if wheel.sink < wheel.sinkTarget then wheel.sink = math.min(wheel.sinkTarget, wheel.sink + sinkDelta); elseif wheel.sink > wheel.sinkTarget then wheel.sink = math.max(wheel.sinkTarget, wheel.sink - sinkDelta); end wheel.radius = wheel.radiusOriginal - wheel.sink; self:updateWheelBase(wheel); local sinkFactor = (wheel.sink/maxSink) * (0.4 + 0.6*g_currentMission.environment.groundWetness); -- bestimmt Einsinkverhalten_erste Zahl trockener Boden_zweite Zahl nasser Boden wheel.sinkFrictionScaleFactor = (1.0 - math.min(0.7, sinkFactor)); -- Traktion bei Einsinktiefe wheel.sinkLongStiffnessFactor = (1.0 - math.min(0.2, sinkFactor)); -- Bodensteiffigkeit in Fahrtrichtung beim Einsinken wheel.sinkLatStiffnessFactor = (1.0 - math.min(0.0, sinkFactor)); -- Bodensteiffigkeit in Querrichtung beim Einsinken self:updateWheelTireFriction(wheel); end wheel.lastTerrainValue = terrainValue; if wheel.dirtPS ~= nil then local enableSoilPS = false; if terrainValue == 1 then -- cultivator enableSoilPS = true; elseif terrainValue == 2 then -- plough enableSoilPS = true; elseif terrainValue == 3 then -- sowing enableSoilPS = true; elseif terrainValue == 4 then -- sowingWidth enableSoilPS = true; elseif terrainValue == 5 then -- grass enableSoilPS = false; end for _,ps in pairs(wheel.dirtPS) do ps.isActive = false; end if enableSoilPS and (speed > 1) and wheel.sink > 0 then if g_currentMission.environment.groundWetness > 0.2 then if wheel.dirtPS["soilWet"] ~= nil then wheel.dirtPS["soilWet"].isActive = true; end else if wheel.dirtPS["soilDry"] ~= nil then wheel.dirtPS["soilDry"].isActive = true; end end end if wheel.additionalWheels ~= nil then for _,additionalWheel in pairs(wheel.additionalWheels) do for _,ps in pairs(additionalWheel.dirtPS) do ps.isActive = enableSoilPS and (speed > 1) and wheel.sink > 0; end end end end end end function GroundResponse:getWheelCurrentSink(wheel) if wheel.maxDeformation == nil or wheel.wheelTire == nil then return 0; end local gravity = 9.81; local tireLoad = getWheelShapeContactForce(wheel.node, wheel.wheelShape); if tireLoad ~= nil then local nx,ny,nz = getWheelShapeContactNormal(wheel.node, wheel.wheelShape); local dx,dy,dz = localDirectionToWorld(wheel.node, 0,-1,0); tireLoad = -tireLoad*Utils.dotProduct(dx,dy,dz, nx,ny,nz); tireLoad = tireLoad + math.max(ny*gravity, 0.0) * wheel.mass; -- add gravity force of tire else tireLoad = 0; end tireLoad = tireLoad / gravity; local loadFactor = (tireLoad / wheel.restLoad); local totalWidth = wheel.width; if wheel.additionalWheels ~= nil then for _,additionalWheel in pairs(wheel.additionalWheels) do totalWidth = totalWidth + additionalWheel.width; end end local length = 2 * math.pi * (wheel.radius *1.5) * (20/360); -- Tragfähigkeit Reifenumfang local area = totalWidth * length; local loadFactor = math.min(10, loadFactor * 0.4 * (1.0/area) * (0.5 + (0.5*g_currentMission.environment.groundWetness))); -- bestimmt Einfluss der Ladung auf das Einsinken maxSink = loadFactor * wheel.maxDeformation; return maxSink; end function GroundResponse:updateWheelTireFriction(superFunc, wheel) if self.isServer and self.isAddedToPhysics then setWheelShapeTireFriction(wheel.node, wheel.wheelShape, wheel.sinkFrictionScaleFactor*wheel.maxLongStiffness, wheel.sinkLatStiffnessFactor*wheel.maxLatStiffness, wheel.maxLatStiffnessLoad, wheel.sinkFrictionScaleFactor*wheel.frictionScale*wheel.tireGroundFrictionCoeff); end; end function GroundResponse:applyRandomForceToWheels(dt) local numWheels = table.getn(self.wheels); if numWheels == 0 or not self:getIsActive() then return; end local speed = self:getLastSpeed(); local forceFactor = 0.001; local totalMass = 0; for _,component in pairs(self.components) do totalMass = totalMass + getMass(component.node); end for i=1, numWheels do local wheel = self.wheels[i]; if speed > 1 then if wheel.nextRandomHitTime == nil then local hitDistance = math.random(1, numWheels) * 0.5; local speedMS = speed / 3.6; local timeDelta = math.min(1000, (1000 * hitDistance / speedMS)); wheel.nextRandomHitTime = g_currentMission.time + timeDelta; end end if wheel.nextRandomHitTime ~= nil and wheel.nextRandomHitTime < g_currentMission.time then if wheel.hasGroundContact and wheel.contact == Vehicle.WHEEL_GROUND_CONTACT and wheel.forcePercentage == nil then local r1, r2 = Utils.getNormallyDistributedRandomVariables(5, 5*0.333); r1 = math.max(0.0001, r1); r2 = math.max(1, r2); -- linear influence of speed results in too intense hits --local force = forceFactor * totalMass * speed * r1; -- square root is better local force = forceFactor * totalMass * math.sqrt(speed) * r1 * 0.2; local maxForce = forceFactor * (totalMass * 0.5); force = math.min(force, maxForce); wheel.timeTillFullForce = r2 * 50; -- max. ~500ms wheel.forcePercentage = 0; wheel.currentForce = force; end end if wheel.currentForce ~= nil then local delta = (dt/wheel.timeTillFullForce) * 0.01 * math.random(20); if speed > 1 and not wheel.maxForceReached then wheel.forcePercentage = math.min(1, wheel.forcePercentage + delta); else wheel.forcePercentage = math.max(0, wheel.forcePercentage - delta); end local currentForce = wheel.forcePercentage * wheel.currentForce; local dx,dy,dz = 0,-currentForce,0; --local dx,dy,dz = localDirectionToWorld(wheel.node, 0,-currentForce,0); local px,py,pz = localToLocal(wheel.driveNode, wheel.node, 0,0,0); addImpulse(wheel.node, dx,dy,dz, px,py,pz, true); --addForce(wheel.node, dx,dy,dz, px,py,pz, true); if wheel.forcePercentage == 1 then wheel.maxForceReached = true; end if wheel.maxForceReached and wheel.forcePercentage == 0 then wheel.forcePercentage = nil; wheel.currentForce = nil; wheel.nextRandomHitTime = nil; wheel.maxForceReached = false end end end end
LUA call stack:
=C:/Users/olhun/Documents/My Games/FarmingSimulator2017/mods/FS17_ForRealModule03_GroundResponse/register.lua (71) : delete
dataS/scripts/BaseMission.lua (371) : deleteMap
dataS/scripts/FSBaseMission.lua (537) : delete
dataS/scripts/utils/Utils.lua (1870) : oldFunc
dataS/scripts/utils/Utils.lua (1858) : oldFunc
dataS/scripts/missions/mission00.lua (84) : delete
dataS/scripts/events.lua (125) : delete
dataS/scripts/gui/InGameMenu.lua (457) : OnInGameMenuMenu
dataS/scripts/gui/InGameMenu.lua (715) : leaveCurrentGame
dataS/scripts/gui/dialogs/YesNoDialog.lua (62) : callbackFunc
dataS/scripts/gui/dialogs/YesNoDialog.lua (50) : sendCallback
dataS/scripts/gui/elements/ButtonElement.lua (191) : raiseCallback
dataS/scripts/gui/elements/GuiElement.lua (279) : mouseEvent
dataS/scripts/gui/elements/GuiElement.lua (279) : mouseEvent
dataS/scripts/gui/elements/GuiElement.lua (279) : mouseEvent
dataS/scripts/gui/elements/GuiElement.lua (279) : mouseEvent
dataS/scripts/gui/elements/Gui.lua (270) : mouseEvent
dataS/scripts/main.lua (1857) : mouseEvent
hallo rachederrasen
kann man diese groundresponse.lua auch mit giants neuem groundresponsemod v 1.0.2.0 verwenden?
lg
andreas
Moin,
ich habe mal eine Frage. Dein Script läuft super und es macht riesig Spaß aber beim Mod-Traktor "John Deere 7R TechMod V2" klappt es nicht! Dieser rutscht und hat auf dem Feld nur durchdrehende Reifen. Die einsinktiefen auf den Böden sind auch deutlich höher!
Muss ich bei dem Traktor (Reifen) noch etwas anpassen?
Gruß Gerrit
Moin Andy,
erst einmal Danke, dass du dich so bemühst den Fehler zu finden!
Ich habe noch ein bisschen getestet und ich weis nicht woran es lag, aber der Fehler ist weg. Frag mich nicht woran es jetzt lag. Ich habe zwar immer noch den ,,Fehler", dass die Trecker beim original Modul ein/zwei mal schaukeln, aber bei der überarbeiteten Version ist dies weg.
Falls du mal sehen willst, was ich meine kann ich dir ein Video schicken, wo das zu sehen ist.
Gruß Omat :D
Kommentarfunktion immer noch inaktiv...
Hier das Video zum Test mit dem MF 7700:
https://www.youtube.com/watch?v=bHvn0MkCaO8
Gruß Andy
Moin Omat,
danke für die Info.
Habe jetzt noch mal kurz auf der Testmap getestet nur mit dem Modul 3 V1.5.2, Drive Controll, FillMassAdjust, Gearbox, und den Fahrzeugmods...Kein Schaukeln :( bin ratlos
Kanns mir net erklären, habe den 7700 MF mal aufgenommen auf der "an der Ostsee"-Map, meinem TestAreal, der hat die beladenen Bandit 750 und den Fetten Krone Tridem hinter, auf 3 verschidenen Untergründen (Gras, Feld, Straße), kein Schaukeln, auf der neuen Südharz-Map schon.
Das ist für mich grad unverständlich...
Lade gerne ein Video hoch zum Beweis.
Gruß Andy
Moin Omat.
Das Problem, das du beschreibst, mit dem Schaukeln ist mir (wenn auch nur in abgeschwächter Form) auch aufgefallen.
Nur bei mir sind nur einige Tridem (und auch nur voll beladen) betroffen. Der Bandit 750 machts z.B. net.
Wenn ich die nächsten Tage mal wieder Zeit finde mich etwas länger an den PC zu setzen, als nur 5 min, dann schaue ich mal wo durch dies ausgelöst werden könnte.
Hatte auch schon mal in einem meiner unzähligen Tests beobachtet, dass das Schaukeln mit dem Standart Modul 3 genau so auftritt.
Könnte auch an einer anderen Mod liegen,...
Um nach dem Problem mit einigen Rädern von Modschleppern zu suchen bin ich auch nocht nicht gekommen,...
Gruß Andy
Moin Moin,
ich habe dieses Skript runtergeladen und war erst einmal begeistert. Endlich müssen die Schlepper auch mal n bisschen Leistung haben um die Maschinen zu ziehen.
Jetzt habe ich aber folgendes Problem entdeckt:
Wenn ich an einen Schlepper einen Tandem oder Tridem Hänger hänge fängt dieser im Stillstand an zu schaukeln, was sich nur ändert wenn ich den Hänger abkoppel.
Besonders fällt es auf mit dem MF 7700 und dem Krampe Bandit 750 auf einem Feld (egal ob gegrubert/gepflügt oder abgeerntet).
Ich habe schon viel ausprobiert finde den Fehler aber nicht.
Ich nutze das Modul 03 in der neuesten Version ( 1.0.1.0 ) und die Ground Response Version 1.5.
kann mir einer helfen oder hat einer das gleiche Problem ?
Grüße Omat
Habe erst kürzlich mal Zeit gefunden es zu testen die neueste Version und muss sagen Top. Volle Punktzahl und klare Empfehlung aufjedenfall. Einzig bei einem vollen Ballenwagen wie dem Brandtner den man über Modhub beziehen kann, kann es passieren das der Hinterteil manchmal wegdriftet. Aufjedenfall genial und ein muss auf der Sosnovkamap da es ja in den Ostblockstaaten ja eh etwas rauher und schwerer zugeht mit dem lehmartigen Boden. Wer es noch realistischer mag kann auch den Manual Attacher nutzen. Danke fürs teilen.
Genialer Mod war mit einem Xerion 5000 unterwegs und bin im Schlamm (bei Regen) auf dem Feld stecken geblieben trotz Allrad und Vorder- und Hinterachssperre. Einfach fehlende Traction aber der Kirovets 9450 zieht sauber durch wobei er sich auch quält mit dem Lemken 800 Dolomit Tiefenlockerer, genail manchmal zählt doch das größere Eigengewicht und nicht die PS-Anzahl :D
Hallo ihr könnt mir bestimmt helfen ist die v1.5 final mp fähig?
Servus, ich hatte die vorherige Version der 4Real Module 03 - Bodenbeschaffenheit von ModHub installiert und dort diese lua Datei eingefügt. Es funktionierte Einwandfrei. Als ich aber mit einem Freund MP spielen wollte, (er hatte die neue Version der 4Real Module 03 Bodenbeschaffenheit) habe ich die neue Version runtergeladen und die alte durch die neue Version ersetzt. Jetzt aber wird der Mod im Spiel nicht mehr angezeigt, obwohl ich ihn im Modsordner habe. Kann mir da jemand helfen? Danke im voraus
Hallo rachederasen,
Ich will mich auch bei Dir für deine geniale Arbeit bedanken.
Du hast es echt drauf, da kann sich Giants eine Scheibe abschneiden, dein skript
ist einfach nur der Hammer jetzt macht der LS richtig Spass.
Vielen ,vielen Dank ,das du deine Arbeit mit uns teilst.
Empfehlung und alle Sterne die es gibt gehören Dir.
Lieben gruß aus München Bogi11
wie kann ich den die einsinktiefe beim pflügen erhöhen ?
Moin Sven90,
also ich müsste wissen, welcher Schlepper dies ist.
Normalerweise wenn du die Stuffandthings so eingestellt hast, wie in der Beschreibung, dann passt das gut.
Doch weiß ich aus Erfahrung das es Mod Schlepper wie den Xerion 4000 z.B. gibt, die wenig Bodenfreiheit und eine zu niedrige Kolli haben, und sich tatsächlich mit dem Pflug oder Grubber festfahren.
Ist aber schnell im GE angepasst, so habe ich auch den Radium 45 repariert.
Gruß Andy