def __updateHumanMesh(self, joint, src=None, dst=None): # copy angles bvhName = mhToBvhMapping.get(joint.name, '') if bvhName: bvhJoint = self.__skeleton.getJoint(bvhName) joint.rotation = bvhJoint.rotation[:] else: joint.rotation = [0.0, 0.0, 0.0] joint.calcTransform(False) if not src: src = gui3d.app.selectedHuman.meshStored if not dst: dst = gui3d.app.selectedHuman.meshData.verts nsrc = gui3d.app.selectedHuman.meshStoredNormals for i in joint.bindedVects: #dst[i].co = aljabr.mtransform(joint.transform, aljabr.mtransform(joint.inverseTransform, src[i])) dst[i].co = aljabr.mtransform(joint.transform, aljabr.vsub(src[i], joint.position)) dst[i].no = aljabr.mtransform(joint.normalTransform, nsrc[i]) for child in joint.children: self.__updateHumanMesh(child, src, dst)
def projectBackground(self): if not hasattr(self, "leftTop"): gui3d.app.prompt("Warning", "You need to load a background before you can project it.", "OK") return mesh = gui3d.app.selectedHuman.getSeedMesh() # for all quads, project vertex to screen # if one vertex falls in bg rect, project screen quad into uv quad # warp image region into texture leftTop = gui3d.app.modelCamera.convertToScreen(*self.leftTop) rightBottom = gui3d.app.modelCamera.convertToScreen(*self.rightBottom) r = [leftTop[0], leftTop[1], rightBottom[0], rightBottom[1]] srcImg = mh.Image(self.backgroundImage.getTexture()) dstImg = mh.Image(gui3d.app.selectedHuman.getTexture()) srcW = srcImg.width srcH = srcImg.height dstW = dstImg.width dstH = dstImg.height eye = gui3d.app.modelCamera.eye focus = gui3d.app.modelCamera.focus transform = mesh.object3d.transform eye = mtransform(transform, eye) focus = mtransform(transform, focus) camera = vnorm(vsub(eye, focus)) for g in mesh.faceGroups: if g.name.startswith("joint") or g.name.startswith("helper"): continue for f in g.faces: # From hdusel in regard of issue 183: As agreed with marc I'll change the # call from packed to discrete because packed structs # are not available on Python 2.6.1 which is mandatory for MakeHuman to run # on OS X 10.5.x # # src = [gui3d.app.modelCamera.convertToScreen(*v.co, obj=mesh.object3d) for v in f.verts] # src = [gui3d.app.modelCamera.convertToScreen(v.co[0], v.co[1], v.co[2], obj=mesh.object3d) for v in f.verts] if any([pointInRect(p, r) for p in src]): for i, v in enumerate(f.verts): src[i][2] = max(0.0, vdot(v.no, camera)) if any([v[2] >= 0.0 for v in src]): for i, v in enumerate(f.verts): src[i][2] = max(0.0, vdot(v.no, camera)) co = [(mesh.uvValues[i][0]*dstW, dstH-(mesh.uvValues[i][1]*dstH)) for i in f.uv] uva = [((v[0]-leftTop[0])/(rightBottom[0] - leftTop[0]), (v[1]-leftTop[1])/(rightBottom[1] - leftTop[1]), v[2]) for v in src] RasterizeTriangle(dstImg, co[0], co[1], co[2], UvAlphaShader(dstImg, srcImg, (uva[:3]))) RasterizeTriangle(dstImg, co[2], co[3], co[0], UvAlphaShader(dstImg, srcImg, ((uva[2], uva[3], uva[0])))) dstImg.save(os.path.join(mh.getPath(''), 'data', 'skins', 'projection.tga')) gui3d.app.selectedHuman.setTexture(os.path.join(mh.getPath(''), 'data', 'skins', 'projection.tga'))