def joint2mm_Motion(jointMotion):
    pointMotion = ym.Motion()
    pointSkeleton = joint2mm_Skeleton(jointMotion[0].skeleton)
    for jointPosture in jointMotion:
        pointMotion.append(joint2mm_Posture(jointPosture, pointSkeleton))
    pointMotion.fps = jointMotion.fps
    return pointMotion
示例#2
0
    def test_JTSolver_IKTree_COM():
        bvhFilePath = '../samples/block_3_rotate.bvh'
        motion = yf.readBvhFile(bvhFilePath)
        
        skeleton = motion[0].skeleton
        origPosture = ym.Motion([motion[0]])
        newPosture = copy.deepcopy(origPosture)
        
#        effectorNames = ['body3_Effector']
        targetPositions = [(.5,.5,0)]
#        tree = jointSkeleton2IKTree(skeleton)
#        solver = JTSolver_IKTree_COM(tree, effectorNames)
#        solver.solveCOM(newPosture[0], targetPositions)
#        COM = getCOMPos()
        
        viewer = ysv.SimpleViewer()
        viewer.record(False)
        viewer.doc.addRenderer('origPosture', yr.JointMotionRenderer(origPosture, (0,0,255), yr.LINK_WIREBOX))
        viewer.doc.addRenderer('newPosture', yr.JointMotionRenderer(newPosture, (0,255,0), yr.LINK_WIREBOX))
        viewer.doc.addRenderer('targetPosition', yr.PointsRenderer(targetPositions))
#        viewer.doc.addRenderer('COM', yr.PointsRenderer([COM]))
        
        viewer.startTimer(1/30.)
        viewer.show()
        
        Fl.run()
示例#3
0
    def test_readOgreSkeletonFile_Skeleton():
        #        meshFilePath = '../samples/woody2_15.mesh.xml'
        meshFilePath = '../samples/physics2_woody_binding1.mesh.xml'
        mesh = readOgreMeshFileAsMesh(meshFilePath, .01)

        #        skeletonFilePath = '../samples/woody2_15.skeleton.xml'
        skeletonFilePath = '../samples/physics2_woody_binding1.skeleton.xml'
        jointSkeleton, initialRs = readOgreSkeletonFile_Skeleton(
            skeletonFilePath, .01)

        skeletonPosture = ym.JointPosture(jointSkeleton)
        skeletonPosture.initLocalRs(initialRs)
        #        skeletonPosture.initLocalRs()
        skeletonMotion = ym.Motion([skeletonPosture])

        viewer = ysv.SimpleViewer()
        viewer.doc.addMotion(skeletonMotion)
        viewer.doc.addRenderer(
            'skeleton',
            yr.JointMotionRenderer(skeletonMotion, (0, 0, 255), yr.LINK_LINE))
        viewer.doc.addRenderer('mesh', yr.MeshRenderer(mesh))

        viewer.startTimer(1 / 30.)
        viewer.show()
        Fl.run()
示例#4
0
def mm2Joint_Motion(pointMotion, rootName):
    jointMotion = ym.Motion()
    jointSkeleton = mm2Joint_Skeleton(pointMotion[0], rootName)
    for pointPosture in pointMotion:
        jointMotion.append(mm2Joint_Posture(pointPosture, pointMotion[0], jointSkeleton))
    jointMotion.fps = pointMotion.fps
    return jointMotion
示例#5
0
    def test_JTSolver_IKTree():
        bvhFilePath = '../samples/block_3_rotate.bvh'
        motion = yf.readBvhFile(bvhFilePath)
        
        skeleton = motion[0].skeleton
        origPosture = ym.Motion([motion[0]])
        newPosture = copy.deepcopy(origPosture)
        
        effectorNames = ['body3_Effector']
#        effectorNames = ['body1']
        targetPositions = [(1.,0,0)]
        tree = jointSkeleton2IKTree(skeleton)
#        print tree
#        tree.changeRootNode('body3_Effector')
#        print tree
        solver = JTSolver_IKTree(tree, effectorNames)
        solver.solve(newPosture[0], targetPositions)
        
        viewer = ysv.SimpleViewer()
        viewer.record(False)
        viewer.doc.addRenderer('origPosture', yr.JointMotionRenderer(origPosture, (0,0,255), yr.LINK_WIREBOX))
        viewer.doc.addRenderer('newPosture', yr.JointMotionRenderer(newPosture, (0,255,0), yr.LINK_WIREBOX))
        viewer.doc.addRenderer('targetPosition', yr.PointsRenderer(targetPositions))
        
        viewer.startTimer(1/30.)
        viewer.show()
        
        Fl.run()
