Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by Rhony · Jun 14, 2019 at 10:17 PM · c#physicsrigidbodygravitywheelcollider

Issue using wheelColliders around sphere

Hello guys, I hope you're doing well. I need your help on the following issue.


I aim to create a small prototype where you could drive a car around a sphere. The drive style is semi-realistic, meaning that I will use wheelColliders. For now, the car is only going forward at a reasonable speed. Here's a quick shot of the issue :

-->Issue right here <---


As you can see, when the car reaches a certain speed, it loses gravity strength. It is a normal behavior considering physical laws but in this case it's happening very quickly (way too fast actually...). Here's some datas to get an idea of what I am doing (wrong?) :

alt text alt text
I also tried to apply a LOT of forces to my car to be sure that it stays on the ground but when there is too much forces applied on the wheels, the car is going crazy.


As you can see, I tried also to add joints to force the car to not fly. I actually tried a bunch of various ways to achieve this but it is not precise. Often, I end up with jittery wheel effects or similar behavior that I cannot accept.


Here is the only 2 scripts I use :

sCarManager on the car

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class sCarManager : MonoBehaviour {
 
     //WheelColliders
     [SerializeField] private WheelCollider[] wcWheels;
     //Floats
     [SerializeField] private float fMotorTorque;
     private float fCurrentSpeed;
     private float fInitialSpringStrenght;
     //Script
     private sGravityManager sGM;
     //SpringJoint
     private SpringJoint sjJoint;
     //Rigidbody
     private Rigidbody rbRigid;
 
     public static sCarManager instance = null;
 
     private void Awake() {
 
         if (!instance) { instance = this; }
 
     }
 
     private void Start() {
 
         //Initialize script type variables
         sGM = sGravityManager.instance;
         //Initialize the array at 4 and get the wheels from the car
         wcWheels = new WheelCollider[4];
         GameObject goWheelsParent = GameObject.FindGameObjectWithTag("WheelColliders");
         for (int i = 0; i < 4; i++) {
             //Get each wheelCollider from the car
             wcWheels[i] = goWheelsParent.transform.GetChild(i).GetComponent<WheelCollider>();
         }
         //Initialization of Rigidbody
         rbRigid = gameObject.GetComponent<Rigidbody>();
         //Initialization of variable joint
         sjJoint = gameObject.GetComponent<SpringJoint>();
         fInitialSpringStrenght = sjJoint.spring;
 
     }
 
     //Called every fixed frame
     public void FixedUpdate() {
 
         //Apply a torque to all wheels
         ApplyMotorTorque(wcWheels, fMotorTorque);
 
         //Get the current speed of the car
         fCurrentSpeed = rbRigid.velocity.magnitude;
         //Increase joint strenght based on speed
         sjJoint.spring = fCurrentSpeed * fInitialSpringStrenght;
 
     }
 
     //Apply torque to specific wheels
     private void ApplyMotorTorque(WheelCollider[] wcs, float trq) {
 
         for(int i = 0; i < 4; i++) {
             wcs[i].motorTorque = trq;
         }
 
     }
 
 }


sGravityManager on the planet

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class sGravityManager : MonoBehaviour {
 
     //Scripts
     private         sCarManager     sCM;
     //Rigidbodies
     private         Rigidbody       rbCar;
     private         Rigidbody       rbPlanet;
     //Transforms
     private         Transform       trCOM;
     //Vector3
     public          Vector3         v3GravityForceToApply;
     //Instance of this script
     public static   sGravityManager instance = null;
 
     //Launch the very first frame
     private void Awake() {
 
         if(!instance) { instance = this; }
 
     }
 
     private void Start() {
 
         //Initialize script variables
         sCM = sCarManager.instance;
         //Increase fixed timestep pace
         Time.fixedDeltaTime = 0.01f;
         //Get the car and planet RigidBodys
         rbCar = GameObject.FindGameObjectWithTag("Car").GetComponent<Rigidbody>();
         rbPlanet = transform.GetComponent<Rigidbody>();
         //Initialize transforms and script variables
         trCOM = GameObject.FindGameObjectWithTag("COM").transform;
 
     }
     
     private void FixedUpdate() {
 
         #region Constant gravity force
         //Get gravity force based on car and planet positions
         v3GravityForceToApply = GravitySimulation(rbCar, rbPlanet);
         //Apply the force to the RigidBody
         rbCar.AddForce(v3GravityForceToApply);
         #endregion
         
     }
 
     //Method returning the direction in which the car is being pulled
     private Vector3 GravitySimulation(Rigidbody rbc, Rigidbody rbp) {
 
         //rbc -> RigidBodyCar and rbp -> RigidBodyPlanet
         Vector3 v3Direction = rbp.position - trCOM.position;
         float fDistance = v3Direction.magnitude;
 
         float fForceMagnitude = (rbc.mass * rbp.mass) / Mathf.Pow(fDistance, 2);
         Vector3 v3Force = v3Direction.normalized * fForceMagnitude;
 
         return (v3Force);
     }
 }



So, do I need to calculate a force to apply, based on car's velocity, at each frame? Did I miss another inventive way to ground the car for a bit longer? What are your thoughts in this situation guys?


(For those who will suggest to not use wheelColliders, this is not related to this topic. Thank you for your understanding. No offense.)


Thanks for the time spent reading this post, it is a long one!
Rhony

datas.png (380.1 kB)
scenedatas.png (78.3 kB)
Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

1 Reply

· Add your reply
  • Sort: 
avatar image
0

Answer by Shameness · Jun 14, 2019 at 11:03 PM

Gravity force lingers towards the direction when the first time it applied. If you can, tilt whole velocity towards center of the sphere before applying new one. ( as you mentioned )

  float magnitude =  rbc.velocity.magnitude;
  float degToRadian = (Mathf.PI / 180);
  float x_rotation  = transform.eulerAngles.x;
  float x_rotation_in_radian = x_rotation * degToRadian;
  rbc.velocity = new Vector3(0, magnitude * Mathf.sin( x_rotation_in_radian  ), Mathf.cos( x_rotation_in_radian ) );

Documentation suggest to not modify velocity directly, b/c unrealistic physics behavior, its your call.

Or you can make car body fixed and make the sphere rotate under the wheels ? Like the first car race games, road moves. Then rotate camera reverse of the sphere's rotation for gravity illusion.

Comment
Add comment · Show 1 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Rhony · Jun 14, 2019 at 11:39 PM 0
Share

Hi @Shameness, thanks for the help!

I just gave a shot at your code. I tried that before and after adding force toward center but it got worse. The car was shaking, and the wheels were spinning in place with the same amount of torque. I guess it follows what you mentioned, that modifying rigidBody.velocity directly is not wise.

The idea of rotating the sphere is a clever one but I do want to make use of wheelColliders properties to take advantage of physical based behaviors. I will give it a shot aswell though, it might be good enough.

Is adjusting force strength based on current velocity a bad idea at all?

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

667 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Gravity and rotation control 0 Answers

Fireing a tank projectile. 1 Answer

Unity Physics On Input Issue? 0 Answers

Setting a RigidBody's velocity messes with my custom gravity, not sure how to proceed. 0 Answers

Character Controller Pushes Car With Wheel Colliders? 0 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges