Forum: Poser 11 / Poser Pro 11 OFFICIAL Technical


Subject: How to create a single morph

starlingblue opened this issue on Sep 15, 2020 ยท 7 posts


adp001 posted Wed, 16 September 2020 at 11:52 AM

I had a bit time and wrote the following little script. It asks for a morphname as the original "Spawn Target" does and creates a morph from what the screen shows.

Don't forget to set all rotations/translations/scales to zero to avoid some funny effects.

from __future__ import print_function, division, absolute_import

import numpy as np
import wx

try:
    import poser
except ImportError:
    from PoserLibs import POSER_FAKE as poser

SCENE = poser.Scene()


def createmorph(actor, morphname):
    assert isinstance(actor, poser.ActorType)
    assert isinstance(morphname, basestring)

    geom = None
    if hasattr(actor, "Geometry"):
        geom = actor.Geometry()
        numv = geom.NumVertices()
        if numv == 0:
            raise TypeError("Actor has no Geometry.")

    deltas = np.array([[v.X(), v.Y(), v.Z()] for v in geom.WorldVertices()]) - 
             np.array([[v.X(), v.Y(), v.Z()] for v in geom.Vertices()])

    morphparm = actor.Parameter(morphname)
    if morphparm is None:
        actor.SpawnTarget(morphname)
        morphparm = actor.Parameter(morphname)
    morphparm.SetValue(0)
    for idx, v in enumerate(deltas):
        morphparm.SetMorphTargetDelta(idx, *v)

    SCENE.DrawAll()


with wx.TextEntryDialog(None, "Enter Morphname", caption="Spawn Morphtarget") as dlg:
    if dlg.ShowModal() == wx.ID_OK:
        m_name = dlg.GetValue()
        if m_name:
            createmorph(SCENE.CurrentActor(), m_name)