打印

[讨论] Kirikiri2系统的txt分割型立绘的合成问题

引用:
原帖由 sfsuvival 于 2010-04-08 19:23 发表


不是指这段吧...

我找不到其它先混合出result再与dest进行blending的地方...

IM可能还有其它处理
只用CompositeLinearDodge做不到效果...
case SUBTRACT:
                    return new Blender() {
                        @Override
                        public void blend(int[] src, int[] dst, int[] result) {
                            result[0] = Math.max(0, src[0] + dst[0] - 256);
                            result[1] = Math.max(0, src[1] + dst[1] - 256);
                            result[2] = Math.max(0, src[2] + dst[2] - 256);
                            result[3] = Math.min(255, src[3] + dst[3] - (src[3] * dst[3]) / 255);
                        }
                    };

这部是是linearburn

                    dstPixels[x] = ((int) (dstPixel[3] + (result[3] - dstPixel[3]) * alpha) & 0xFF) << 24 |
                                   ((int) (dstPixel[0] + (result[0] - dstPixel[0]) * alpha) & 0xFF) << 16 |
                                   ((int) (dstPixel[1] + (result[1] - dstPixel[1]) * alpha) & 0xFF) <<  8 |
                                    (int) (dstPixel[2] + (result[2] - dstPixel[2]) * alpha) & 0xFF;

这部是alpha blending


不过,其实不要紧,我搞定了


public int lineardodge() {
                Ra = RoundToUnity(Sa + Da);
                return (int) (Ra * 255);
        }

        public int lineardodge(int src, int dest) {
                Sc = src / 255D;
                Dc = dest / 255D;
                Sca = Sa * Sc;
                Dca = Da * Dc;
                return (int) (RoundToUnity(Sca + Dca) / Ra * 255);
        }

        public int linearburn() {
                Ra = Sa + Da - Sa * Da;
                return (int) (Ra * 255);
        }

        public int linearburn(int src, int dest) {
                Sc = src / 255D;
                Dc = dest / 255D;
                Sca = Sa * Sc;
                Dca = Da * Dc;
                return (int) (RoundToUnity(Sca + Dca - Sa * Da) / Ra * 255);
        }

目测与PS一样了,linearburn把f=Sc+Dc-1代入SVG那个公式,并设x,y,z=1(我猜的)
lineardodge其实就是plus,只不过原来没做区间验证,所以有问题,不过我看不懂公式怎么计算出Sa + Da的?

[ 本帖最后由 haibara 于 2010-04-08 21:15 编辑 ]
sfsuvival, 我想问你的PSD是怎么做

如何正确解析TXT中的合成关系?有什么公式吗
引用:
原帖由 haibara 于 2010-04-08 20:53 发表
case SUBTRACT:
                    return new Blender() {
                        @Override
                        public void blend(int[] src, int[] dst, int[] result) {
                            result[0] = Math.max(0, src[0] + dst[0] - 256);
                            result[1] = Math.max(0, src[1] + dst[1] - 256);
                            result[2] = Math.max(0, src[2] + dst[2] - 256);
                            result[3] = Math.min(255, src[3] + dst[3] - (src[3] * dst[3]) / 255);
                        }
                    };

这部是是linearburn

                    dstPixels[x] = ((int) (dstPixel[3] + (result[3] - dstPixel[3]) * alpha) & 0xFF) << 24 |
                                   ((int) (dstPixel[0] + (result[0] - dstPixel[0]) * alpha) & 0xFF) << 16 |
                                   ((int) (dstPixel[1] + (result[1] - dstPixel[1]) * alpha) & 0xFF) <<  8 |
                                    (int) (dstPixel[2] + (result[2] - dstPixel[2]) * alpha) & 0xFF;

这部是alpha blending
我是看不懂你为何做linearburn之后又做alpha blending...
BlendComposite那个alpha你也说是自定义的图层alpha
只做linearburn就可以了...
不过既然你搞定了,也不深究下去了
引用:
不过我看不懂公式怎么计算出Sa + Da的?
我也不明白SVG的plus
f(Sc,Dc) = Sc + Dc
X        = 1
Y        = 1
Z        = 1

