I found the solution myself after a (bad) night's sleep on it.
Working Code
------------
void Update () {
// NOTE: I am really bad at this (vectors, cross products, dot products etc), hence my comments will be to the best of my understanding.
// Time that debug lines and rays will be displayed for.
var duration = Time.deltaTime;
// Draws a line through the south/north poles of the sphwere.
Debug.DrawLine(Vector3.down * 100, Vector3.up * 100, Color.gray, duration, false);
// Gravity that affects the vehicle
var gravity = Vector3.Normalize(planet.transform.position - transform.position) * 9.81F;
// Cross products of gravity to describe planes.
var gravityEast = Vector3.Cross(gravity.normalized, Vector3.down).normalized;
var gravityNorth = Vector3.Cross(gravityEast.normalized, -gravity.normalized).normalized;
// Draw vehicle forward, right and up vectors. Makes it easier to see how it's currently rotated.
Debug.DrawRay(transform.position, transform.forward * 0.5F, Color.cyan, duration, false);
Debug.DrawRay(transform.position, transform.right * 0.5F, Color.cyan, duration, false);
Debug.DrawRay(transform.position, transform.up * 0.5F, Color.cyan, duration, false);
// Draw gravity vector and it's plane vectors.
Debug.DrawRay(transform.position, gravity.normalized, new Color(0.0F, 0.0F, 0.5F), duration, false);
Debug.DrawRay(transform.position, gravityEast, new Color(0.5F, 0.5F, 0.0F), duration, false);
Debug.DrawRay(transform.position, gravityNorth, new Color(0.5F, 0.0F, 0.0F), duration, false);
// Debug text to verify the absolute values of the gravity and it's plane vectors.
text.text = "gravity: " + gravity + "\n";
text.text += "gravityEast: " + gravityEast + "\n";
text.text += "gravityNorth: " + gravityNorth + "\n\n";
// Define "aligned" (plane) vectors that rotate with the vehicle.
// For example, gravityAlignedRight will stay pointing along the height plane over the
// surface of the sphere and rotate with the vehicle always pointing to the right.
// This is used to determine angular difference between vehicles right vector and gravity's aligned right vector.
// The reason we need that is because Vector3.Angle() would measure the whole angle between a fixed vector such as
// gravityEast and the vehicle right vector otherwise.
// gravityAlignedForward is used for yaw and pitch.
// gravityAlignedDown is used for pitch and is needed to get the correct dot product for pitch.
var gravityAlignedRight = Vector3.Cross(gravity.normalized, -transform.forward).normalized;
var gravityAlignedForward = Vector3.Cross(gravity.normalized, gravityAlignedRight).normalized;
var gravityAlignedDown = Vector3.Cross(gravityAlignedRight, transform.forward).normalized;
// Draw aligned gravity vectors for ease of debugging.
Debug.DrawRay(transform.position, gravityAlignedForward * 0.25F, Color.green, duration, false);
Debug.DrawRay(transform.position, gravityAlignedRight * 0.25F, Color.magenta, duration, false);
Debug.DrawRay(transform.position, gravityAlignedDown * 0.25F, Color.red, duration, false);
// And draw the absolute values which helped me set them up.
// That is, i had to experiment my way forward to each of these...
text.text += "gravityAlignedRight: " + gravityAlignedRight + "\n";
text.text += "gravityAlignedForward: " + gravityAlignedForward + "\n";
text.text += "gravityAlignedDown: " + gravityAlignedDown + "\n\n";
// Get dot products for yaw, pitch and roll so we can set the appropriate sign on the final YPR readings.
var yawDot = Vector3.Dot(gravityAlignedForward, gravityEast);
var pitchDot = -Vector3.Dot(gravityAlignedDown, gravityAlignedForward);
var rollDot = -Vector3.Dot(transform.up, gravityAlignedRight);
// Measure angle between the aligned gravity vectors and the vehicles forward and right vectors.
// yaw is special in that it uses the aligned forward gravity vector. Don't ask me why, i wouldn't know... ;)
var yaw = Vector3.Angle(gravityAlignedForward, gravityNorth) * Mathf.Sign(yawDot);
var pitch = Vector3.Angle(transform.forward, gravityAlignedForward) * Mathf.Sign(pitchDot);
var roll = Vector3.Angle(transform.right, gravityAlignedRight) * Mathf.Sign(rollDot);
// Debug text showing the results of all this... It works, finally.
text.text += "yawDot: " + yawDot + "\n";
text.text += "pitchDot: " + pitchDot + "\n";
text.text += "rollDot: " + rollDot + "\n\n";
text.text += "yaw: " + yaw + "\n";
text.text += "pitch: " + pitch + "\n";
text.text += "roll: " + roll + "\n";
}
----------
## Debug shots ##
Some shots where everything just works... I am happy now because i can actually port this to the other project! (I hope)
[![No rotations at all][1]][1]
[![Rotated YPR 15, 22.5, 45][2]][2]
[![Rotate pitch to 135 in unity][3]][3]
**Ok, so i made a mistake when taking the screenshot, pitch from 22.5 to 135 in unity**
And with all that said, thanks to everyone that read and tried to help me out.
I never want to have to figure this out again...
**That being said**, i still would very much appreciate input on what i have done and if it can be simplified in any way as well as perhaps some *eureka* hints you could send my way to actually make me understand what i have done here.
Cheers!
EDIT:
-----
[![It works!][4]][4]
IT WORKS! ;)
Thanks again!
[1]: https://i.sstatic.net/zJ1Vw.png
[2]: https://i.sstatic.net/PHrcy.png
[3]: https://i.sstatic.net/vShWK.png
[4]: https://i.sstatic.net/zKL8i.png