示例#6
0
    def test_JTSolver_Skeleton():
        bvhFilePath = '../samples/block_3_rotate.bvh'
        motion = yf.readBvhFile(bvhFilePath)
        
        skeleton = motion[0].skeleton
        origPosture = ym.Motion([motion[0]])
        newPosture = copy.deepcopy(origPosture)
        
        effectorNames = ['body3_Effector']
#        effectorNames = ['body1']
        targetPositions = [(1.,0,0)]
        
        print newPosture[0].skeleton
        newPosture[0].skeleton.changeRoot('body2')
        print newPosture[0].skeleton
        
        solver = JTSolver_Skeleton(skeleton, effectorNames)
        solver.solve(newPosture[0], targetPositions)
        
        viewer = ysv.SimpleViewer()
        viewer.record(False)
        viewer.doc.addRenderer('origPosture', yr.JointMotionRenderer(origPosture, (0,0,255), yr.LINK_SOLIDBOX))
        viewer.doc.addRenderer('newPosture', yr.JointMotionRenderer(newPosture, (0,255,0), yr.LINK_SOLIDBOX))
        
        viewer.startTimer(1/30.)
        viewer.show()
        
        Fl.run()
示例#7
0
    def test_distancFuncs():
        bvhFilePath = '../samples/wd2_WalkSameSame00.bvh'
        jointMotion = yf.readBvhFile(bvhFilePath, .01)

        rankNum = 5

        srcFrame = 100
        searchIntervals = [[0, 80], [120, 200]]
        print('srcFrame', srcFrame)
        print('searchIntervals', searchIntervals)

        def isIn(i, searchIntervals):
            for searchInterval in searchIntervals:
                if i >= searchInterval[0] and i <= searchInterval[1]:
                    return True
            return False

        distances = [None] * len(jointMotion)
        for i in range(len(jointMotion)):
            if isIn(i, searchIntervals):
                distances[i] = distanceByRelPos(jointMotion[srcFrame],
                                                jointMotion[i])
            else:
                distances[i] = sys.maxsize
        sorted = copy.copy(distances)
        sorted.sort()

        print('rank \t frame \t distance')
        rankedPostures = [None] * rankNum
        for i in range(1, rankNum):
            for j in range(len(jointMotion)):
                if sorted[i] == distances[j]:
                    rankedPostures[i] = jointMotion[j]
                    print('%d \t %d \t %f' % (i, j, distances[j]))

        viewer = ysv.SimpleViewer()
        viewer.record(False)

        viewer.doc.addRenderer(
            'jointMotion',
            yr.JointMotionRenderer(jointMotion, (0, 0, 255), yr.LINK_BONE))
        viewer.doc.addObject('jointMotion', jointMotion)
        viewer.doc.addRenderer(
            'srcFrame',
            yr.JointMotionRenderer(jointMotion[srcFrame:srcFrame + 1],
                                   (0, 255, 0), yr.LINK_BONE))
        for i in range(1, rankNum):
            viewer.doc.addRenderer(
                '%d' % i,
                yr.JointMotionRenderer(
                    ym.Motion([rankedPostures[i]]),
                    numpy.array([255, 255, 255]) * (1 - (i - 1) * .2),
                    yr.LINK_BONE))

        viewer.startTimer(1 / 30.)
        viewer.show()
        Fl.run()
