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的更多相关文章

  1. 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 ...

  2. 合并基因表达水平(merge gene expression levels, FPKM)

    使用tophat和cufflinks计算RNA-seq数据的表达水平时,当一个基因在一个样本中有多个表达水平时需要合并它们的表达水平. This code is a solution to colla ...

  3. augustus, gene prediction, trainning

    做基因组注释 先用augustus训练,然后再用maker做基因注释 augustus提供一些训练好的,如果有和你的物种非常接近的,直接用提供的,没有的话再自己训练. 网址: http://bioin ...

  4. gene框架文档 - 路由类 gene_router

    路由类 Gene\Router 介绍 Gene\Router 是gene框架的核心类之一,本框架区别于其他常见框架的最大地方就是独特.强大.简单的路由定义等.路由强大灵活,支持回调.类方法:支持res ...

  5. gene框架文档 - 概述

    欢迎使用Gene框架 最新版本:V1.2.2 开源地址:https://github.com/sasou/php-gene 作者:sasou 文档地址:http://php-gene.com/doc ...

  6. Human Gene Functions

    Human Gene Functions Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18053 Accepted: 1004 ...

  7. POJ 1080 Human Gene Functions -- 动态规划(最长公共子序列)

    题目地址:http://poj.org/problem?id=1080 Description It is well known that a human gene can be considered ...

  8. poj1080--Human Gene Functions(dp:LCS变形)

    Human Gene Functions Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17206   Accepted:  ...

  9. 杭电20题 Human Gene Functions

    Problem Description It is well known that a human gene can be considered as a sequence, consisting o ...

随机推荐

  1. Difference between 'SAME' and 'VALID' padding

    Difference between 'SAME' and 'VALID' padding 'SAME' padding 和 'VALID' padding 的区别 If you like ascii ...

  2. UltraPtr下拉刷新

    github:  https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh <in.srain.cube.views.ptr.PtrF ...

  3. lua5.3+luasocket

    今天安装了luasocket,遇到了很多错误,百度并没有什么针对lua5.3的版本安装luasocket的文章,在这里记录一下. 1.下载lua5.3 下载到了lua-5.3.5.tar.gz版本的l ...

  4. leetcode题解之Find the Duplicate Number

    1.题目描述 2.分析 利用C++的 标准模板库 set 对数组进行读取,然后插入,如果检测到元素已经在set内部,则返回该元素值即可.时间复杂度为 O(n),空间复杂度为 O(n); 3.代码 in ...

  5. ASP.NET中使用UpdatePanel时用Response输出出现错误的解决方法

    asp.net中执行到Response.write("xx");之类语句或Microsoft JScript 运行时错误: Sys.WebForms.PageRequestMana ...

  6. 使用 Azure CLI 管理 Azure 磁盘

    Azure 虚拟机使用磁盘来存储 VM 操作系统.应用程序和数据. 创建 VM 时,请务必选择适用于所需工作负荷的磁盘大小和配置. 本教程介绍如何部署和管理 VM 磁盘. 学习内容: OS 磁盘和临时 ...

  7. docker的网络基础配置

    一.端口映射实现访问容器 当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P或-p参数来指定端口映射.当使用-P标记时,Docker会随机映射一个49000~49900的端口至容器内部开放 ...

  8. Python入门-模块2(random模块、os模块)

    >>> random.randomrange(1,10) #返回1-10之间的一个随机数,不包括10 >>> random.randint(1,10) #返回1-1 ...

  9. python_web应用雏型

    python_web应用雏型 Web应用程序顾名思义,就是一种可以通过Web访问的应用程序, Web应用的最大特点是用户只需要有网络和浏览器,不需要再安装其他软件就可顺利通过web访问到程序. WEB ...

  10. 统计过程控制与评价 Cpk、SPC、PPM

    Cpk(Process capability index)--工序能力指数 SPC(Statisical Process Control)--工艺过程统计受控状态分析 PPM(Parts Per Mi ...