コード例 #1
0
 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)
コード例 #2
0
    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'))