Tengo una versión de esto que hace una interpolación en el espacio de HSV. No es perfecto, ya que pueden aparecer muchos matices diferentes en el camino.
Three.js no incluye un método para obtener los valores HSV de THREE.Color
. Por lo tanto, agrega uno:
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
};
};
Entonces, la interpolación es relativamente sencillo:
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();
estaría interesado en escuchar de una transición más perceptualmente natural.
¿Qué tal si hacemos lo mismo pero con rgb? 'new TWEEN.Tween (mesh.material.color) .to ({r: 1, g: 0, b: 0}, 200) .start()' – mrdoob
@mrdoob, mis experimentos pasados con la mezcla lineal dentro del espacio RGB tendieron para producir feos colores intermedios. Sin embargo, intentaré eso otra vez. Por ahora, lo anterior parece funcionar bastante bien. –
Ah. Te malentendí. Sí. Parece que tu enfoque es bueno. – mrdoob