mirror of
https://github.com/JannisX11/blockbench.git
synced 2024-11-21 01:13:37 +08:00
Catmull rom interpolation preview
This commit is contained in:
parent
992f42e3a0
commit
03f6a726fb
@ -878,17 +878,30 @@ class BoneAnimator extends GeneralAnimator {
|
|||||||
} else if (!before && !after) {
|
} else if (!before && !after) {
|
||||||
//
|
//
|
||||||
} else {
|
} else {
|
||||||
let alpha = Math.lerp(before.time, after.time, time)
|
let no_interpolations = Blockbench.hasFlag('no_interpolations')
|
||||||
if (Blockbench.hasFlag('no_interpolations')) {
|
|
||||||
alpha = Math.round(alpha)
|
if (no_interpolations || (before.interpolation == Keyframe.interpolation.linear && after.interpolation == Keyframe.interpolation.linear)) {
|
||||||
}
|
let alpha = Math.lerp(before.time, after.time, time)
|
||||||
result = [
|
if (no_interpolations) {
|
||||||
before.getLerp(after, 'x', alpha, allow_expression),
|
alpha = Math.round(alpha)
|
||||||
before.getLerp(after, 'y', alpha, allow_expression),
|
}
|
||||||
before.getLerp(after, 'z', alpha, allow_expression)
|
result = [
|
||||||
]
|
before.getLerp(after, 'x', alpha, allow_expression),
|
||||||
if (before.isQuaternion && after.isQuaternion) {
|
before.getLerp(after, 'y', alpha, allow_expression),
|
||||||
result[3] = before.getLerp(after, 'q', alpha, allow_expression)
|
before.getLerp(after, 'z', alpha, allow_expression)
|
||||||
|
]
|
||||||
|
} else {
|
||||||
|
|
||||||
|
let sorted = this[channel].slice().sort((kf1, kf2) => (kf1.time - kf2.time));
|
||||||
|
let before_index = sorted.indexOf(before);
|
||||||
|
let before_plus = sorted[before_index-1];
|
||||||
|
let after_plus = sorted[before_index+2];
|
||||||
|
|
||||||
|
result = [
|
||||||
|
before.getCatmullromLerp(before_plus, before, after, after_plus, 'x'),
|
||||||
|
before.getCatmullromLerp(before_plus, before, after, after_plus, 'y'),
|
||||||
|
before.getCatmullromLerp(before_plus, before, after, after_plus, 'z'),
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (result && result.type === 'keyframe') {
|
if (result && result.type === 'keyframe') {
|
||||||
|
@ -30,19 +30,19 @@ class KeyframeDataPoint {
|
|||||||
if (this.instructions != undefined) Merge.string(this, data, 'instructions')
|
if (this.instructions != undefined) Merge.string(this, data, 'instructions')
|
||||||
}
|
}
|
||||||
get x_string() {
|
get x_string() {
|
||||||
return typeof this.x == 'number' ? trimFloatNumber(this.x) : this.x;
|
return typeof this.x == 'number' ? trimFloatNumber(this.x) || '0' : this.x;
|
||||||
}
|
}
|
||||||
set x_string(val) {
|
set x_string(val) {
|
||||||
this.x = val;
|
this.x = val;
|
||||||
}
|
}
|
||||||
get y_string() {
|
get y_string() {
|
||||||
return typeof this.y == 'number' ? trimFloatNumber(this.y) : this.y;
|
return typeof this.y == 'number' ? trimFloatNumber(this.y) || '0' : this.y;
|
||||||
}
|
}
|
||||||
set y_string(val) {
|
set y_string(val) {
|
||||||
this.y = val;
|
this.y = val;
|
||||||
}
|
}
|
||||||
get z_string() {
|
get z_string() {
|
||||||
return typeof this.z == 'number' ? trimFloatNumber(this.z) : this.z;
|
return typeof this.z == 'number' ? trimFloatNumber(this.z) || '0' : this.z;
|
||||||
}
|
}
|
||||||
set z_string(val) {
|
set z_string(val) {
|
||||||
this.z = val;
|
this.z = val;
|
||||||
@ -173,6 +173,19 @@ class Keyframe {
|
|||||||
return calc + (other.calc(axis, other_data_point) - calc) * amount;
|
return calc + (other.calc(axis, other_data_point) - calc) * amount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
getCatmullromLerp(before_plus, before, after, after_plus, axis) {
|
||||||
|
var vectors = [];
|
||||||
|
|
||||||
|
if (before_plus) vectors.push(new THREE.Vector2(before_plus.time, before_plus.calc(axis, 0)))
|
||||||
|
if (before) vectors.push(new THREE.Vector2(before.time, before.calc(axis, 0)))
|
||||||
|
if (after) vectors.push(new THREE.Vector2(after.time, after.calc(axis, 0)))
|
||||||
|
if (after_plus) vectors.push(new THREE.Vector2(after_plus.time, after_plus.calc(axis, 0)))
|
||||||
|
|
||||||
|
var curve = new THREE.SplineCurve(vectors);
|
||||||
|
let time = Math.lerp(vectors[0].x, vectors.last().x, Timeline.time)
|
||||||
|
|
||||||
|
return curve.getPoint(time).y;
|
||||||
|
}
|
||||||
getArray(data_point = 0) {
|
getArray(data_point = 0) {
|
||||||
var arr = [
|
var arr = [
|
||||||
this.get('x', data_point),
|
this.get('x', data_point),
|
||||||
@ -403,6 +416,10 @@ class Keyframe {
|
|||||||
new Property(Keyframe, 'number', 'color', {default: -1})
|
new Property(Keyframe, 'number', 'color', {default: -1})
|
||||||
new Property(Keyframe, 'string', 'interpolation', {default: 'linear'})
|
new Property(Keyframe, 'string', 'interpolation', {default: 'linear'})
|
||||||
Keyframe.selected = [];
|
Keyframe.selected = [];
|
||||||
|
Keyframe.interpolation = {
|
||||||
|
linear: 'linear',
|
||||||
|
catmullrom: 'catmullrom',
|
||||||
|
}
|
||||||
|
|
||||||
// Misc Functions
|
// Misc Functions
|
||||||
function updateKeyframeValue(axis, value, data_point) {
|
function updateKeyframeValue(axis, value, data_point) {
|
||||||
|
Loading…
Reference in New Issue
Block a user