求助大佬,这个皮革装备的颜色叠加是怎么算的啊,能解释一下吗(见第四张图),原版1.15.2比如第一张图里只加一个绿色染料是5E7C16(94,124,22),第二张图里只加一个淡蓝色染料是3AB3DA(58,179,218),第三张图里两个同时加就变成了56AB87(86,171,135)
 
 
 
 
 
 
另外我在wiki上找到了这张图,但是我看不懂QAQ,能拿上图的具体数字举个例子代入公式吗
 
 
另外我在wiki上找到了这张图,但是我看不懂QAQ,能拿上图的具体数字举个例子代入公式吗
最终颜色是元数据表达,十六进制数值会在物品说明中显示,然而,使用命令的NBT数值设定颜色要使用十进制数值。颜色是很复杂的,具体很难讲,简单一点就是不止有红场黄绿青蓝紫这基本颜色,还有很多很多衍生颜色,比如黄绿色染料。(打字不易,如果有用记得佳评。)
 
 本帖最后由 EmptyLava 于 2021-7-18 17:25 编辑 
写得太烂了,楼上楼下解释得更好
写得太烂了,楼上楼下解释得更好
绿色是(94,124,22),浅蓝色是(58,179,218),单独染色的时候就可以看出来。
原理就是把格子里的所有染料都拿出来,把颜色一加,颜色总数(染料总数)一加,最后一通计算,得出结果。
# 假设遇到的第一个染料是绿色,redValue,greenValue,blueValue 分别是 94, 124, 22.
# totalRed,totalGreen,totalBlue 原本是 0(因为皮革帽子原本没染色),现在变成了 94, 124, 22.
# totalMaximum 原本是0,但是现在变成了124(取绿色里 RGB 里最大的 124 然后相加)。
# 总颜色数(染料数) numberOfColors 原本是 0,变成 1。
# 遇到的第二个染料是浅蓝色,redValue, greenValue, blueValue 分别是 58, 179, 218,上述过程再来一遍。
# totalRed, totalGreen, totalBlue 原本是 94, 124, 22,再把浅蓝色的颜色一加,就变成了 152, 303, 240.
# totalMaximum 原本是124,现在变成了 342(取浅蓝色里 RGB 里最大的 218 然后相加)。
# 总颜色数(染料数) numberOfColors 原本是 1,变成 2。
# 然后没染料了,退出循环。
# 平均 RGB = 之前计算出的总的 RGB 值 / 颜色数。
# maximumOfAverage 得到平均 RGB 里最大的。
# 计算最终结果。
# 四舍五入之后就是 (86,171,135)。
# 我不会编程,以上内容都是我猜的(
原理就是把格子里的所有染料都拿出来,把颜色一加,颜色总数(染料总数)一加,最后一通计算,得出结果。
# 假设遇到的第一个染料是绿色,redValue,greenValue,blueValue 分别是 94, 124, 22.
代码:
- totalRed = totalRed + redValue
 
- totalGreen = totalGreen + greenValue
 
- totalBlue = totalBlue + blueValue
代码:
- totalMaximum = totalMaximum + max(red, green, blue)
 
- numberOfColors = numberOfColors + 1
# 总颜色数(染料数) numberOfColors 原本是 0,变成 1。
# 遇到的第二个染料是浅蓝色,redValue, greenValue, blueValue 分别是 58, 179, 218,上述过程再来一遍。
代码:
- totalRed = totalRed + redValue
 
- totalGreen = totalGreen + greenValue
 
- totalBlue = totalBlue + blueValue
代码:
- totalMaximum = totalMaximum + max(red, green, blue)
 
- numberOfColors = numberOfColors + 1
# 总颜色数(染料数) numberOfColors 原本是 1,变成 2。
# 然后没染料了,退出循环。
# 平均 RGB = 之前计算出的总的 RGB 值 / 颜色数。
代码:
- averageRed = totalRed / numberOfColors = 152/2 =76
 
- averageGreen = totalGreen / numberOfColors = 303/2=151.5
 
- averageBlue = totalBlue / numberOfColors = 240/2 = 120
 
- averageMaximum = totalMaximum / numberOfColors = 342/2 = 171
代码:
- maximumOfAverage = max(averageRed, averageGreen, averageBlue) = 151.5
 
