Search Unity

Wheel Controller 3D - Customizable Three Dimensional Alternative to WheelCollider

Discussion in 'Assets and Asset Store' started by NWHCoding, Nov 17, 2016.

  1. eddyjohnson3

    eddyjohnson3

    Joined:
    Jul 27, 2012
    Posts:
    49
    I recently upgraded the Wheel Controller and discovered that a later release has some different behaviour compared to an old version I had when I purchased. But this is probably specific to my case.

    Basically I am making a miniature vehicle (about 1 m in real world units and Rigidbody mass of 20) and when I purchased the package I managed to get what I need. I am not sure what version that was, but the docs in the old files and also in 2.1 still says 1.5. Anyhow using the later version the vehicle is more bouncy and seems to be a bit less stable, and I can not get old behaviour back no matter how I adjust the spring and damper values.

    I was wodering if I missed some settings on upgrade or was there some fundamental changes done to the asset, that is less suited for small scale now.
     
  2. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    Hello,
    Docs have not been updated for the last few versions due to the miniscule changes. Everything written for v1.5 still holds true, but this will be dixed in 2.2 along with the better demo map and other fixes/improvements.

    There were 0 changes to the suspension expect for different handling of suspension bottoming out. Spring and damper are still calculated the same way since v1.3 which came out almost a year ago. If you maybe used CompressionPercent for the spring somewhere that one changed before 1.3 to return 1 when fully compressed instead of 0. You can contact me over email if you need older version so you can diff for yourself. Most improvements lately have been to friction and rim colliders.
     
  3. DiscoFever

    DiscoFever

    Joined:
    Nov 16, 2014
    Posts:
    286
    Just bought the asset and it doesn't work out of the box it's looking good. How can I get started adding skidmarks ?
     
    Last edited: Sep 23, 2017
  4. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    To try to replicate the error I just tried downloading the asset into an empty scene in Unity 5.6.1f and Unity 2017.1.1f and demo scene loaded just fine, no errors. A few warnings that are there are just for unused variables that slipped by and will be removed with next version, but do not affect functionality. I am not sure why you would get the error you did - maybe something is clashing with the custom editor? To me it sounds like script was not done importing and so it could not be found or something similar.

    As for skidmarks, this looks promising: https://github.com/Nition/UnitySkidmarks
    If it works with default wheelcollider there is no reason for it to not work with WC3D. You might need to do some namechanges (e.g. WheelCollider into WheelController, WheelHit into WheelController.WheelHit, etc.) and similar stuff. If you need any help with it you can contact me at info@nwhcoding.com
     
  5. DiscoFever

    DiscoFever

    Joined:
    Nov 16, 2014
    Posts:
    286
    Thanks for the super prompt reply; i'm sorry i had started writing the reply and went back and forth to unity and forgot to erase the begining of my post (i had another car controller class colliding with yours, all good).

    My main question was regarding skidmarks so you answered perfectly; will give a go to UnitySkidmarks and get back to you if needed ! Many thanks !
     
  6. ilesonen

    ilesonen

    Joined:
    Sep 11, 2012
    Posts:
    49
    Hello, Is this code in the latest version? I've been testing to drive over deforming objects and it seems that the wheels are not colliding properly and it feels like the vehicle is weightless. So, how to move the weight or force to deforming rigidbody under the wheel? Thank you! Your asset is awesome!
     
  7. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    No, it has not been added to the asset out of the box but still works if you put it in manually. If you encounter any problems with it send me an email and I will try to help.
     
  8. FargleBargle

    FargleBargle

    Joined:
    Oct 15, 2011
    Posts:
    774
    I've just downloaded version 2.2, and was a bit disappointed that the namespace issue I reported earlier has not been fixed yet. When importing into a project that already contains Unity's Standard Vehicle Assets, I get an error saying:

    "Assets/WheelController/Demo/Scripts/CarController.cs(15,14): error CS0101: The namespace `global::' already contains a definition for `CarController'".​

    Since I'm using some of the native Unity Vehicle assets as well, including the Car Controller script, this conflict has made Wheel Controller 3D unusable for the project I bought it for. While I could probably add a namespace myself, and fix whatever problems that creates in dependent scripts, I shouldn't really have to. And until you fix it at your end, any changes I make will be overwritten by the next update anyway. You indicated when I first brought this up that you would fix it. If not on this update, do you have any idea when? :(
     
  9. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    Sorry sir, that was an overlook on my part. I added it to the TODO and it will be in the next update. I somehow managed to forget to add that :(
     
  10. FargleBargle

    FargleBargle

    Joined:
    Oct 15, 2011
    Posts:
    774
    Cool. I've got lots of scenery work to keep me busy at the moment, but I've already got a nice track, and a bunch of great cars lined up, and I'm itching to see how they'll work with better wheel physics. I'll be eagerly awaiting the next update. :rolleyes:

    MEI_Cars1.jpg
     
  11. Chylinski

    Chylinski

    Joined:
    Dec 11, 2015
    Posts:
    4
    Hello I have problem with body colliders on car. Without any colliders car runs fine but when I add some body colliders the car starts to shake. Even when running into Triggers the wheels starts to shakes... How to fix it?
     
  12. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    I sent you a response to your email. Also, check the FAQ in the end of the manual.
     
  13. suzuke

    suzuke

    Joined:
    Apr 24, 2013
    Posts:
    2
    upload_2017-10-13_11-47-53.png

    Hello, I need some help when I put the car on a slope. It would slip down slowly due to the gravity.
    Is there any idea for this issue?
     
  14. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    Hello,
    This has already been addressed and slip reduced but fully removing it is impossible due to the fact that WC3D is using slip-based physics which means that slip has to occur for wheel to react to it. This is similar to how inbuilt wheelcollider works but they can use substeps that are not available for end developers. So the only way to improve this apart from freezing the vehicle's rigidvody is to reduce fixed update time in time settings to e. g. 0.015 or 0.01.
     
  15. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    Auto-generated documentation has been added: link
     
  16. krou

    krou

    Joined:
    May 29, 2014
    Posts:
    22
    Hello, NWHCoding. Is it possible to setup suspension like in a Hill Climb racing?
     
  17. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    Yes, you can use it for 2D games too but you will have to make sure to freeze rigidbody rotation so it can only roatate around single axis.
     
  18. krou

    krou

    Joined:
    May 29, 2014
    Posts:
    22
    Thank you for your answer. I have started to test "Wheel Controller" and found a bug. Sometimes wheel collider fals through the ground. The smaller the value of "Max spring force", the more likely the car will fall through the ground.
    How to fix this issue? Screenshot attached.
    Regards
     

    Attached Files:

  19. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    It is and is not a bug. Since wheel uses spring to keep itself above ground if spring is set to extremely low values something like in the picture might happen. I do not know what the weight of your rigidbody is, but 800N of force that your spring is set to would be able to hold 80kg (in real world), which means vehicle must be lighter than 320kg for springs to be able to hold it up. There is a mechanism to prevent falling through ground when bottoming out, but this too is dependent on spring strenght in part.

    My guess is that you want soft springs. Your damper is meanwhile set to 500 and 550 respectively. If you want vehicle to be all soft and wobbly reduce damper to e.g. 200 or even 150 and increase spring to a higher value - a good starting point would me your rigidbody's mass times 10. When the spring is a bit stronger bottoming out code will start working too and vehicle will not go through ground in any case. This is because when vehicle bottoms out script starts applying exponential force depending on how far past the spring travel wheel is approximating the rubber stopper most cars have (when car bottoms out swingarm hits rubber stopper mounted on car's body).

    EDIT:
    Here is a video I uploaded yesterday and I am guessing you want similar behavior. Rigidbody in video has mass of 1400, spring force of 17000 with travel 0.8 and damper 200 in bump and 250 in rebound.



    Hope this helps.
     
    Artaani and krou like this.
  20. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    Version 2.3 is in testing and will be out within few days. A lot of physics has been reworked addressing / improving many things:

    - Reworked suspension.
    - Reworked friction calculations.
    - Reduced slip / creep.
    - No initial wheel slip when starting.
    - Improved ground detection.
    - Added namespace to all the scripts to prevent collision with other assets.
    - Removed few bugs.

    If you already have a large project set up with WC3D I would suggest trying this update on a copy of your project because you might need to tweak spring and friction values due to the force calculation changes. It is not that much of a difference but just to let you know.
     
    FargleBargle and krou like this.
  21. Deleted User

    Deleted User

    Guest

    I'm using the latest version of Wheel Controller (v2.2) and the wheels seem to react (causing the car to jump a bit) to trigger colliders I have placed in the environment. If I set the layer of the trigger colliders to layer 20, the wheels no longer react to the trigger colliders.. but I'd rather have my trigger colliders on a different layer from my car's body collider.

    Is this intended behavior, a bug, or am I misunderstanding something?
     
  22. krou

    krou

    Joined:
    May 29, 2014
    Posts:
    22
    Thanks alot, NWH Coding. Changing rigidbody mass and increase suspension force helped. How to reduce the bouncing, but leave the suspension as soft as the values of damper 100 in bump and 150 in rebound?
     
    Last edited: Nov 12, 2017
  23. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    WC3D is still raycast based and raycasts do detect triggers. If you do not need such behavior you can disable it under Edit > Project Settings > Physics > Queries Hit Triggers. If unticked all raycasts will ignore triggers. Unfortunately if you do need such behavior ignore layer is the only way as I cannot set the above option for each raycast. It's either all or nothing. Hope this helps.
     
    krou likes this.
  24. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    Damper exist on car (in real world) almost only for that - to reduce bouncing. So my suggestion is to just slightly increase your damper, e.g. 150/180.
     
    krou likes this.
  25. Deleted User

    Deleted User

    Guest

    Thanks for the info. With this being the case I would prefer to have an EnumMaskField to assign raycast layers rather than a single layer to ignore. I've already changed the code in my version, but it would be great if you would consider making that the default in future versions.

    Thanks!
     
  26. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    Forget the post above, I decided to go all in and do rewrite of ground detection amongs other things. This will take a few more days and the update will be called v3.0 since there will be some significant changes (at least internally, API will stay the same).
     
    krou likes this.
  27. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    Thnak you for the suggestion, I was not even aware EnumMaskField existed or I would have added it earlier.
    Added to the TODO list for v3.0.
     
    krou likes this.
  28. krou

    krou

    Joined:
    May 29, 2014
    Posts:
    22
    thank you for suggestion
     
  29. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    v3.0 is mostly finished.

    About of the code in the main script has been rewritten and so far these are the changes/results:
    • About 200-400% performance improvement. Hard to say for sure since ground detection has been revamped so it is a bit of apples to oranges comparison since resolution can be much lower for same results (half or even less).
    • Much stiffer friction meaning cars respond faster and are easier to flip over.
    • As a result of the above lateral creep/slip on angled surfaces is minimal - comparable to that of wheelcollider.
    • Vehicles are less prone to vibration / jitter.
    • Rim colliders are now fixed and are runtime constructed meshes. Since they are fixed in relation to vehicle there is no performance overhead of Unity needing to recalculate COM every frame. Can be a significant difference when there are a lot of colliders atached.
    • Vehicle can have 0 spring strenght without falling through ground (even if rim colliders disabled)
    • Reworked friction preset system. There is no longer split foward (longitudinal) and side (lateral) friction setting. Friction curve is generated only once on start so there is very minor performance overhead when switching friction settings.
    • Camber is now a curve.
    • Added namespaces to all files to avoid conflict.
    • Added vehicle side dropdown selector in editor so it can be selected manually in case model has problematic rotation. Also, "Center" option has been added instead of previous tick box for vehicles like motorcycles.
    • Wheel scan is now only lateral and logitudinal with no recursion and uses weighted average instead of closest point to detect ground. This means that 2x5 resolution can be used with adequate results for most application.
    • Scan ignore layer is now a dropdown instead of integer field as per MooseMouse's suggestion.
    I think that is all. Needs some code cleanup, comments, possibly a bit more optimization and a lot of testing. I will be releasing it withing a few days + whatever Unity team needs to approve it. If anyone wants to try/test the beta version send me a PM / email with your invoice and I will send you the package.

    Cheers.
     
  30. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    v3.0 has been submitted to the store and will be out as soon as folks over there approve it. As usual, if you want it sooner you can send me an email with your invoice and I will send it to you.
     
    suzuke, krou, FargleBargle and 2 others like this.
  31. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    v3.0 is out. WebGL demo has also been updated.

    Upgrade instructions from v2.2 to v3.0 can be found inside the manual. There are only minor changes needed but I would suggest you check them out anyways.
     
    Last edited: Nov 28, 2017
    FargleBargle likes this.
  32. Deleted User

    Deleted User

    Guest

    I've upgraded to v3.0 and noticed that the cars do not go nearly as fast (for the same horsepower) as they did with the old v2.2 wheel controllers. It seems that I really need to crank up the horsepower unrealistically to get a car to go over 100 mph with the v3.0 wheel controllers.

    Is this intended/known behavior? Have others experienced this?

    EDIT: I reloaded the WheelController from the Asset Store (I had been using an emailed version) and the problem seems to have gone away. I don't know if it is something I did or not.
     
    Last edited by a moderator: Nov 30, 2017
  33. FargleBargle

    FargleBargle

    Joined:
    Oct 15, 2011
    Posts:
    774
    It's nice to see version 3 is finally out, but I'm still having trouble replacing the wheel colliders from Unity's Standard Assets with the WC3D colliders. After following the steps on page 3 of your manual, and replacing the wheel colliders on the hubs of their demo car with yours, I can't get their Car Controller script to recognize the WC3D colliders. Will they only work with your Car Controller?

    This is getting a bit frustrating. I bought WC3D several months ago because of the claim that it could be used as a replacement for Unity's standard wheel colliders. That's all I've been trying to do ever since. At first it wouldn't get along with their Car Controller script because of the Namespace issue. Now that you've fixed that, there seems to be a compatibility issue between their Car Controller and your Wheel Colliders that prevents them from working together. Am I the only one trying to do this, or have I just screwed it up somehow? Your demos are fine, but several months after buying WC3D, I still haven't been able to get it to work with the standard Car Controller in my actual game.

    This should be easy enough to test - just import Unity's Standard Assets package from the Asset Store, load their Car sample scene, and follow the steps on page 3 of the WC3D manual. If anyone has gotten this to work, what else did you need to do, besides what's in the manual? o_O

    Capture1.JPG Capture2.JPG
     
  34. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    Hello,
    We seem to be in a bit of a misunderstanding here. WC3D does not literally replace wheelcollider as in remove the old code and place the new code in. You can still use wheelcollider parallel to WC3D. WheelCollider class and WheelController classes are different classes and as such can not just be used as one. You will need to modify your script to use WC3D instead of WheelCollider which should be simple since APIs are similar. I
     
  35. FargleBargle

    FargleBargle

    Joined:
    Oct 15, 2011
    Posts:
    774
    You should say so in the manual then, and document the other changes that need to be made. Either that or do a video showing the process. All I saw about replacing the standard Unity colliders with yours was this:

    WC3D Guide.JPG

    There's no mention of modifying controller scripts there, or in the following sections. All it says on the Asset Store is "Wheel Controller 3D is a complete alternative to the Unity's inbuilt wheel collider", and "API with only minor differences from Unity's inbuilt WheelCollider - familiar and easily swappable." This is misleading at best. If that's all the information customers have to go on, misunderstandings are inevitable.

    While Unity's wheel collider API is well documented, yours isn't. I can pick apart your Car Controller script, and try to figure out which parts need to be added to Unity's Controller to make it work with your colliders, but I don't see any examples that clearly show what needs to be done. Not all of us are that proficient at coding, We buy assets like yours to avoid that part, so we can focus on other things that we're better at. While I'm sure I can eventually figure the code out, it's going to add a lot more time to what was intended to be a simple drop-in replacement. :(
     
  36. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    Well, I am sorry if I was not clear enough and got misunderstood. If you feel misled or are not satisfied with the product I can offer you a refund.

    My CarController script is about 100 lines long and is just to demonstrate how to move the car around, not much to pick apart. Every function in the API is documented and will show when writing code ane the names of the functions and variables are following those of wheelcollider, e. g.:

    wheelcollider.motorTorque =1000f;
    wheelcontroller.motorTorque = 1000f;

    WheelHit hit;
    wheelcollider.GetGroundHit(out hit);

    WheelController.WheelHit hit;
    wheelController.GetGroundHit(out hit);

    and so on.
    If you feel that something is not documented well enough please do say so and I will correct it immediately.
     
  37. FargleBargle

    FargleBargle

    Joined:
    Oct 15, 2011
    Posts:
    774
    That was really the point of my posts. I wasn't trying to put your product down, or angling for a refund. I'm still hoping to use it in my game, but it looks like it won't be as straightforward as I thought when I bought it. You've responded well to my earlier namespace issues. I was hoping my latest feedback would help you further improve your product, to avoid similar issues with other customers.

    I'll look at the code when I have time. Hopefully it's as simple to figure out as you say. :eek:
     
  38. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    It is actually a great idea - replace the WheelCollider class with mine and everything would work out of the box. Now, I am not C# expert but from little research I did just completely stomping and overriding the WheelCollider class would not be possible. If anyone has an idea how to do it I am all ears :)
     
  39. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    There is also this, just updated: auto-generated class reference
     
    FargleBargle likes this.
  40. FargleBargle

    FargleBargle

    Joined:
    Oct 15, 2011
    Posts:
    774
    That looks like it will help at least. I'm no C# expert either, but I'm still determined to figure this out. When I do, maybe I should post the modified Unity car controller script, so that people can use it with WC3D out of the box if they want. There are lots of other car controllers, so that wouldn't be a solution for everyone obviously, but since the Unity controller is something everyone will have access to, it makes sense to have a WC3D version of it that can be substituted as easily as the colliders themselves. ;)
     
    NWHCoding likes this.
  41. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    Also for some shameless self-promotion now that we are talking about vehicle controllers. Still work-in-progress tho.

    NWH Vehicle Physics WIP Thread
     
    rolexhun and FargleBargle like this.
  42. FargleBargle

    FargleBargle

    Joined:
    Oct 15, 2011
    Posts:
    774
    That looks like it has many of the features I want from the Unity car controller: engine and tire sounds, skidmarks, plus the added bonus of HUD instruments. The race car and monster truck are closest to my usage scenarios. The only thing missing (that I can see from the videos) is brake lights, but it looks from your trailer truck comments like they will be added as well.



    Another feature I'm looking to implement on my cars is active aerodynamics - where the rear spoilers deploy at speed, and/or tilt to become air brakes. Since this is something a lot of modern supercars do now, it would be nice to include hooks to external animation events, to be activated at car startup, at a given speed threshold, or under braking. They'd need to coordinate with changes to the car physics, as the cars would gain more grip due to downforce at higher speed, and be able to brake harder at high speeds due to the added aerodynamic drag. Thoughts? If that's more ambitious than you intended, I'll take what I can get, and try to cobble something together myself, but I think this would make a great feature, that lots of other people might want as well.

    After spending some time yesterday trying to adapt the Unity car controller to work with WC3D, it doesn't look as simple as I'd hoped. While the APIs are similar, their Car Controller uses different methods of enumerating and accessing the wheel colliders than yours, and I'm having difficulty transferring some of the settings. If your package will do everything it would have done, plus being 100% compatible and optimized for WC3D, it might be better to wait for it. Do you need beta testers? o_O
     
    Last edited: Dec 2, 2017
  43. Paxew

    Paxew

    Joined:
    Apr 8, 2014
    Posts:
    30
    Hi, is it possible to use this wheel controller to make tank like vehicles? I.e. vehicles that can turn in place by rotating left side wheels backwards and the right side wheels forwards? If so what settings should I look at?
     
  44. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    Yes you can. Setup all the wheels as normal and then just apply positive motor torque to one side and brake torque or negative torque to other side and the vehicle will turn. Since most tracks are metal that would mean somewhat reduced friction so I would suggest lowering forward and side force coefficients to e.g. 0.5 or so. This will depend on your vehicle.
     
  45. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    v3.1 is on the way with minor bug fixes that were introduced with v3.0 and a rewrite of the part of the code that calculates longitudinal force and wheel's angular velocity.

    I am currently working on replacing fFriction calculation with improved one. This will be out in 3.1 along with other bug fixes so far reported, including the Rim Collider being positioned wrong when vehicle is instantiated from code.
     
    Last edited: Dec 4, 2017
  46. strich

    strich

    Joined:
    Aug 14, 2012
    Posts:
    374
    Would you mind sending me v3.1 today via PM if possible?
     
  47. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    No problem. Assuming I manage to finish the friction part. I will send it as soon as it is finished.
     
    strich likes this.
  48. Discmage

    Discmage

    Joined:
    Aug 11, 2014
    Posts:
    60
    Hi, just imported the Wheel collider into my project but unfortunately it seems to have a couple of problems with the scripts? Could be something I have done...but as the script itself seems to have compile errors I can't actually do anything with them.

    Errors include :
    - Assets/WheelController/Editor/WheelControllerInspector.cs(69,12): error CS1061: Type `WheelController' does not contain a definition for `InitIfNull' and no extension method `InitIfNull' of type `WheelController' could be found. Are you missing an assembly reference?
    - Assets/WheelController/Editor/WheelControllerInspector.cs(128,15): error CS1061: Type `WheelController' does not contain a definition for `Parent' and no extension method `Parent' of type `WheelController' could be found. Are you missing an assembly reference?
    - Assets/WheelController/Editor/WheelControllerInspector.cs(144,73): error CS1061: Type `WheelController' does not contain a definition for `VehicleSide' and no extension method `VehicleSide' of type `WheelController' could be found. Are you missing an assembly reference?

    I am using the latest version wheel collider (3.0) and Unity version 2017.2.0f3

    There are 13 errors in total along the same line of not containing definitions. Any help would be appreciated. Looking forward to seeing what the asset can do :)
     
  49. NWHCoding

    NWHCoding

    Joined:
    Jul 12, 2012
    Posts:
    1,692
    Is this a clean project or upgrade from the past version? If you have upgraded from pre 3.0 this is most likely the problem of namespaces - do you have "using NWH.WheelController3D;" at the top of your file? This was not required pre 3.0 and is mentioned under upgrade guidelines in the manual.
     
  50. Discmage

    Discmage

    Joined:
    Aug 11, 2014
    Posts:
    60
    it was a project I was working on that had the unity colliders. So not upgraded, and not a clean project as I am adding it to a project underway.