Marcousik Posted July 11, 2018 Posted July 11, 2018 It is possible to drive in Le 4.5, but first you have to build a little car system, here is what was made until now: I will expose now how far I am with programming this, so that other members can maybe work on this: This is the structure I created: In blue are the most important children to make the car: - the "wheels" - are fake decorativ wheels to make the car looks like a car (not so important) - The "axe" children are pivots that will build through the script the suspensions. (slider joint) - The "direction" children are pivots that will build the steering system (hinge joint) - The "roue" children are cylinder CSG to make the tires. (hinge joint) Here is the script added on the "jeeplight" main object: that is CSG box with invisible material. Okay let see the script: ------------------------------------------------------ Script variables properties: Script.CarMass=200--int "Car Mass" Script.TireMass=10--int "Tire Mass" Script.SpeedMax=1000--int "Max speed" Script.Amort=0.3--float "Amort, long" Script.Force=2000--int "Amort, force" Script.Rayon=0.5--float "Roue, Rayon" Script.Epaiss=1--float "Pneus, Épaisseur" Script.SeeWheels = false --bool "Voir Roues" ------- not so important Script.traction=4--int "traction 2/4" ------------------------------------------------------- function Script:Start() -- Catch the children: self.Axes={} self.Axes[0]=self.entity:FindChild("AxeAvG") self.Axes[1]=self.entity:FindChild("AxeAvD") self.Axes[2]=self.entity:FindChild("AxeArG") self.Axes[3]=self.entity:FindChild("AxeArD") self.Directions={} self.Directions[0]=self.entity:FindChild("DirectionAvG") self.Directions[1]=self.entity:FindChild("DirectionAvD") self.Tires={} -- "real" tires - invisible cylinders self.Tires[0]=self.entity:FindChild("RoueAvG") self.Tires[1]=self.entity:FindChild("RoueAvD") self.Tires[2]=self.entity:FindChild("RoueArG") self.Tires[3]=self.entity:FindChild("RoueArD") self.Wheels={} --- fake wheels "decorativ" not so important self.Wheels[0]=self.entity:FindChild("WheelAvG") self.Wheels[1]=self.entity:FindChild("WheelAvD") self.Wheels[2]=self.entity:FindChild("WheelArG") self.Wheels[3]=self.entity:FindChild("WheelArD") for n=0,3 do self.Wheels[n]:SetParent(self.entity) end self.PosWheels={} self.PosWheels[0]=self.Wheels[0]:GetPosition() self.PosWheels[1]=self.Wheels[1]:GetPosition() self.PosWheels[2]=self.Wheels[2]:GetPosition() self.PosWheels[3]=self.Wheels[3]:GetPosition() for n=0,3 do self.Tires[n]:SetScale(self.Epaiss,self.Rayon*2,self.Rayon*2) self.Tires[n]:SetFriction(10,10) end -- Joints: self.Volants={} self.Rouages={} self.Amortisseurs={} self.currspeed=0 self.entity:SetMass(self.CarMass) -- Construit les amortisseurs: / ------------------------------------- suspensions local n local pos for n=0,3 do pos=self.Axes[n]:GetPosition(true) self.Axes[n]:SetMass(self.TireMass) self.Amortisseurs[n]=Joint:Slider(pos.x, pos.y, pos.z, 0,1,0, self.Axes[n], self.entity) self.Amortisseurs[n]:EnableLimits() self.Amortisseurs[n]:SetLimits(-0.1/2,0.1/2) self.Amortisseurs[n]:SetTargetAngle(-self.Amort) --at the middle if 0 self.Amortisseurs[n]:SetMotorSpeed(1) -- 1 m/s -- vitesse de la pompe self.Amortisseurs[n]:SetStrength(self.Force) --defatul is 1000 self.Amortisseurs[n]:EnableMotor() -- self.Amortisseurs[n]:SetSpring(50000) end -- Double la force des amortisseurs arrieres / --------------------- make the backward suspensions with 2* forces self.Amortisseurs[2]:SetStrength(self.Force*2) self.Amortisseurs[3]:SetStrength(self.Force*2) self.Amortisseurs[2]:SetMotorSpeed(2) self.Amortisseurs[3]:SetMotorSpeed(2) -- Volant: - ------------------------------------------steering: Forward for n=0,1 do pos=self.Directions[n]:GetPosition(true) self.Directions[n]:SetMass(self.TireMass) self.Volants[n]=Joint:Hinge(pos.x, pos.y, pos.z, 0,1,0, self.Directions[n], self.Axes[n]) self.Volants[n]:SetAngle(0) self.Volants[n]:EnableLimits() self.Volants[n]:SetLimits(-30,30) self.Volants[n]:SetMotorSpeed(200) self.Volants[n]:EnableMotor() end -- On attache les roues: /--------------------------------------- attach the tires for n=0,3 do pos=self.Tires[n]:GetPosition(true) self.Tires[n]:SetMass(self.TireMass) if n<2 then self.Rouages[n]=Joint:Hinge(pos.x, pos.y, pos.z, 1,0,0, self.Tires[n], self.Directions[n]) else self.Rouages[n]=Joint:Hinge(pos.x, pos.y, pos.z, 1,0,0, self.Tires[n], self.Axes[n]) end end end ------------------------------------- function Script:UpdatePhysics() if self.MyCar==1 and InCar>0 then --- these ar my own variables to let the player ingame use the car (not so important for now) -- Traite la direction: --- --------------------manage the steering local direction=self.Volants[0]:GetAngle() if window:KeyDown(Key.Left) then direction=direction-5 elseif window:KeyDown(Key.Right) then direction=direction+5 elseif window:KeyDown(Key.Left)==false and window:KeyDown(Key.Right)== false then if Math:Round(direction)>0 then direction=direction-5 elseif Math:Round(direction)<0 then direction=direction+5 end end self.Volants[0]:SetAngle(direction) self.Volants[1]:SetAngle(direction) -- Traite l'acceleration:---------------------------------------------------------- manage acceleration local Gas=0 if window:KeyDown(Key.Up) then Gas=1 self.currspeed = self.currspeed + 10 if self.currspeed>self.SpeedMax then self.currspeed=self.SpeedMax end elseif window:KeyDown(Key.Down) then Gas=1 self.currspeed = self.currspeed - 10 if self.currspeed<-self.SpeedMax then self.currspeed=-self.SpeedMax end end if Gas==0 then self.currspeed=0 for n=0,self.traction-1 do self.Rouages[n]:DisableMotor() end else for n=0,self.traction-1 do if self.Rouages[n]:MotorEnabled()==false then self.Rouages[n]:EnableMotor() end self.Rouages[n]:SetTargetAngle(self.Rouages[n]:GetAngle()+500) self.Rouages[n]:SetMotorSpeed(self.currspeed) end end --limite la velocite angulaire / ----------------------This limits the "twisting" of the car while fast driving, it is not enough but better self.entity:SetOmega(0,0,0) -- fake wheels update: self.Wheels[0]:SetMatrix(self.Tires[0]:GetMatrix()) self.Wheels[1]:SetMatrix(self.Tires[1]:GetMatrix()) self.Wheels[2]:SetMatrix(self.Tires[2]:GetMatrix()) self.Wheels[3]:SetMatrix(self.Tires[3]:GetMatrix()) self.Wheels[0]:SetPosition(self.PosWheels[0]) self.Wheels[1]:SetPosition(self.PosWheels[1]) self.Wheels[2]:SetPosition(self.PosWheels[2]) self.Wheels[3]:SetPosition(self.PosWheels[3]) end --------------------------------- On the posted image above the used properties can be read. Most important are the force and the car mass parameters. Here is what I could test: - I could make out of this a rapid car but I encounter the problem that the car is bouncing in chaos on the road as the acting forces on the chassis are big big. - Augmnenting the mass makes the joints too weak. - I get the idea that the car actually doesn't have 2 axles as it maybe should have. The 2 wheels forward are not bound through an axle just like the backwards too. - As the car drives, the back of the chassis tends to sink to the floor/terrain, that's why I doubled the suspensions forces of the backwards wheels There much more to test in this. (sorry if my english is not so english ?) 1 2 Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.