- gainFactor = averageMaximum / maximumOfAverage = 171/151.5 = 1.1287128712871286
代码:
- resultRed = averageRed * gainFactor = 76 * 1.1287128712871286 = 85.78217821782178
 
- resultGreen = averageGreen * gainFactor = 151.5 * 1.1287128712871286 = 170.99999999999997
 
- resultBlue = averageBlue * gainFactor = 120 * 1.1287128712871286 = 135.44554455445544
# 我不会编程,以上内容都是我猜的(
就类似于你玩水彩调颜料一样——主要还是靠感觉调的,要细讲很复杂
如果需要可以用一下rgb的网站来辅助一下调色:https://m.fontke.com/tool/rgb/5e7b11/
但要什么rgb公式来搞的话,我建议还是算了吧
如果需要可以用一下rgb的网站来辅助一下调色:https://m.fontke.com/tool/rgb/5e7b11/
但要什么rgb公式来搞的话,我建议还是算了吧
 本帖最后由 chixvv 于 2021-7-21 20:47 编辑 
如果我没理解错的话如果帽子本身已经染色:
 
 
如果帽子本身还未染色:
(R i,G i,B i)(1≤i≤n)都是染料的颜色值,公式不变
如果我没理解错的话如果帽子本身已经染色:
 
如果帽子本身还未染色:
(R i,G i,B i)(1≤i≤n)都是染料的颜色值,公式不变
一般都是靠感觉的吧(美术生路过)
第一个值是红色 第二个值是绿色 第三个值是蓝色
(=°ω°)丿 发表于 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代码
 本帖最后由 chixvv 于 2021-7-22 10:21 编辑 
因为颜料的颜色是用0.0F~1.0F的值表示的
帽子的颜色是用0~255的整数表示的
再加上mojang的迷惑代码,以及数字在数据类型之间有意无意的转化
最后结果肯定会有偏差
以下是具体一点的代码:
mlybj 发表于 2021-7-21 17:37
然而我试过好像并不是四舍五入(((
图1里的112.98989898989898在游戏里(图2)变成了112(9C706C→(15 ...
因为颜料的颜色是用0.0F~1.0F的值表示的
帽子的颜色是用0~255的整数表示的
再加上mojang的迷惑代码,以及数字在数据类型之间有意无意的转化
最后结果肯定会有偏差
以下是具体一点的代码:
 本帖最后由 mlybj 于 2021-7-22 01:15 编辑 
其它地方都懂了,也写出来了(并且基本无误了),但是有个地方出了小问题,图2中是B33780,而图3(游戏中)是B43780,根据小数部分也相差不大(179.99999999差不多180),我猜测是因为我染料的RGB没有取小数,然后再乘以255,导致算出了偏差。但是我也不知道mj的染料RGB获取这里是保留了几位小数啊。
我刚试了一下保留5位好像不对,代码还是附上了
 
 
 dye.rar
(1 KB, 下载次数: 4)
dye.rar
(1 KB, 下载次数: 4)
 
 
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位好像不对,代码还是附上了
 
 本帖最后由 chixvv 于 2021-7-22 15:51 编辑 
颜料的颜色乘上255后得到的整数颜色是固定的整数,不会造成结果的偏差
所以修改了一下昨天的代码,颜料的颜色直接用整数表示,你再看一看
然后你写的python代码可能会造成一些精度损失
我对python不了解,但是运行下面的代码
a=180.0/156.0
print(float(156*a))
你能发现179.99999999999997是python造成的
颜料的颜色乘上255后得到的整数颜色是固定的整数,不会造成结果的偏差
所以修改了一下昨天的代码,颜料的颜色直接用整数表示,你再看一看
然后你写的python代码可能会造成一些精度损失
我对python不了解,但是运行下面的代码
a=180.0/156.0
print(float(156*a))
你能发现179.99999999999997是python造成的
(=°ω°)丿 发表于 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表示的都是单精度
chixvv 发表于 2021-7-22 15:53
180.0/156.0*156.0确实等于(double)179.99999999999997
但代码用的都是float类型
(float)179.999999999999 ...
已经想到办法并解决了,非常感谢大佬w
 
 
 
 
 
 
