I am trying to have a “car” travel over a heightmap and adjust it orientation based on the normal. I found some code that computes an orientation that is certainly perpendicular to the normal but the sense of “forward” direction is random. I really just want to align my car’s up axis with the normal while still facing “forwards” (obviously that will change a little on pitch. Is there a simpler way to do this?
In the PG you can see the local “forward direction” becomes random.
The trick is to compute the right vector once you get the direction and the normal. then recompute the up vector from the direction and the right.
With those 3 vectors, you can get the rotation from axis like 37.
That works well when the box is facing forwards but I cant seem sto get it to work with it when I rotate the box. PG: https://www.babylonjs-playground.com/#3SFV2V#5 line 91 and 92
if I set it to use box.forward it goes into a spin. If I don’t use box .forward then I cannot rotate the box as it is always facing (1,0,0).
My goal is to move the box around and have it follow the height and normal.
(the code is a bit messy as I have just hubbled it from bits).
I also tried with @Raggar 's solution with much the same result so i am not getting something. I also tried using box.rotationQuaternion as I thought it could be a fight between rotation and rotationQuaternion.
so there was an issue with order of updating rotation, I have adjusted that here https://www.babylonjs-playground.com/#3SFV2V#7
I am using rotate which sets rotationQuaternion and then ignores rotation but I still cant get it working.
I have a solution that mostly works but it gets some gymbal lock-type issues. But at least I can turn the box and follow height and normal.
Would switching to purely using rotationQuaternion fix the weird spinning that occurs occasionally?
I am really struggling with this and would appreciate any input. There is obviously something about the way BJS handles position/rotation and/or by ref/value that I aam not understanding. I have tried to simplify the PG and only update height + orientation when the box moves.
What confuses me is that if I move the box forward or backwards along its box.forward direction then box.forward changes (see the console). I would not expect this.
I cannot rotate the box. I have tried all sorts of combinations of rotation with or without quaternions. It seems that box.forward may be part of the problem. I am stumped.
I’ve done a PG with interpolated normal so the orientation is smoothed.
You cannot interpolate Euler angles or you’ll get gimbal locks and almost complete rotation from time to time.
I also keep track of the cube rotation on Y so I can turn easily.
Thanks @Cedric, I was able to get it working and the interpolated normal was something else I wa sgoing to implement so that has helped too.
I had tried keeping a track of rotation Y but it hadn’t worked. In fact when I used your code from the PG that worked, it didn’t work in my scene ( the “box” is an imported glb). I eventually got it to work by changing the final box.rotation.copyFrom(curRot); to simply box.rotation = curRot; and it then worked! It must be that something else was affecting the rotation and setting this changed the reference?? Anyway, it is working and just before a presentation to a client
Thanks heaps.