示例#8
0
def _readOgreSkeletonAnimations(dom, jointSkeleton, initialRs, scale=1.0):
    jointMotions = []
    animationEles = dom.getElementsByTagName('animation')

    for animationEle in animationEles:
        jointMotion = ym.Motion()
        #        jointMotion.resourceName = animationEle.getAttribute('name').encode()
        trackEles = animationEle.getElementsByTagName('track')
        first_keyframes = trackEles[0].getElementsByTagName('keyframe')
        len_keyframes = len(first_keyframes)
        time2frameMap = {}
        for i in range(len_keyframes):
            jointPosture = ym.JointPosture(jointSkeleton)
            #            jointPosture.initLocalRMap(initialRMap)
            jointPosture.initLocalRs(initialRs)
            jointMotion.append(jointPosture)

            # because each bone may not have same number of keyframes
            time2frameMap[first_keyframes[i].getAttribute('time')] = i

        for trackEle in trackEles:
            #            print i, trackEle.getAttribute('bone'), len(trackEle.getElementsByTagName('keyframe'))
            keyframeEles = trackEle.getElementsByTagName('keyframe')

            for keyframeEle in keyframeEles:
                keyframeTime = keyframeEle.getAttribute('time')

                # because each bone may not have same number of keyframes
                frame = time2frameMap[keyframeTime]
                jointPosture = jointMotion[frame]

                boneName = trackEle.getAttribute('bone').encode()
                if boneName == jointSkeleton.root.name:
                    transEle = keyframeEle.getElementsByTagName('translate')[0]
                    jointPosture.rootPos[0] = float(
                        transEle.getAttribute('x')) * scale
                    jointPosture.rootPos[1] = float(
                        transEle.getAttribute('y')) * scale
                    jointPosture.rootPos[2] = float(
                        transEle.getAttribute('z')) * scale

                rotEle = keyframeEle.getElementsByTagName('rotate')[0]
                angle = float(rotEle.getAttribute('angle'))
                axisEle = rotEle.getElementsByTagName('axis')[0]
                axis = mmMath.v3(float(axisEle.getAttribute('x')),
                                 float(axisEle.getAttribute('y')),
                                 float(axisEle.getAttribute('z')))
                R = mmMath.exp(axis, angle)

                #                jointPosture.mulLocalR(boneName, R)
                jointPosture.mulLocalR(jointSkeleton.getElementIndex(boneName),
                                       R)
                jointPosture.updateGlobalT()

        jointMotions.append(jointMotion)
    return jointMotions
示例#9
0
def meshAnimation2PointMotion(skinMesh, jointMotion):
    sm = copy.deepcopy(skinMesh)
    
    pointSkeleton = ym.PointSkeleton()
    for i in range(sm.getVertexNum()):
        pointSkeleton.addElement(None, None)
    
    pointMotion = ym.Motion()
    for jointPosture in jointMotion:
        sm.update(jointPosture)
        pointMotion.append(mesh2PointPosture(sm, pointSkeleton))
    return pointMotion
示例#10
0
def readTrcFile(trcFilePath, scale=1.0):
    f = open(trcFilePath)
    fileLines = f.readlines()
    pointMotion = ym.Motion()
    i = 0
    while i != len(fileLines):
        splited = fileLines[i].split()
        boneNames = []
        if i == 2:
            dataRate = float(splited[0])
            numFrames = int(splited[2])
            numMarkers = int(splited[3])
#            print numFrames, numMarkers
        elif i == 3:
            markerNames = [name.split(':')[1] for name in splited[2:]]
            skeleton = ym.PointSkeleton()
            for name in markerNames:
                skeleton.addElement(None, name)
#            print markerNames
        elif i > 5:
            markerPositions = splited[2:]
            #            print markerPositions
            #            print 'i', i
            pointPosture = ym.PointPosture(skeleton)
            for m in range(numMarkers):
                point = numpy.array([
                    float(markerPositions[m * 3]),
                    float(markerPositions[m * 3 + 1]),
                    float(markerPositions[m * 3 + 2])
                ])
                point = numpy.dot(
                    mm.exp(numpy.array([1, 0, 0]), -math.pi / 2.),
                    point) * scale
                #                pointPosture.addPoint(markerNames[m], point)
                pointPosture.setPosition(m, point)


#                print 'm', m
#                print markerNames[m], (markerPositions[m*3],markerPositions[m*3+1],markerPositions[m*3+2])
            pointMotion.append(pointPosture)
        i += 1
    f.close()
    pointMotion.fps = dataRate
    return pointMotion
示例#11
0
        plot.addYdata('rFoot_lat', size_laterals_map[RFOOT], False)
        plot.addXlines('rPeakFrames', rPeakFrames, False)

    plot.showModeless()

    contactStatesMap = yma.getMotionContactStates(motion, hRef, vRef)

    viewer = ysv.SimpleViewer()
    viewer.record(False)
    viewer.doc.addRenderer(
        'ys_motion',
        yr.JointMotionRenderer(motion, (100, 100, 255), yr.LINK_BONE))
    viewer.doc.addObject('ys_motion', motion)
    viewer.doc.addRenderer(
        'tpose',
        yr.JointMotionRenderer(ym.Motion([motion[0].getTPose()]),
                               (255, 100, 100), yr.LINK_BONE), False)
    viewer.doc.addObject('tpose', motion)

    def viewer_onClose(data):
        plot.close()
        viewer.onClose(data)

    viewer.callback(viewer_onClose)

    def extraDraw():
        frame = viewer.getCurrentFrame()

        for footName in footNames:
            #            if footName == RFOOT:
            if footName == LFOOT:
    def test_plot_LineCollection_speed():
        import GUI.ysViewer as yv
        import Motion.ysMotion as ym
        import numpy as np
        from matplotlib import collections
        import time

        pt = time.time()

        count = 5

        # plot
        xs = []
        ys = []
        #        lines = []
        for i in range(count):
            xs.append([])
            ys.append([])