Da'  = X.Sa.Da  + Y.Sa.(1-Da)   + Z.Da.(1-Sa)
按理是
Da'  = Sa.Da  + Sa.(1-Da)   + Da.(1-Sa)
     = Sa + Da - Sa.Da
真的不知道如何会变成这样…
Da'  = Sa.Da + Da.Sa + Sa.(1 - Da) + Da.(1 - Sa)
     = Sa + Da
引用:
原帖由 haibara 于 2010-04-09 14:06 发表
sfsuvival, 我想问你的PSD是怎么做

如何正确解析TXT中的合成关系?有什么公式吗
我是写Photoshop的脚本 (Script) 制作psd的
我只作過天神乱漫和メルクリア的psd
也只研究过这两个的txt文件

txt有两种
一种是描述图层的 (*.txt,不包括*_info.txt)
另一种是如何使用图层组成表情的 (*_info.txt)

描述图层的txt
引用:
#layer_type        name        left        top        width        height        type        opacity        visible        layer_id        group_layer_id       
layer_type是该图层是普通图层(ArtLayer) 还是图层文件夹(LayerSet/Group)
0是普通图层,2是图层文件夹
type见本帖1L
layer_id是分割后的图的id
group_layer_id是该图层所在的图层文件夹的id

天神乱漫的比较简单
type只有13和16
而且没有group_layer_id
メルクリア的很麻煩
我看過的type有13,14,16,21
而且有group_layer_id
图层名称混乱
还有些txt写是type=left=top=width=height=0的垃圾图层
(对应的是不透明全白32x32的32位图)


描述如何使用图层组成表情的txt
列大概有三种
1. dress为首的列,描述如何组成服装/身体
引用:
dress        01        base        ダミー
就是ダミー,沒用的…

天神乱漫
引用:
dress        パジャマ        diff        1        パジャマポーズA
dress        パジャマ        diff        2        パジャマポーズA(腕差分)
dress        制服春エプロン        diff        1        エプロン制服春ポーズA
dress        制服春エプロン        diff        2        エプロン制服春ポーズA(腕差分)
メルクリア
引用:
dress        01        diff        a        素体/01a
dress        01        diff        b        素体/01b
dress        01        diff        c        上乗せ/c指_通常
dress        01        diff        c        素体/01c
dress        01        diff        TA        素体/01TA
第二栏+第四栏是该组合的名称
第五栏是图层位置(素体/01a->”素体”图层文件夹下的”01a”图层)

虽说是组合
但不一定将其合并就了事
如上述メルクリア的
dress        01        diff        c        上乗せ/c指_通常
dress        01        diff        c        素体/01c
这个要”素体/01c” +face+”上乗せ/c指_通常” 依次迭上去
因为face会盖过手指
所以要用”上乗せ/c指_通常”盖上去

2. face为首的列,描述如何组成表情
天神乱漫
引用:
face        01        base        通常1
face        02        base        笑顔1
face        03        base        真剣
メルクリア
引用:
face        face01        base        表情/眉/01_02_03_04_14_22
face        face01        base        表情/目/01_02_06_13_21
face        face01        base        表情/口/01
face        face01        base        表情/頬hi/01_02_06_07_08_11_12_13_14_15_16_17_18_21
第二栏是该组合的名称
第四栏是图层位置

3. rename为首的列,用来重命名以上组合
メルクリア
引用:
rename        dress        制服1        01
rename        diff        腕上げ        a
rename        face        通常        face01
第二栏是组合类型(diff是dress列的diff)
将第四栏的名称重命名为第三栏
01->制服1
a->腕上げ
face01->通常

合成基本就是将face的组合迭在dress的组合上
例外就是上面提到的”素体/01c” +face+”上乗せ/c指_通常”

完...

