骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 小黑盒加速器
查看: 3929|回复: 4

[经验与教程] 花糕滴小知识——Facekey脸部代码篇细说(持续更新)

[复制链接]

17

主题

627

回帖

343

积分

见习骑士

Rank: 3

UID
3102512
第纳尔
2375
精华
0
互助
30
荣誉
0
贡献
0
魅力
74
注册时间
2019-9-6

骑砍中文站APP会员勋章战团正版勋章霸主正版勋章

鲜花(54) 鸡蛋(0)
发表于 2024-6-18 00:46:39 | 显示全部楼层 |阅读模式
本帖最后由 huagao 于 2024-6-18 14:07 编辑

    最近和@战争傀儡阿格兰 讨论自制捏脸界面的时候,顺手翻了一下以前的一些笔记,今天研究了一下关于facekey的一些操作,从此开始细说一下,落笔时尚未完全摸索完毕,但大框架已经探寻的差不多了,剩下的会逐步补充。

一,Facekey的结构
    1. 我们首先明确一点,facekey的结构构成并不一定是要64位的十六进制数字的,可以是更多位的一组数字。下面这四个是同一个面部代码,即引擎调用的时候引擎调用的时候从高到低(从左往右)的64位,更低位的会被直接忽略,这个后面有用。
  1. #  0x00000000160c020136db6db6db6db6db00000000001db6db0000000000000000
  2. #  0x00000000160c020136db6db6db6db6db00000000001db6db000000000000000000000
  3. #  0x00000000160c020136db6db6db6db6db00000000001db6db000000000000000012345
  4. #  0x00000000160c020136db6db6db6db6db00000000001db6db0000000000000000abcde
复制代码
   
    2.在module_skins里面,我们可以看到如下声明,指的是捏脸界面里面右侧滑条从下到上的序号,即界面里面相对代码序号是倒着排列的,这个后面有用。
  1. chin_size = 0
  2. chin_shape = 1
  3. chin_forward = 2
  4. jaw_width = 3
  5. jaw_position = 4
  6. mouth_nose_distance = 5
  7. mouth_width = 6
  8. cheeks = 7
  9. nose_height = 8
  10. nose_width = 9
  11. nose_size = 10
  12. nose_shape = 11
  13. nose_bridge = 12
  14. cheek_bones = 13
  15. eye_width = 14
  16. eye_to_eye_dist = 15
  17. eye_shape = 16
  18. eye_depth = 17
  19. eyelids = 18
  20. eyebrow_position = 19
  21. eyebrow_height = 20
  22. eyebrow_depth = 21
  23. eyebrow_shape = 22
  24. temple_width = 23
  25. face_depth = 24
  26. face_ratio = 25
  27. face_width = 26
复制代码
   
    3.看的出来这些序号的脸部细节对应着facekey里面的一段一段的数值,即每个滑条overlay在click触发器里面获取到的值会被存进新的facekey里面,故而假设我们足够耐心,挨个比对就可以区分出每个脸部细节对应的区间了。
    但是如果只是区间比对的话,那获取对应脸部细节的操作只需要除法取商再取余就可以了,完全不需要这两个op

  1. face_keys_get_morph_key               = 2766 # (face_keys_get_morph_key, <destination>, <string_no>, <key_no>), #Stores face key's morph key value (0-7) into <destination>
  2. face_keys_set_morph_key               = 2767 # (face_keys_set_morph_key, <string_no>, <key_no>, <value>), #Sets face key's morph key value (0-7)
复制代码
    另外我们可以自行测试,会发现有的位,动不同控件时都会改变,即两个不同控件都会影响到输出的facekay的同一个位上的值,似乎很奇怪,例如:
  1. #  0x0000000 00 0 0c030136db6db6db6db6db00000000001db6db0000000000000000  (1)  仅对年龄做多次随机选择,输出的facekey
  2. #  0x0000000 40 0 0c030136db6db6db6db6db00000000001db6db0000000000000000  (2)
  3. #  0x0000000 70 0 0c030136db6db6db6db6db00000000001db6db0000000000000000  (3)
  4. #  0x0000000 9c 0 0c030136db6db6db6db6db00000000001db6db0000000000000000  (4)
  5. #  0x0000000 fc  0 0c030136db6db6db6db6db00000000001db6db0000000000000000  (5)

  6. #  0x0000000 fd  c 0c030136db6db6db6db6db00000000001db6db0000000000000000  (6)  在5的基础上,对发色做随机选择,输出的facekey
  7. #  0x0000000 ff  a 0c030136db6db6db6db6db00000000001db6db0000000000000000  (7)
