Switch to side-by-side view

--- a
+++ b/app/scratch/bvh_animation.py
@@ -0,0 +1,167 @@
+"""
+============
+3D animation
+============
+
+A simple example of an animated plot... In 3D!
+"""
+import numpy as np
+import matplotlib.pyplot as plt
+import mpl_toolkits.mplot3d.axes3d as p3
+from matplotlib import animation
+from resources.pymo.pymo.parsers import BVHParser
+
+
+def calc_offset_pos(name):
+    name_parent = bvh_data.skeleton[name]['parent']
+
+    # root
+    if name_parent:
+        bvh_data.skeleton[name]['offset_position'] = np.add(bvh_data.skeleton[name]['offsets'],
+                                                     bvh_data.skeleton[name_parent]['offset_position'])
+    else:
+        bvh_data.skeleton[name]['offset_position'] = bvh_data.skeleton[name]['offsets']
+
+    for child in bvh_data.skeleton[name]['children']:
+        calc_offset_pos(child)
+
+
+def calc_frame_pos(name):
+    name_parent = bvh_data.skeleton[name]['parent']
+    if 'Nub' not in name:
+        # root
+        if name_parent and 'Nub' not in name:
+            for index in bvh_frames:
+                pos_x = np.add(bvh_data.skeleton[name]['frame_offset_x'][index],
+                               bvh_data.skeleton[name_parent]['frame_position_x'][index])
+                pos_y = np.add(bvh_data.skeleton[name]['frame_offset_y'][index],
+                               bvh_data.skeleton[name_parent]['frame_position_y'][index])
+                pos_z = np.add(bvh_data.skeleton[name]['frame_offset_z'][index],
+                               bvh_data.skeleton[name_parent]['frame_position_z'][index])
+                bvh_data.skeleton[name]['frame_position_x'].append(pos_x)
+                bvh_data.skeleton[name]['frame_position_y'].append(pos_y)
+                bvh_data.skeleton[name]['frame_position_z'].append(pos_z)
+        else:
+            for index in bvh_frames:
+                pos_x = bvh_data.skeleton[name]['frame_offset_x'][index]
+                pos_y = bvh_data.skeleton[name]['frame_offset_y'][index]
+                pos_z = bvh_data.skeleton[name]['frame_offset_z'][index]
+
+                bvh_data.skeleton[name]['frame_position_x'].append(pos_x)
+                bvh_data.skeleton[name]['frame_position_y'].append(pos_y)
+                bvh_data.skeleton[name]['frame_position_z'].append(pos_z)
+
+        for child in bvh_data.skeleton[name]['children']:
+            calc_frame_pos(child)
+
+
+def rot_matrix(name, frame):
+    # name = "RightHandThumb2"
+    # frame = 5
+    channel = np.array([name + "_Yrotation",
+                        name + "_Yrotation",
+                        name + "_Zrotation"])
+
+    offset = bvh_data.skeleton[name]['offsets']
+    angle_x = np.deg2rad(bvh_data.values[channel[0]][frame])
+    angle_y = np.deg2rad(bvh_data.values[channel[1]][frame])
+    angle_z = np.deg2rad(bvh_data.values[channel[2]][frame])
+
+    rotation_x = np.array([[1,               0,                0],
+                          [0, np.cos(angle_x), -np.sin(angle_x)],
+                          [0, np.sin(angle_x),  np.cos(angle_x)]])
+
+    rotation_y = np.array([[np.cos(angle_y),  0, np.sin(angle_y)],
+                          [0,                1,               0],
+                          [-np.sin(angle_y), 0, np.cos(angle_y)]])
+
+    rotation_z = np.array([[np.cos(angle_z), -np.sin(angle_z), 0],
+                           [np.sin(angle_z),  np.cos(angle_z), 0],
+                           [0,                              0, 1]])
+
+    # print(rotation_x)
+    # print(np.matmul(np.matmul(rotation_z, np.matmul(rotation_y, rotation_x)), offset))
+    pos = np.matmul(np.matmul(rotation_z, np.matmul(rotation_y, rotation_x)), offset)
+    bvh_data.skeleton[name]['frame_offset_x'].append(pos[0])
+    bvh_data.skeleton[name]['frame_offset_y'].append(pos[1])
+    bvh_data.skeleton[name]['frame_offset_z'].append(pos[2])
+
+    # print(channel)
+    # print(offset)
+    # print(angle_x, angle_y, angle_z)
+
+
+# BVH-File
+bvh = BVHParser()
+bvh_data = bvh.parse('../../output/BVH/RightHand.bvh')
+bvh_number_frames = np.size(bvh.data.values.RightHandIndex2_Xrotation.values)
+bvh_frames = np.arange(0, bvh_number_frames)
+
+# print(bvh_data.skeleton["Leap_Root"]['offsets'][0])
+
+# Get Root
+root = bvh_data.root_name
+# print(np.add(bvh_data.skeleton[root]['offsets'], bvh_data.skeleton["RightElbow"]['offsets']))
+# bvh_data.skeleton[root]['position'] = bvh_data.skeleton[root]['offsets']
+calc_offset_pos(root)
+# print(root)
+# print(bvh_data.values["Leap_Root_Xrotation"][0])
+
+for finger in bvh_data.skeleton:
+    if 'Nub' not in finger:
+        bvh_data.skeleton[finger]['frame_offset_x'] = []
+        bvh_data.skeleton[finger]['frame_offset_y'] = []
+        bvh_data.skeleton[finger]['frame_offset_z'] = []
+        for i in bvh_frames:
+            rot_matrix(finger, i)
+
+        bvh_data.skeleton[finger]['frame_position_x'] = []
+        bvh_data.skeleton[finger]['frame_position_y'] = []
+        bvh_data.skeleton[finger]['frame_position_z'] = []
+
+
+print(bvh_data.skeleton['RightHandThumb2']['frame_offset_x'][369])
+print(bvh_data.skeleton['RightHandThumb2']['frame_offset_x'][0])
+print(bvh_data.skeleton['RightHand']['frame_offset_x'][0])
+print(np.add(bvh_data.skeleton['RightHandThumb2']['frame_offset_x'][0],
+                               bvh_data.skeleton['RightHand']['frame_offset_x'][0]))
+calc_frame_pos(root)
+
+# Attaching 3D axis to the figure
+fig = plt.figure()
+ax = p3.Axes3D(fig)
+# Fifty lines of random 3-D lines
+# data = [Gen_RandLine(25, 3) for index in range(1)]
+
+# Creating fifty line objects.
+# NOTE: Can't pass empty arrays into 3d version of plot()
+# lines = [ax.plot(dat[0, 0:1], dat[1, 0:1], dat[2, 0:1])[0] for dat in data]
+for finger in bvh_data.skeleton:
+    finger_parent = bvh_data.skeleton[finger]['parent']
+    if finger_parent and 'Nub' not in finger:
+        # print(finger, finger_parent)
+        # ax.plot([bvh_data.skeleton[finger]['offset_position'][0],
+        #          bvh_data.skeleton[finger_parent]['offset_position'][0]],
+        #         [bvh_data.skeleton[finger]['offset_position'][1],
+        #          bvh_data.skeleton[finger_parent]['offset_position'][1]],
+        #         [bvh_data.skeleton[finger]['offset_position'][2],
+        #          bvh_data.skeleton[finger_parent]['offset_position'][2]])
+        ax.plot([bvh_data.skeleton[finger]['frame_position_x'][0],
+                 bvh_data.skeleton[finger_parent]['frame_position_x'][0]],
+                [bvh_data.skeleton[finger]['frame_position_y'][0],
+                 bvh_data.skeleton[finger_parent]['frame_position_y'][0]],
+                [bvh_data.skeleton[finger]['frame_position_z'][0],
+                 bvh_data.skeleton[finger_parent]['frame_position_z'][0]])
+# Setting the axes properties
+ax.set_xlim3d([-200.0, 200.0])
+ax.set_xlabel('X')
+
+ax.set_ylim3d([-200.0, 200.0])
+ax.set_ylabel('Y')
+
+ax.set_zlim3d([-200.0, 200.0])
+ax.set_zlabel('Z')
+
+ax.set_title('3D Test')
+
+plt.show()
\ No newline at end of file