[ 本帖最后由 sfsuvival 于 2010-04-19 20:49 编辑 ]
补充33L的内容,之前忘了说
1. 我看过有些メルクリア描述图层的txt的opacity不是255,是230的
所以opacity也不能忽视
整个txt看来也只有visible栏可以不理…
2. 33L写的 素体/01a->”素体”图层文件夹下的”01a”图层
“01a” 不一定是图层,可以是图层文件夹
素体/01a可以是指”素体”图层文件夹下的”01a”图层文件夹下的所有图层
3.
引用:
face        face01        base        表情/眉/01_02_03_04_14_22
face        face01        base        表情/目/01_02_06_13_21
face        face01        base        表情/口/01
face        face01        base        表情/頬hi/01_02_06_07_08_11_12_13_14_15_16_17_18_21
在组合内出现的先后是图层的次序
“表情/頬hi/01_02_06_07_08_11_12_13_14_15_16_17_18_21” 是底
依次迭上去是” 表情/口/01”
“表情/目/01_02_06_13_21”
最上的是” 表情/眉/01_02_03_04_14_22”

试了一下kirikiri2TXT
kirikiri2TXT没有输出txt记录的整张图的大小
你是交给DirectMuxer根据要合成的图决定合成图的大小?

现在kirikiri2TXT是将分割图根据txt的图层名称,再加上坐标和合成方式重命名吧?
如果*_info.txt没有rename命令
图的名称就只用*.txt内的图层名称
否则根据*_info.txt的rename命名?

kirikiri2TXT根据*_info.txt的rename重命名分割图有问题
rename是用来重命名一组图
不是针对一张图的
而每张图也可以属于多组合内
引用:
face        face01        base        表情/眉/01
face        xface01        base        表情/眉/01
"表情/眉/01"同时出现在face01和xface01
kirikiri2TXT将"表情/眉/01"命名为xface01在rename对应的名称
没有了face01的
解决方法可以是将属于多个组合的图复制多张再命名


用了メルクリア和天神乱漫的txt做测试

メルクリア
引用:

2010/04/19 3:17:21 kirikiri2TXT txt2bat
Warning: matched not definition 表情/その他/06 of Z:\TEMP\k\bst_02日未子_正面_1_7291.png
你应该是没有忽略以#开首的行吧?
所以有这个警告

天神乱漫
引用:
2010/04/19 3:17:15 kirikiri2TXT txt2bat
致命的: matched unknown layer id 498 of Z:\TEMP\a\葵_ポーズa_1_498.png

2010/04/19 3:17:15 kirikiri2TXT txt2bat
致命的: matched unknown layer id 514 of Z:\TEMP\a\葵_ポーズa_1_514.png

2010/04/19 3:17:15 kirikiri2TXT txt2bat
致命的: matched unknown layer id 421 of Z:\TEMP\a\葵_ポーズa_1_421.png
这三张是txt没有记录的图
你是读整个文件夹的所有分割图然后再在对应的txt找图层属性?

[ 本帖最后由 sfsuvival 于 2010-04-20 11:15 编辑 ]
opacity:指的是当前图层的opacity吧
是的
opacity栏的数值指的是该图层的opacity
我说opacity是230的那组立绘
http://u.115.com/file/t12d795f1f
引用:
原帖由 sfsuvival 于 2010-05-21 00:22 发表
是的
opacity栏的数值指的是该图层的opacity
我说opacity是230的那组立绘
http://u.115.com/file/t12d795f1f
那比分计算alpha

按照SVG里应该是这样吧

Sa = (double) alpha / opacity;
Da = (double) beta / opacity;

原来是
Sa = (double) alpha / 255;
Sa = (double) beta / 255;
应该是乘吧
如果opacity是[0,1] 的话
Sa = (double) alpha * opacity;
如果opacity是[0,255] 的话
Sa = (double) alpha / 255 * opacity;
引用:
原帖由 sfsuvival 于 2010-05-21 22:50 发表
应该是乘吧
如果opacity是[0,1] 的话
Sa = (double) alpha * opacity;
如果opacity是[0,255] 的话
Sa = (double) alpha / 255 * opacity;
SVG里Sa, Da肯定是[0,1], opacity按照txt来看是[0,255]
查看积分策略说明

快速回复主题

选项

[完成后可按 Ctrl+Enter 发布]  预览帖子  恢复数据  清空内容

当前时区 GMT+8, 现在时间是 2024-03-28 17:23

Processed in 0.017633 second(s), 5 queries.