复制代码
   前五条为我们不动其他,仅对年龄做多次随机选择,输出的facekey,很容易会发现第8-9位发生了变化,疑似是第8-9位存放的是年龄的值;

    接下来(6)(7)是在(5)的基础上,对发色做两次随机选择,输出的facekey,会发现第9-10位发生了变化。

    这里有三个疑点,一个是为什么不同的控件会影响到同一位的数值;另一个是如果两位存放一个脸部细节的话,那么27个脸部细节需要至少54位数参与,但是在我测试的过程中发现有不止10位数都没有参与facekey的输出;以及face keys get/set morph key看似多此一举的两个函数。

    这三个疑点直接指向了解决思路:转换进制的位运算
    我将很多测试结果转二进制发现事实上每6个字符控制了1个脸部细节,为了方便理解,我将上述七条例子转四进制展示,并将多余高低位省略,即为:

  1. #  ...000 000 003000030...  (1)
  2. #  ...100 000 003000030...  (2)
  3. #  ...130 000 003000030...  (3)
  4. #  ...213 000 003000030...  (4)
  5. #  ...333 000 003000030...  (5)
  6. #  ...333 130 003000030...  (6)
  7. #  ...333 322 003000030...  (7)
复制代码
   可以观察到,在(1)到(5)我们只改变年龄的输出结果里面,发生变化的是前三位,而在(5)的基础上改变发色的(6)(7)的输出结果里,发生变化的是后三位。
    由此可得,对于“皮肤”,“胡子”,“发型”,“年龄” 等等捏脸界面左侧的控件,facekey的真正结构是每3个十六进制位对应4个不同的脸部细节


    4.关于module_skins里声明的一些东西
    module_skins里声明的是捏脸界面右侧从 “面部宽度” 到 “下巴大小” 这些脸部细节,那么为什么这些序号里面没有包括 “皮肤”,“胡子”,“发型”,“年龄” 等等捏脸界面左侧的控件呢?
    事实上这两部分的存放方式不一样,module_skins里声明的控件的值另有存放方式(太晚了,先睡觉,明天继续写)

二,Facekey的处理手段(太晚了,先睡觉,明天继续写)
三,Facekey关于自制捏脸界面的一些实现(太晚了,先睡觉,明天继续写)



评分

参与人数 1第纳尔 +20 互助 +1 魅力 +10 收起 理由
Aomine Daiki + 20 + 1 + 10 文章不错,继续努力!期待更新.

查看全部评分

解解解解解解解解解解解解解解解解解解

16

主题

107

回帖

197

积分

见习骑士

Rank: 3

UID
3304622
第纳尔
690
精华
0
互助
26
荣誉
3
贡献
0
魅力
158
注册时间
2021-12-28
鲜花(31) 鸡蛋(0)
发表于 2024-6-26 23:08:53 | 显示全部楼层
这坑感觉有点大,坐等更新

10

主题

174

回帖

100

积分

见习骑士

Rank: 3

UID
1411320
第纳尔
670
精华
0
互助
5
荣誉
2
贡献
0
魅力
23
注册时间
2013-6-13

战团正版勋章

鲜花(9) 鸡蛋(0)
发表于 2024-8-5 23:16:22 | 显示全部楼层
别睡了!别睡了!块起来写啦!

俺最近正在给自定义兵种增加随机脸,正好想请教~~尼快来~~

顺便问问可不可以加好友~

17

主题

627

回帖

343

积分

见习骑士

Rank: 3

UID
3102512
第纳尔
2375
精华
0
互助
30
荣誉
0
贡献
0
魅力
74
注册时间
2019-9-6

骑砍中文站APP会员勋章战团正版勋章霸主正版勋章

鲜花(54) 鸡蛋(0)
 楼主| 发表于 2024-8-6 22:10:21 | 显示全部楼层
秦雨子瀾 发表于 2024-8-5 23:16
别睡了!别睡了!块起来写啦!

俺最近正在给自定义兵种增加随机脸,正好想请教~~尼快来~~

行吧行吧。。最近有点偷懒,qq1257050262
解解解解解解解解解解解解解解解解解解

10

主题

174

回帖

100

积分

见习骑士

Rank: 3

UID
1411320
第纳尔
670
精华
0
互助
5
荣誉
2
贡献
0
魅力
23
注册时间
2013-6-13

战团正版勋章

鲜花(9) 鸡蛋(0)
发表于 2024-8-9 04:22:03 | 显示全部楼层
huagao 发表于 2024-8-6 22:10
行吧行吧。。最近有点偷懒,qq1257050262

感恩 来啦!!! 不着急
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2024-11-19 08:41 , Processed in 0.118934 second(s), 24 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表