makehuman开源项目,项目源码在github上,相应的介绍在其主页makehumancommunity.com中
base.obj
.obj结构 v点信息 x,y,z
f 面信息
Target结构 编号 点x,点y,点z
通过对基础base.obj的点的修改来进行调整模型(base.obj建立面,点信息)
data文件夹下包含了各种信息 年龄 大小,手臂长短相应的点的信息
在algos3d.py ->apply中
obj.coord[dstVerts] += self.data[srcVerts] * scale[None,:]
将base.obj中的点与.target中的点相加,进行对模型的变形,修改,
scale指示了修改的程序0-1之间 【0.5,0.5,0.5】只是取一半
对base.obj的读取
在mhmain.py的LoadHuman中加载base.obj 并将信息存储到human结构中,后期所有的改变都将通过human这个结构进行
对.target文件的读取
algos3d.py->_load的
_load_binary
_load_text
实现
有npz数据时读取npz
没有时用_load_text读取.target文件
_load_text
verts中保存着要修改的点序列名
data中为修改的具体值
对模型的导出
对模型的pose的修改
target数据:更改基础模型的年龄,性别
base.obj:基础模型,面
alogs3d.py 加载使用npz或target模型和更新模型参数 年龄 大小 使用target的数据更改模型
algos3d.py _load
加截模型时,先尝试加载npz格式的模型(python结构的数据)或没有再加载.target格式的模型数据
mhmain.py
loadhuman
导入base.obj模型
导入骨骼 ; /data/rigs/default.mhske
使用的技术opencl
界面为 为 qt5
modifierslider.py 滑动调整年龄,高度等 为
events3d.py 事件函数
pose
动画
主函数makehuman.py
主要结构:
1.通过对base.obj文件中的点的修改实现人物的成长,衰老,变化
2.数据在data 文件夹下的.target等文件中 (D:\makehuman-master\makehuman-master\makehuman\data\targets\macrodetails)
在algos3d.py中的,apply函数实现使用target的数据进行修改模型
alogos3d.py _load_text(self, name):函数实现加载相应的target文件,加载点信息
主流程介绍:
vscode 加载项目makehuman
主函数为makehuman.py
通过wavefront.py加载base.obj文件
填充human结构
mhmain.py loadHuman 加截模型信息到human中
通过wavefront.py writeobject 将human信息导出保存为obj
相应的模型与函数
modefierslider.py 滑动调整年龄,身高等参数时调用
为输出调试信息
注释:makehuman.py
def redirect_standard_streams()下的内容用pass代替
将模型导出为obj文件 wavefront.py
点信息f
面信息f
makehuman 模型导入houdini进行成长
obj文件结构 v点信息 vt UV信息 f将点连成面信息
makehuman 主函数 makehuman.py
滑动调整函数 modflierslider.py
导出obj结构函数
guiexport.py->9_export_obj.py->mh2obj.py->wavefront.py(writeobjfile实现点 f 写入文件)
onFileSelected->export->mh2obj.exportObj->wavefront.writeObjFile
human.py为整个核心
OBJ结构
v为点信息
f为面信息
vt为uv信息
vn为法线信息
在houdini中引入makehuman
FILE1导入base.obj
import numpy as np
node = hou.pwd()
geo = node.geometry()
# Add code to modify contents of geo.
# Use drop down menu to select examples.
TargetF = r'D:\makehuman-master\makehuman-master\makehuman\data\targets\macrodetails\african-female-old.target'
verts = geo.points()
#按.target修改base.obj
#读取.target文件
def _load_text( name):
data = []
with open(name, 'r') as fd:
for line in fd:
line = line.strip()
if line.startswith('#'):
continue
translationData = line.split()
if len(translationData) != 4:
continue
vertIndex = int(translationData[0])
translationVector = (float(translationData[1]), float(translationData[2]), float(translationData[3]))
data.append((vertIndex, translationVector))
raw = np.asarray(data,dtype = [('index','u4'),('vector','(3,)f4')])
nverts = raw['index']
ndata = raw['vector']
#t1 = np.s_[...]
#b = verts[t1]
# [verts[idx].setPosition(verts[dt].position()+ndata[idx]) for idx , dt in enumerate(nverts)]
u = 0;
for i in nverts:
verts[i].setPosition(verts[i].position() + ndata[u])
u = u+1
_load_text(TargetF)