- Home /
Question by
RedSuinit · Dec 15, 2019 at 12:40 AM ·
raycastdampingsuspension
Can't get a raycast suspension system to work properly.
Hey everyone. I am currently trying to get a raycast based suspension system off the ground and I just cant seem to figure out why my physics engine is going bananas. Here is a .gif of what is going on.
https://www.youtube.com/watch?v=kchI-AURdG8
Here is the code snippet:
void Start()
{
car = this.gameObject.GetComponent<Rigidbody>();
car.centerOfMass = new Vector3(0, -dropCOM, 0);
RaycastHit fLRayHit;
RaycastHit fRRayHit;
RaycastHit rLRayHit;
RaycastHit rRRayHit;
if (Physics.Raycast(fLTire.position, -fLTire.up, out fLRayHit, susLength))
fLPos1 = fLRayHit.distance;
if (Physics.Raycast(fRTire.position, -fRTire.up, out fRRayHit, susLength))
fRPos1 = fRRayHit.distance;
if (Physics.Raycast(rLTire.position, -rLTire.up, out rLRayHit, susLength))
rLPos1 = rLRayHit.distance;
if (Physics.Raycast(rRTire.position, -rRTire.up, out rRRayHit, susLength))
rRPos1 = rRRayHit.distance;
}
// Update is called once per frame
void Update()
{
}
void FixedUpdate()
{
RaycastHit ground;
Ray groundCheck = new Ray(transform.position, -transform.up);
if (Physics.Raycast(groundCheck, out ground, 10f, groundLayer))
{
gravityDir = ground.normal;
Debug.Log(gravityDir);
groundRot = ground.transform.rotation.x;
}
car.AddForce(gravityDir * gravityVal, ForceMode.Acceleration);
RaycastHit fLRayHit;
RaycastHit fRRayHit;
RaycastHit rLRayHit;
RaycastHit rRRayHit;
if (Physics.Raycast(fLTire.position, -fLTire.up, out fLRayHit, susLength))
{
float fLPos2 = fLRayHit.distance;
float velocity = (fLPos1 - fLPos2) / Time.deltaTime;
float fLRatio = (susLength - fLRayHit.distance) / susLength;
float susLift = fLRatio * susForce + velocity * susDamp;
float lift = susLift;
car.AddForceAtPosition(lift * fLTire.up, fLTire.position, ForceMode.Acceleration);
fLPos1 = fLPos2;
}
if (Physics.Raycast(fRTire.position, -fRTire.up, out fRRayHit, susLength))
{
float fRPos2 = fRRayHit.distance;
float velocity = (fRPos1 - fRPos2) / Time.deltaTime;
float fRRatio = (susLength - fRRayHit.distance) / susLength;
float susLift = fRRatio * susForce + velocity * susDamp;
float lift = susLift;
car.AddForceAtPosition(lift * fRTire.up, fRTire.position, ForceMode.Acceleration);
fRPos1 = fRPos2;
}
if (Physics.Raycast(rLTire.position, -rLTire.up, out rLRayHit, susLength))
{
float rLPos2 = rLRayHit.distance;
float velocity = (rLPos1 - rLPos2) / Time.deltaTime;
float rLRatio = (susLength - rLRayHit.distance) / susLength;
float susLift = rLRatio * susForce + velocity * susDamp;
float lift = susLift;
car.AddForceAtPosition(lift * rLTire.up, rLTire.position, ForceMode.Acceleration);
rLPos1 = rLPos2;
}
if (Physics.Raycast(rRTire.position, -rRTire.up, out rRRayHit, susLength))
{
float rRPos2 = rRRayHit.distance;
float velocity = (rRPos1 - rRPos2) / Time.deltaTime;
float rRRatio = (susLength - rRRayHit.distance) / susLength;
float susLift = rRRatio * susForce + velocity * susDamp;
float lift = susLift;
car.AddForceAtPosition(lift * rRTire.up, rRTire.position, ForceMode.Acceleration);
rRPos1 = rRPos2;
}
inputDevice = InputManager.ActiveDevice;
float deadzone = deadZone;
stickInput = new Vector2(inputDevice.LeftStickX, inputDevice.LeftStickY);
if (stickInput.magnitude < deadzone)
stickInput = Vector2.zero;
else
stickInput = stickInput.normalized * ((stickInput.magnitude - deadzone) / (1 - deadzone));
}
I want this to just act like a normal suspension system. Any help would be greatly appreciated. I am still fairly new to this stuff.
The reason for the custom gravity situation is that I want the vehicle to be able to drive on the walls and ceiling.
Thanks
Comment
Your answer
Follow this Question
Related Questions
How should I make a custom suspension system? 1 Answer
raycast animated suspension 0 Answers
Balancing Forces + Gravity 1 Answer
Mouse aim in orthographic view 0 Answers
raycast rigidbody addforce 2 Answers