mlybj
求助大佬,这个皮革装备的颜色叠加是怎么算的啊,能解释一下吗(见第四张图),原版1.15.2比如第一张图里只加一个绿色染料是5E7C16(94,124,22),第二张图里只加一个淡蓝色染料是3AB3DA(58,179,218),第三张图里两个同时加就变成了56AB87(86,171,135)

另外我在wiki上找到了这张图,但是我看不懂QAQ,能拿上图的具体数字举个例子代入公式吗



执光
最终颜色是元数据表达,十六进制数值会在物品说明中显示,然而,使用命令的NBT数值设定颜色要使用十进制数值。颜色是很复杂的,具体很难讲,简单一点就是不止有红场黄绿青蓝紫这基本颜色,还有很多很多衍生颜色,比如黄绿色染料。(打字不易,如果有用记得佳评。)

戴兜
有点粗糙,不要在意我的丑字

EmptyLava
本帖最后由 EmptyLava 于 2021-7-18 17:25 编辑

写得太烂了,楼上楼下解释得更好

(=°ω°)丿
绿色是(94,124,22),浅蓝色是(58,179,218),单独染色的时候就可以看出来。
原理就是把格子里的所有染料都拿出来,把颜色一加,颜色总数(染料总数)一加,最后一通计算,得出结果。
# 假设遇到的第一个染料是绿色,redValue,greenValue,blueValue 分别是 94, 124, 22.

代码:

  1. totalRed = totalRed + redValue
  2. totalGreen = totalGreen + greenValue
  3. totalBlue = totalBlue + blueValue
# totalRed,totalGreen,totalBlue 原本是 0(因为皮革帽子原本没染色),现在变成了 94, 124, 22.

代码:

  1. totalMaximum = totalMaximum + max(red, green, blue)
  2. numberOfColors = numberOfColors + 1
# totalMaximum 原本是0,但是现在变成了124(取绿色里 RGB 里最大的 124 然后相加)。
# 总颜色数(染料数) numberOfColors 原本是 0,变成 1。
# 遇到的第二个染料是浅蓝色,redValue, greenValue, blueValue 分别是 58, 179, 218,上述过程再来一遍。

代码:

  1. totalRed = totalRed + redValue
  2. totalGreen = totalGreen + greenValue
  3. totalBlue = totalBlue + blueValue
# totalRed, totalGreen, totalBlue 原本是 94, 124, 22,再把浅蓝色的颜色一加,就变成了 152, 303, 240.

代码:

  1. totalMaximum = totalMaximum + max(red, green, blue)
  2. numberOfColors = numberOfColors + 1
# totalMaximum 原本是124,现在变成了 342(取浅蓝色里 RGB 里最大的 218 然后相加)。
# 总颜色数(染料数) numberOfColors 原本是 1,变成 2。
# 然后没染料了,退出循环。
# 平均 RGB = 之前计算出的总的 RGB 值 / 颜色数。

代码:

  1. averageRed = totalRed / numberOfColors = 152/2 =76
  2. averageGreen = totalGreen / numberOfColors = 303/2=151.5
  3. averageBlue = totalBlue / numberOfColors = 240/2 = 120
  4. averageMaximum = totalMaximum / numberOfColors = 342/2 = 171
# maximumOfAverage 得到平均 RGB 里最大的。

代码:

  1. maximumOfAverage = max(averageRed, averageGreen, averageBlue) = 151.5
  2. gainFactor = averageMaximum / maximumOfAverage = 171/151.5 = 1.1287128712871286
# 计算最终结果。

代码:

  1. resultRed = averageRed * gainFactor = 76 * 1.1287128712871286 = 85.78217821782178
  2. resultGreen = averageGreen * gainFactor = 151.5 * 1.1287128712871286 = 170.99999999999997
  3. resultBlue = averageBlue * gainFactor = 120 * 1.1287128712871286 = 135.44554455445544