#            line, = plot(range(100), range(100))
#            lines.append(line)

        def beforeFrameCallback(frame):
            #            print frame
            for i in range(count):
                xs[i].append(frame)
                ys[i].append(frame + i)

                #                plot(xs[i], ys[i], 'b')
                plot([frame, frame + 1], [frame + i, frame + i + 1], 'b')
#                lines[i].set_xydata(frame,frame+i)

#            xys = []
#            for i in range(count):
#                xys.append(xs[i])
#                xys.append(ys[i])
#            plot(xys)

            xlim(0, 100)
            ylim(0, 100)
            draw()
            if frame == 90:
                print time.time() - pt

##        # LineCollection
#        fig = figure()
#        a = fig.add_subplot(111)
#        xys = []
#        for i in range(count):
#            xys.append([])
#        def beforeFrameCallback(frame):
##            print frame
#            for i in range(count):
#                xys[i].append((frame, frame+i))
#
##                col = collections.LineCollection([xys[i]])
#                col = collections.LineCollection([[(frame, frame+i), (frame+1, frame+i+1)]])
#                a.add_collection(col)
#
##            col = collections.LineCollection(xys)
##            a.add_collection(col)
#
#            xlim(0,100)
#            ylim(0,100)
#            draw()
#            if frame == 90:
#                print time.time() - pt

        tempMotion = ym.Motion([None] * 100)
        motionSystem = ym.MotionSystem()
        motionSystem.addMotion(tempMotion)

        viewer = yv.Viewer(100, 100, 800, 650, None, motionSystem, [])

        viewer.beforeFrameCallback = beforeFrameCallback

        viewer.startTimer(1 / 30.)
        viewer.show()

        Fl.run()
示例#13
0
def readMMFile(mmFilePath):
    names = {}
    names[0] = 'root'
    names[2] = 'lKnee'
    names[4] = 'neck'
    names[6] = 'rKnee'
    names[8] = 'rFoot'
    names[10] = 'rToe'
    names[12] = 'head'
    names[14] = 'rArm'
    names[16] = 'lArm'
    names[18] = 'lHand'
    names[20] = 'rHand'
    #    names[14] = 'lArm'
    #    names[16] = 'rArm'
    #    names[18] = 'rHand'
    #    names[20] = 'lHand'
    names[22] = 'lFoot'
    names[24] = 'lToe'

    skeleton = ym.MMSkeleton()
    skeleton.addLink("head", "neck")
    skeleton.addLink("neck", "lArm")
    skeleton.addLink("lArm", "lHand")
    skeleton.addLink("neck", "rArm")
    skeleton.addLink("rArm", "rHand")
    skeleton.addLink("neck", "root")
    skeleton.addLink("root", "lKnee")
    skeleton.addLink("lKnee", "lFoot")
    skeleton.addLink("lFoot", "lToe")
    skeleton.addLink("root", "rKnee")
    skeleton.addLink("rKnee", "rFoot")
    skeleton.addLink("rFoot", "rToe")

    #    # lowest foot height finding code
    #    lowest = 100
    #    for mmFilePath in paths:
    #        pointMotion = yf.readMMFile(mmFilePath)
    #        i = 0
    #        for name, point in pointMotion[i].pointMap.items():
    #            if name == 'rFoot' or name == 'lFoot' or name == 'rToe' or name == 'lToe':
    #                if point[1] < lowest:
    #                    print mmFilePath, i
    #                    print name
    #                    print point[1]
    #                    lowest = point[1]
    lowest = .15

    f = open(mmFilePath)
    fileLines = f.readlines()
    pointMotion = ym.Motion()
    i = 0
    while i != len(fileLines):
        if fileLines[i].isspace() == False:
            splited = fileLines[i].split()
            pointPosture = ym.MMPosture(skeleton)
            for j in range(0, len(splited), 2):
                point = numpy.array(
                    [float(splited[j]),
                     float(splited[j + 1]), 0.])
                point[1] -= lowest
                pointPosture.addPoint(names[j], point)
            pointMotion.append(pointPosture)
        i += 1

    f.close()
    pointMotion.fps = 30.
    return pointMotion