generateRotationTrack method
dynamic
generateRotationTrack(
- dynamic modelName,
- Map curves,
- dynamic initialValue,
- dynamic preRotation,
- dynamic postRotation,
- dynamic eulerOrder,
Implementation
generateRotationTrack(modelName, Map curves, initialValue, preRotation,
postRotation, eulerOrder) {
if (curves["x"] != null) {
this.interpolateRotations(curves["x"]);
curves["x"]["values"] = curves["x"]["values"]
.map((v) => MathUtils.degToRad(v).toDouble())
.toList();
}
if (curves["y"] != null) {
this.interpolateRotations(curves["y"]);
curves["y"]["values"] = curves["y"]["values"]
.map((v) => MathUtils.degToRad(v).toDouble())
.toList();
}
if (curves["z"] != null) {
this.interpolateRotations(curves["z"]);
curves["z"]["values"] = curves["z"]["values"]
.map((v) => MathUtils.degToRad(v).toDouble())
.toList();
}
var times = this.getTimesForAllAxes(curves);
var values = this.getKeyframeTrackValues(times, curves, initialValue);
Quaternion? preRotationQuaternion;
if (preRotation != null) {
preRotation =
preRotation.map((v) => MathUtils.degToRad(v).toDouble()).toList();
preRotation.add(eulerOrder);
if (preRotation.length == 4 &&
Euler.RotationOrders.indexOf(preRotation[3]) >= 0) {
preRotation[3] =
Euler.RotationOrders.indexOf(preRotation[3]).toDouble();
}
var preRotationEuler =
new Euler().fromArray(List<double>.from(preRotation));
preRotationQuaternion = new Quaternion().setFromEuler(preRotationEuler);
}
if (postRotation != null) {
postRotation =
postRotation.map((v) => MathUtils.degToRad(v).toDouble()).toList();
postRotation.push(eulerOrder);
postRotation = new Euler().fromArray(postRotation);
postRotation = new Quaternion().setFromEuler(postRotation).invert();
}
var quaternion = new Quaternion();
var euler = new Euler();
List<num> quaternionValues =
List<num>.filled(((values.length / 3) * 4).toInt(), 0.0);
for (var i = 0; i < values.length; i += 3) {
euler.set(values[i], values[i + 1], values[i + 2], eulerOrder);
quaternion.setFromEuler(euler);
if (preRotationQuaternion != null)
quaternion.premultiply(preRotationQuaternion);
if (postRotation != null) quaternion.multiply(postRotation);
quaternion.toArray(quaternionValues, ((i / 3) * 4).toInt());
}
return new QuaternionKeyframeTrack(
'${modelName}.quaternion', times, quaternionValues);
}