Hi,

I'm animating a model based on recorded data, using lat/lon, altitude and heading/pitch/roll. The model is animated along a path. This works well, but then I have a case where the heading is faulty and I'm trying to correct it. I'm trying to use heading from VelocityOrientationProperty but with my own pitch and roll.

This is not a bug in Cesium, I just can't figure out the math.

I think I'm confusing my units, since I can't get even get this working:

let q = orientation_velocity.getValue(time);

let velocity_hpr = Cesium.HeadingPitchRoll.fromQuaternion(q);

let orientation = Cesium.Transforms.headingPitchRollQuaternion(

posSamples.getValue(time),

velocity_hpr

);

orientationSamples.addSample(time, orientation);

If I convert a Quaternion to a HeadingPitchRoll, then convert HPR to a Quaternion (using the same position) shouldn't it work? Obviously it's fictitious example, but if I can't even get that to work.. the above sample gives me the same odd behaviour as TRY #2 below, i.e the forward tip of the model points upwards.

Longer Story:

When I have a working heading (these are executed in a for loop):

let hpRoll = new Cesium.HeadingPitchRoll(

Cesium.Math.toRadians(data['HEADING'][i]),

Cesium.Math.toRadians(data['PITCH'][i]),

Cesium.Math.toRadians(data['BANK'][i]),

);

let orientation = Cesium.Transforms.headingPitchRollQuaternion(

positions[i], // position

hpRoll,

Cesium.Ellipsoid.WGS84,

Cesium.Transforms.northWestUpToFixedFrame,

);

orientationSamples.addSample(time, orientation);

I can also use the VelocityOrientationProperty:

TRY #1:

orientation_velocity = new Cesium.VelocityOrientationProperty(posSamples);

Gives a perfect heading along the path, but obviously without PITCH/ROLL.

However, now I'm trying to use heading from VelocityOrientationProperty but my own PITCH and BANK.

TRY #2 (TLDR: 90 degrees (forward tip of the model points upwards)

let q = orientation_velocity.getValue(time);

let velocity_hpr = Cesium.HeadingPitchRoll.fromQuaternion(q);

let hpRoll = new Cesium.HeadingPitchRoll(

Cesium.Math.toRadians(data['HEADING'][i]),

Cesium.Math.toRadians(data['PITCH'][i]),

Cesium.Math.toRadians(data['BANK'][i])

);

// Replace pitch and roll from VelocityOrientationProperty Quaternion

hpRoll['pitch'] = velocity_hpr['pitch']

hpRoll['roll'] = velocity_hpr['roll']

let orientation = Cesium.Transforms.headingPitchRollQuaternion(

posSamples.getValue(time),

hpRoll,

Cesium.Ellipsoid.WGS84,

Cesium.Transforms.northWestUpToFixedFrame,

);

This creates a model where the front of the model points pretty much straight up and not forward.

TRY #3: (TLDR: Doesn't point straight forwards, rotates 180 degrees randomly when turning)

let q = orientation_velocity.getValue(time);

let velocity_hpr = Cesium.HeadingPitchRoll.fromQuaternion(q);

let heading = Cesium.Math.toDegrees(velocity_hpr['heading']);

let hpRoll = new Cesium.HeadingPitchRoll(

velocity_hpr['heading'],

Cesium.Math.toRadians(data['PITCH'][i]),

Cesium.Math.toRadians(data['BANK'][i])

);

let orientation = Cesium.Transforms.headingPitchRollQuaternion(

positions[i], // position

hpRoll,

Cesium.Ellipsoid.WGS84,

);

orientationSamples.addSample(time, orientation);