The Gene of Bitizens
1. Summary
The document is about the general idea of the architecture design of the Bitizens game, the detail logic is more complicated than what is documented here, and the actual logic will be somewhat different from what is documented here. For details and the acurate logic, please refer to the code.
2. Face
2.1. UI

2.2. Data Structure
The actual structure is far more complicated than what is demoed below, for details, please refer to the code in the project.
{
"GenePool": {
"Face": {
"00": "3DModel00",
"01": "3DModel01",
"02": "3DModel02"
},
"Eyes": {
"00": {
"Eye_L_1": { "PX": 0, "PY": 0, "PZ": 0 },
"Eye_R_1": { "PX": 0, "PY": 0, "PZ": 0 },
"Eye_L_2": { "PX": 0, "PY": 0, "PZ": 0 },
......
},
"01": {
},
"02": {
}
},
"Nose": {
"00": {
"Nose": { "SX": 0, "SY": 0, "SZ": 0 },
"Nose_1": { "SX": 0, "PY": 0, "PZ": 0 },
"Nose_2": { "SX": 0, "PY": 0, "PZ": 0 },
"Nose_3": { "SX": 0, "PY": 0, "PZ": 0 }
}
},
"Mouth": {
"00": {
"Mouth_L": { "PX": 0, "PY": 0, "PZ": 0 },
"Mouth_R": { "PX": 0, "PY": 0, "PZ": 0 },
"Mouth_T": { "SX": 0, "PY": 0, "PZ": 0 },
"Mouth_B": { "SX": 0, "PY": 0, "PZ": 0 }
}
},
"Eyebrow": {
"00": {
"Brow_L_1": { "PX": 0, "PY": 0, "PZ": 0 },
"Brow_R_1": { "PX": 0, "PY": 0, "PZ": 0 }
}
},
"Cheeks": {
"00": {
"Cheek_L_1": { "PX": 0, "PY": 0, "PZ": 0 },
"Cheek_R_1": { "PX": 0, "PY": 0, "PZ": 0 }
}
},
"Jaw": {
"00": {
"Jaw_L": { "PX": 0, "PY": 0, "PZ": 0 },
"Jaw_R": { "PX": 0, "PY": 0, "PZ": 0 }
}
},
"Chin": {
"00": {
"Chin": { "SX": 0, "PY": 0, "PZ": 0 }
}
},
"Brow": {
"00": {
"Brow_L_1": { "PX": 0, "PY": 0, "PZ": 0 },
"Brow_R_1": { "PX": 0, "PY": 0, "PZ": 0 }
}
}
}
}
2.3. Description
The data structure is in JSON format.
2.3.1. Face DNA
Each face part has a gene, which is a 2-digit number, so we have 100 possibilities for each part (Considering that we can have more than one 3D models, the number of possibilities for each face part is actually 100 x number of models). The whole DNA for an avatar face is a combination of each gene from each face part.
Face DNA is a 30-digit number, we may use the first say 18 digits for the moment, and the left 12 digits will be reserved for future extension. The last 12 digits that are not used should be placed with twelve 0s.
So the DNA for an avatar face may be like: 000201902214296466 + twelve 0s
Face00Eyes02Nose01Mouth90Eyebrow22Cheeks14Jaw29Chin64Brow66 + twelve 0s
2.3.2. Gene Pool

Our artists need to list out all the possible genes for each face part in a data file using the above structure.
On the UI, each gene for a face part is represented by an icon. We can name the image file of an icon to be “face part name plus a 2-digit”. For example: Nose99.jpg

"Nose_2": The name of a specific bone.
"PX", "PY", "PZ": XYZ values for each axis of the bone position.
"SX", "SY", "SZ": XYZ values for each axis of the bone scale.
2.3.3. Main Workflow
- Loading
○ User hasn’t created an avatar before
First we generate a random DNA number, then find the corresponding settings in our gene pool file. Finally we use the settings to update the UI and the avatar.
Note: Say we may have only 7 different types of noses as designed (even though 2 digits allow 100 possible options), and suppose that the 2 digits generated randomly for the nose gene are 83. To map 83 to a nose type, we do 83 % 7 = 6. So this avatar would have the 06 gene for the nose.
○ User has created an avatar before
First, we access Blockchain for the data of the current user, and then use the DNA number from Blockchain to find the corresponding settings in our gene pool file. Finally we use the settings to update the UI and the avatar.
- Customizing
When user click on a face part icon on the UI, first we find the icon name, say Nose09.jpg, then we strip out the gene number 09, finally we look up the gene pool file to find the 09 gene data, and use the data to update the corresponding bones in the face model.
- Save
Find out all the gene numbers for all face parts user has selected on the UI, then combine them to be a complete DNA and save it on Blockchain.
2.4. Whole DNA
The whole DNA of an avatar will be a 76-digit number, which consists of 4 parts: Face DNA, Body DNA, Skin DNA, Gender DNA.
DNA of an avatar will be stored on Blockchain.
2.4.1. Face DNA
Face DNA is a x-digit number.
2.4.2. Body DNA
Body DNA is a y-digit number.
2.4.3. Skin DNA
Skin DNA is a z-digit number.
2.4.4. Gender DNA
Gender DNA is represented by 1-digit. 0 represents female, 1 represents male.
3. MVC Pattern


