Tôi có một phiên bản của điều này làm cho một không hai trong không gian HSV. Nó không hoàn hảo, vì nhiều màu sắc khác nhau có thể xuất hiện trên đường đi.
Three.js không bao gồm phương pháp để nhận giá trị HSV từ THREE.Color
. Vì vậy, thêm một:
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
};
};
Sau đó, tween là tương đối đơn giản:
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();
Tôi muốn được quan tâm khi nghe tin một sự chuyển tiếp hơn perceptually tự nhiên.
Nguồn
2012-09-20 01:14:21
Còn việc làm tương tự nhưng với rgb thì sao? 'new TWEEN.Tween (mesh.material.color) .to ({r: 1, g: 0, b: 0}, 200) .start()' – mrdoob
@mrdoob, các thí nghiệm trước đây của tôi với phối trộn tuyến tính trong không gian RGB có xu hướng để tạo ra màu trung gian xấu xí. Tôi sẽ thử điều đó một lần nữa. Để bây giờ, ở trên dường như làm việc khá tốt. –
Ah. Tôi hiểu lầm bạn. Ừ. Âm thanh như cách tiếp cận của bạn là tốt. – mrdoob