Project Evolution for Poser



  • @qazart PE has a built-in preset on that joint to 2.5 degrees. You need the -2.5 degrees to return it to the object geometry default position. If you're exporting objects to morph externally, you should probably set subdivision off, as well.



  • 0_1525717263793_evo mouth closed open.jpg

    So I have set the jaw to -10 to emphasize the point. The morph is being ignored.
    Is this due to the fact that I am moving the jaw not the face ?



  • I totally get the reasoning behind having the mouth of a figure open for modeling and rigging purposes, I also see the headaches of trying to create custom morphs in that situation.
    Here's a thought... Could one not close the mouth of the figure after rigging and use Cages 'Bake_actor_ deformations' script to zero the head/jaw object in the new state?
    Of course this would void any pre-existing morphs , but may be an option in the creation process before starting the laborious task of generating morphs. May also be utilized for modeling in the 'A' pose( again I see the advantages) then transforming figure to the traditional 'T' pose if desired?...



  • 2 little scripts to handle morphs. Export the object with any morphs dialed in and deformers attached (magnets, vertex-maps). The export-script is similar to what Poser does, but works faster for me (just one click). It exports the currently selected actor with the predefined parameters (Scale, Rotation, like your modeler needs the file).

    Don't move or change the figure in Poser after export!

    The second script reads a morph into the currently selected actor while subtracting the current state. So, the morph is just the difference between what you have saved and what Poser actually shows. If you rotate or bend this actor before the morph is loaded, the morph will reflect just that (and makes your morph garbage).

    I'm using this with standard parameters, so I didn't make a user-interface.

    SCRIPT EXPORT:

    from __future__ import print_function
    
    import os
    import time
    
    import poser
    
    # some constants
    
    SCENE = poser.Scene()
    ACTOR = SCENE.CurrentActor()
    FIGURE = ACTOR.ItsFigure()
    PATH = os.path.dirname(__file__)
    
    assert ACTOR is not None, "No Actor"
    
    OUT_FILE = os.path.join(PATH, ACTOR.Name() + ".obj")
    GEOM = ACTOR.Geometry()
    SCALEFACTOR = 1000
    TURN_X = False
    TURN_Y = False
    TURN_Z = True  # cinema-4d needs this
    
    SWITCH_YZ = False
    
    # predeclared functions to get X, Y, Z from poser vertices
    sX = -1 if TURN_X else 1
    sY = -1 if TURN_Y else 1
    sZ = -1 if TURN_Z else 1
    getX = lambda v: v.X() * SCALEFACTOR * sX
    getY = lambda v: v.Y() * SCALEFACTOR * sY
    getZ = lambda v: v.Z() * SCALEFACTOR * sZ
    
    if SWITCH_YZ:
        getY = lambda v: v.Z() * SCALEFACTOR * sZ
        getZ = lambda v: v.Y() * SCALEFACTOR * sY
    
    assert GEOM is not None, "Actor %s has no geometry" % ACTOR.Name()
    
    with open(OUT_FILE, "w") as fh:
        print("### Date    : %s" % time.asctime(), file=fh)
        print("### Figure  : %s" % FIGURE.Name(), file=fh)
        print("### Actor   : %s" % ACTOR.Name(), file=fh)
        print("### Vertices: %s" % GEOM.NumVertices(), file=fh)
    
        for vertex in GEOM.WorldVertices():
            print("v %s %s %s" % (getX(vertex),
                                  getY(vertex),
                                  getZ(vertex)), file=fh)
    
        sets = GEOM.Sets()
    
        # I'm using just one group for all polygons here
        print("g %s" % ACTOR.Name(), file=fh)
        for poly in GEOM.Polygons():
            si = poly.Start()
            ar = [str(sets[idx + si] + 1) for idx in range(poly.NumVertices())]
            print("f", " ".join(ar), file=fh)
    
    print("Morph exported to:", OUT_FILE)
    
    

    SCRIPT IMPORT:

    from __future__ import print_function
    
    import os
    
    import poser
    
    # some constants
    
    SCENE = poser.Scene()
    ACTOR = SCENE.CurrentActor()
    GEOM = ACTOR.Geometry()
    PATH = os.path.dirname(__file__)
    FILENAME = os.path.join(PATH, ACTOR.Name() + ".obj")
    MORPHNAME = "ImportedMorph"
    
    SCALEFACTOR = 1000
    TURN_X = False
    TURN_Y = False
    TURN_Z = True  # cinema-4d needs this
    SWITCH_YZ = False
    
    assert os.path.exists(FILENAME), "File not found"
    
    morph_vertices = list()
    
    with open(FILENAME, "r") as fh:
        sX = -1 if TURN_X else 1
        sY = -1 if TURN_Y else 1
        sZ = -1 if TURN_Z else 1
    
        for line in fh:
            pre, _, parms = line.partition(" ")
            # only vertexdata is needed
            if pre == "v":
                x, y, z = [float(n) / SCALEFACTOR for n in parms.split()]
                if SWITCH_YZ:
                    morph_vertices.append((x * sX, z * sZ, y * sY))
                else:
                    morph_vertices.append((x * sX, y * sY, z * sZ))
    
    assert len(morph_vertices) == GEOM.NumVertices(), "Number of vertices? %s/%s" \
                                                      % (len(morph_vertices), GEOM.NumVertices())
    
    # create new morh or overwrite existing one
    
    morphparm = ACTOR.Parameter(MORPHNAME)
    if morphparm is None:
        ACTOR.SpawnTarget(MORPHNAME)
        morphparm = ACTOR.Parameter(MORPHNAME)
    
    assert morphparm is not None, "Could not create Morphtarget"
    assert morphparm.IsMorphTarget(), "Parametername ('%s') already exist but is not a morph" \
                                      % MORPHNAME
    
    # update morph with data from file
    for index, (x, y, z) in enumerate(morph_vertices):
        wv = GEOM.WorldVertex(index)
        morphparm.SetMorphTargetDelta(index, x - wv.X(), y - wv.Y(), z - wv.Z())
    
    print("Morph imported as '%s'." % MORPHNAME)
    
    


  • I apologize if this has already been answered and I just can't find it, but... I have now the cycle plug in for the EZSkin Shader installed and like it a lot. But could someone please tell me were Evolution's Lip Mask has to go? The shader is so confusing I can't figure it out on my own.



  • Did anyone pick up the torch on this project?
    Ero posted at rendo that he was turning her over to others, but i haven't seen anything since.



  • @KittyBrown
    Rest assured the torch is being carried and burning.
    Sorry it is not for me to say more at this moment.



  • @F_Verbaas your silence is telling...



  • I grab a new plugin that allow me to grab all the points i need for the morphing and then let me scrub back to the close mouth position to do the morph and make a morph target out of it with a Metamorphic plugin for Lightwave3d

    @JAFO said in Project Evolution for Poser:

    I totally get the reasoning behind having the mouth of a figure open for modeling and rigging purposes, I also see the headaches of trying to create custom morphs in that situation.



  • @F_Verbaas It would be great if your team would consider adding phonemes/visemes to PE's head/face controls so she could work with the talk designer. There are only 12 or so unique phonemes/visemes that are needed.