The Gene of Bitizens的更多相关文章
- KEGG and Gene Ontology Mapping in Bioinformatic Method
使用KOBAS进行KEGG pathway和Gene Ontology分析 Article from Blog of Alfred-Feng http://blog.sina.com.cn/u/170 ...
- 合并基因表达水平(merge gene expression levels, FPKM)
使用tophat和cufflinks计算RNA-seq数据的表达水平时,当一个基因在一个样本中有多个表达水平时需要合并它们的表达水平. This code is a solution to colla ...
- augustus, gene prediction, trainning
做基因组注释 先用augustus训练,然后再用maker做基因注释 augustus提供一些训练好的,如果有和你的物种非常接近的,直接用提供的,没有的话再自己训练. 网址: http://bioin ...
- gene框架文档 - 路由类 gene_router
路由类 Gene\Router 介绍 Gene\Router 是gene框架的核心类之一,本框架区别于其他常见框架的最大地方就是独特.强大.简单的路由定义等.路由强大灵活,支持回调.类方法:支持res ...
- gene框架文档 - 概述
欢迎使用Gene框架 最新版本:V1.2.2 开源地址:https://github.com/sasou/php-gene 作者:sasou 文档地址:http://php-gene.com/doc ...
- Human Gene Functions
Human Gene Functions Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18053 Accepted: 1004 ...
- POJ 1080 Human Gene Functions -- 动态规划(最长公共子序列)
题目地址:http://poj.org/problem?id=1080 Description It is well known that a human gene can be considered ...
- poj1080--Human Gene Functions(dp:LCS变形)
Human Gene Functions Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17206 Accepted: ...
- 杭电20题 Human Gene Functions
Problem Description It is well known that a human gene can be considered as a sequence, consisting o ...
随机推荐
- Android Studio插件之MVPHelper,一键生成MVP代码
MVP盛行,听到的最多的抱怨就是咋要写这么多接口,那么本文作者提供了一个插件,自动生成这些接口的声明.感兴趣的还可以学习该插件的写法,按照自己平时的需求修改,提供开发效率. MVPHelper 一款I ...
- Android8.0适配那点事(一)
最近有小伙伴说,7.0适配整了一波,现在又要来适配8.0,真是一波未平一波又起 但是作为开发者来说,学无止境,不跟上时代的步伐,肯定会被时代所淘汰... 话说Android P已经在路上了,你准备好了 ...
- 使用 Azure CLI 创建 Linux 虚拟机
Azure CLI 用于从命令行或脚本创建和管理 Azure 资源. 本指南详细介绍了如何使用 Azure CLI 部署运行 Ubuntu 服务器的虚拟机. 服务器部署以后,将创建 SSH 连接,并且 ...
- SQL Server ->> 查询添加XLOCK表提示不阻塞其他线程
BEGIN TRAN BEGIN END DROP TABLE IF EXISTS tempdb..#t CREATE TABLE #t ( spid int, dbid int, ObjId int ...
- 如何在ScrollView滑动的瞬间禁用拖拽手势
如何在ScrollView滑动的瞬间禁用拖拽手势 效果: 在UIScrollView滑动的瞬间禁用pan手势,可以防止用户按着屏幕不放后导致出现的一些莫须有的bug. // // ViewContro ...
- Linux history命令详解
history命令用于显示指定数目的指令命令,读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件. 该命令单独使用时,仅显示历史命令,在命令行中,可以使用符号!执行指定 ...
- UI(二)之正式过程
2018-12-04 09:48:25 1.SetWindowsHookEx ·钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统.每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获 ...
- HBase搭建部署
基础环境准备 zookeeper集群(参开地址:https://www.cnblogs.com/starzy/p/10376642.html) Hadoop集群(参考地址:https://www.cn ...
- SQLServer------查询结果为空的列赋默认值
ISNULL(字段,默认值) 如:SELECT ISNULL(name,'无名') FROM [User]
- 批量删除Redis中的数据
测试环境上是docker安装的redis,生产上使用的是阿里云Redis服务,需要批量清理生产上的数据. 阿里云提供了BS结构的工具管理Redis,但是不能全选批量删除,只能脚本删除,方法是在测试环境 ...