# 四舍五入之后就是 (86,171,135)。
# 我不会编程,以上内容都是我猜的(

尸先peng
就类似于你玩水彩调颜料一样——主要还是靠感觉调的,要细讲很复杂
如果需要可以用一下rgb的网站来辅助一下调色:https://m.fontke.com/tool/rgb/5e7b11/

但要什么rgb公式来搞的话,我建议还是算了吧

chixvv
本帖最后由 chixvv 于 2021-7-21 20:47 编辑

如果我没理解错的话如果帽子本身已经染色:


如果帽子本身还未染色:
R i,G i,B i)(1≤i≤n)都是染料的颜色值,公式不变



‮gnep先尸
一般都是靠感觉的吧(美术生路过)

1415411745
第一个值是红色 第二个值是绿色 第三个值是蓝色

mlybj
(=°ω°)丿 发表于 2021-7-18 15:11
绿色是(94,124,22),浅蓝色是(58,179,218),单独染色的时候就可以看出来。
原理就是把格子里的所有染料都拿 ...

然而我试过好像并不是四舍五入(((

图1里的112.98989898989898在游戏里(图2)变成了112(9C706C→(156,112,108) ),而图3里的85.78217821782178却在游戏里(图4)变为了86(56AB87→(86,171,135))甚至出现109.19191919191918→108的情况
至于为啥会出现这种奇妙的状况我就不清楚了(目前猜测是染料的RGB有小数点导致不精确,以及代码写错了:P)

附上自己乱写的py代码
dye.rar (804 Bytes, 下载次数: 7)






chixvv
本帖最后由 chixvv 于 2021-7-22 10:21 编辑
mlybj 发表于 2021-7-21 17:37
然而我试过好像并不是四舍五入(((

图1里的112.98989898989898在游戏里(图2)变成了112(9C706C→(15 ...

因为颜料的颜色是用0.0F~1.0F的值表示的
帽子的颜色是用0~255的整数表示的
再加上mojang的迷惑代码,以及数字在数据类型之间有意无意的转化
最后结果肯定会有偏差

以下是具体一点的代码:

mlybj
本帖最后由 mlybj 于 2021-7-22 01:15 编辑
chixvv 发表于 2021-7-21 20:41
因为颜料的颜色是用0.0F~1.0F的值表示的
帽子的颜色是用0~255的整数表示的
再加上mojang的迷惑代码,以及 ...


其它地方都懂了,也写出来了(并且基本无误了),但是有个地方出了小问题,图2中是B33780,而图3(游戏中)是B43780,根据小数部分也相差不大(179.99999999差不多180),我猜测是因为我染料的RGB没有取小数,然后再乘以255,导致算出了偏差。但是我也不知道mj的染料RGB获取这里是保留了几位小数啊。
我刚试了一下保留5位好像不对,代码还是附上了


dye.rar (1 KB, 下载次数: 4)

chixvv
本帖最后由 chixvv 于 2021-7-22 15:51 编辑

颜料的颜色乘上255后得到的整数颜色是固定的整数,不会造成结果的偏差

所以修改了一下昨天的代码,颜料的颜色直接用整数表示,你再看一看

然后你写的python代码可能会造成一些精度损失
我对python不了解,但是运行下面的代码

a=180.0/156.0
print(float(156*a))

你能发现179.99999999999997是python造成的

chixvv
(=°ω°)丿 发表于 2021-7-22 14:58
我觉得这好像不单单是 python 的问题:
使用了在线工具:https://c.runoob.com/compile/10

180.0/156.0*156.0确实等于(double)179.99999999999997
但代码用的都是float类型
(float)179.99999999999997等于(float)180.0

百度了一下,原来python里的float是双精度。我给的代码里的float表示的都是单精度

mlybj
chixvv 发表于 2021-7-22 15:53
180.0/156.0*156.0确实等于(double)179.99999999999997
但代码用的都是float类型
(float)179.999999999999 ...

已经想到办法并解决了,非常感谢大佬w