Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

402
Views
Unity & C# - car going a little bit unsmooth on ramp

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!

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!