为何你的发光二极管颜色过渡看起来虚假

发布日期:2026-04-16 13:36:55   浏览量 :2
发布日期:2026-04-16 13:36:55  
2

2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家 

你的发光二极管颜色过渡在欺骗你

问题不在于你的代码,而在于你的颜色所处的色彩空间。

你花了三个小时调整颜色过渡效果。从黄色到紫罗兰色。你编写了代码,上传后,看着你的发光二极管灯带从黄色变为白色,再变为紫罗兰色。

等等——白色?

你并没有要求出现白色。但它就在那里,正好位于黄色和紫罗兰色的中间。它本不该出现在那里,但你似乎无法摆脱它。

这就是颜色过渡的谎言,而它内置于大多数发光二极管教程所教授的颜色混合方法中。

看起来正确但感觉错误的代码

\c
uint8_t red = map(timeNow, timeStart, timeEnd, startRed, endRed);
uint8_t green = map(timeNow, timeStart, timeEnd, startGreen, endGreen);
uint8_t blue = map(timeNow, timeStart, timeEnd, startBlue, endBlue);
return strip.Color(red, green, blue);
\
\

这是红绿蓝线性插值。你通过独立地对每个通道进行线性插值,在红绿蓝空间中移动。

红绿蓝空间有一个没人告诉你的特性:白色是红绿蓝立方体的几何中心

当你从黄色(红绿蓝:255, 255, 0)过渡到紫罗兰色(红绿蓝:128, 0, 255)时,这条线的中点是白色(红绿蓝:192, 128, 128)。你编写的代码并不是要经过白色,而是经过红绿蓝空间,而红绿蓝空间的中间有一个白色形状的“空洞”。

当你在颜色过渡中看到白色闪烁时,你的大脑看到的不是平滑的渐变,而是一种中断。白色是一种重置。它感觉不像是在从黄色移动到紫罗兰色,而更像是发光二极管在重置,然后继续。

不会撒谎的色彩空间

答案是使用色相、饱和度、明度空间,而不是红绿蓝空间。

色相、饱和度、明度(HSV)通过色轮上的位置来描述颜色,而不是通过通道混合。在色相、饱和度、明度空间中,从黄色到紫罗兰色只是绕色轮走一小段路——你不会经过白色,因为白色不是你行走路径上的一个位置,它是颜色的缺失。

\c
// 色相、饱和度、明度方法:绕色轮的最短路径
float startHue = map(timeNow, timeStart, timeEnd, startHue, endHue);
CHSV hsv;
hsv.hue = startHue;
hsv.saturation = 255;
hsv.value = 255;
return strip.ColorHSV(hsv);
\
\

在色相、饱和度、明度空间中,从黄色到紫罗兰色:没有白色,没有重置。这是一种干净的光谱过渡,你的大脑将其解读为连续的运动。

代码更简短,结果感觉更有生命力。这就是导航红绿蓝空间与导航色彩空间之间的区别。

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
支持 反馈 订阅 数据
回到顶部