I am making a racing game. When the car I made is going up on a ramp, it becomes a bit jittery. Don't think it's the camera issue as the game looks smooth on plain grounds and when going down a ramp. This is the video of the jittery car movement on ramp: https://youtu.be/6YC6SLsokCw
I followed this tutorial:https://www.youtube.com/watch?v=cqATTzJmFDY&list=PLllUqr_Vxwvto-j8J-Fk2XmjQhn2PcwlZ&index=2
I noticed that in this tutorial, the author's final outcome is also a bit jittery on ramps. This is the code:
{
sphereRb.transform.parent = null;
}
private void Update()
{
speedInput = 0;
if (Input.GetAxis("Vertical") > 0)
{
GetInputForMoving(forwardAccel);
}
else if (Input.GetAxis("Vertical") < 0)
{
GetInputForMoving(reverseAccel);
}
turnInput = Input.GetAxis("Horizontal");
if (grounded)
{
Turning();
}
SetWheelsRotation();
transform.position = sphereRb.transform.position;
}
void GetInputForMoving(float directionAccel)
{
speedInput = Input.GetAxis("Vertical") * directionAccel * multiplier;
}
void Turning()
{
transform.rotation = Quaternion.Euler(transform.rotation.eulerAngles + new Vector3(0f, turnInput * turnStrength * Time.deltaTime, 0f));
}
void SetWheelsRotation()
{
leftFrontWheel.localRotation = Quaternion.Euler(leftFrontWheel.localRotation.eulerAngles.x, (turnInput * maxWheelTurn) - 180, leftFrontWheel.localRotation.eulerAngles.z);
rightFrontWheel.localRotation = Quaternion.Euler(rightFrontWheel.localRotation.eulerAngles.x, (turnInput * maxWheelTurn), rightFrontWheel.localRotation.eulerAngles.z);
}
private void FixedUpdate()
{
grounded = false;
RaycastHit hit;
//if hits ground
if (Physics.Raycast(groundRayPoint.position, -transform.up, out hit, groundRayLength, whatisGround))
{
grounded = true;
transform.rotation = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;
}
if (grounded)
{
Moving();
}
else
{
Dropping();
}
}
void Moving()
{
sphereRb.drag = dragOnGround;
if (Mathf.Abs(speedInput) > 0)
{
sphereRb.AddForce(transform.forward * speedInput);
}
}
void Dropping()
{
sphereRb.drag = 0.1f;
sphereRb.AddForce(Vector3.up * -gravityForce * 100);
}
Please help I am really struggling. Sorry for my English, thanks in advance!
The car movement actually looks fine and seems to translate smoothly.
The real issue is the car rotation.
If you look at this line :
transform.rotation = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;
You are telling the car to align its y-axis according to the mesh normal. However, a slope or ramp will never be perfectly curved. Polygons are shaping the slope and the normals between each "part" of the slope change abruptly : this is why the car rotation is so steep along the slope. You can see it in the Scene view by enabling the wireframe shading mode (option available just under the "Scene" tab).
What you can do is interpolate between the current car rotation and the target rotation with something like the code below :
Quaternion toRotation = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;
float angle = Vector3.Angle(transform.up, hit.normal);
transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, angle * Time.fixedDeltaTime * rotateSpeed);
You'll have to tweak the rotation speed until it matches what you feel is OK. Quaternion.RotateTowards will smoothly interpolate between the current rotation and the target rotation at the speed of angle x rotateSpeed degrees per second. There are better ways to do all of these but I hope this will unlock you with what you currently have.