I have a version of this that does animation in HSV space. This is not ideal, since many different shades may appear along this path.
Three.js does not include a method for obtaining HSV values ββfrom a THREE.Color . So add one:
THREE.Color.prototype.getHSV = function() { var rr, gg, bb, h, s, r = this.r, g = this.g, b = this.b, v = Math.max(r, g, b), diff = v - Math.min(r, g, b), diffc = function(c) { return (v - c) / 6 / diff + 1 / 2; }; if (diff == 0) { h = s = 0; } else { s = diff / v; rr = diffc(r); gg = diffc(g); bb = diffc(b); if (r === v) { h = bb - gg; } else if (g === v) { h = (1 / 3) + rr - bb; } else if (b === v) { h = (2 / 3) + gg - rr; } if (h < 0) { h += 1; } else if (h > 1) { h -= 1; } } return { h: h, s: s, v: v }; };
Then the motion tween is relatively simple:
new TWEEN.Tween(mesh.material.color.getHSV()) .to({h: h, s: s, v: v}, 200) .easing(TWEEN.Easing.Quartic.In) .onUpdate( function() { mesh.material.color.setHSV(this.h, this.s, this.v); } ) .start();
I would be interested to know about a more perceptually natural transition.
source share