Motion Sculpture Part 2

by qiu0717 in Workshop > 3D Printing

122 Views, 1 Favorites, 0 Comments

Motion Sculpture Part 2

IMG_4038.jpeg

Motion capture data has been recorded to animate virtual characters in gaming and film industries. In this project, I am making a sculpture out of the motion recording data

This document explains my grasshopper program in details.

Data Parsing

Screen Shot 2021-06-07 at 1.36.48 PM.png
Screen Shot 2021-06-07 at 1.30.47 PM.png

The motion data imported into Grasshopper is a CSV file with 240 rows and 66 columns. Each row contains the XYZ coordinates of the 22 body joint positions, arranged in the order of "xyzxyzxyz..."

The CSV file is basically plain text with data entrees split by some token. In my file, the token is a comma. By using "text split" module in grasshopper and setting the token to comma ",", I can split each line into 66 numbers. With each line parsed as a branch, the result data tree contains 240 branches, each of which contains 66 numbers.

"num2pt" module automatically pairs three values in a row as one point positions. Feeding the data tree into "num2pt" produces 240 branches of 22 positions.

Downloads

Creating Skeleton by Connecting Body Joints

Screen Shot 2021-06-07 at 1.49.04 PM.png
Screen Shot 2021-06-07 at 1.48.09 PM.png
Screen Shot 2021-06-07 at 2.02.12 PM.png
Screen Shot 2021-06-07 at 2.02.20 PM.png
Screen Shot 2021-06-07 at 2.09.48 PM.png
Screen Shot 2021-06-07 at 2.10.55 PM.png

1. Construct the line segments

A skeleton consists of the line segments linking different body joints. A segment can be defined by the two indices of the beginning and the ending body joint. For example, 12 -> 13 specifies the body joint 12 should be connected to body joint 13. A complete connection map can be found at the bottom.

Two lists of points, the starting and the ending list, can be created by feeding two index lists into the "list item" module to select from the point lists. The first list contains all the indices of beginning joints, and the second contains the indices of the ending joints. The bottom left window shows the content in the first list connected to the upper "list item" module.

2. Create Pipes

With the lines representing the skeleton created, making pipes along with it creates the volumetric structure.

3. Filtering skeletons

Now the program shows the skeleton in every motion frame, making the model too dense. Adding a "tree split" module enables selection on which frames to show. The selection of {0,30,60,...,240} shows the skeleton every other 30 frames, which significantly reduce the density of the model.

Complete connection list:

12 -> 13

12 -> 14

12 -> 18

12 -> 11

11 -> 10

10 -> 1

1 -> 6

1 -> 2

14 -> 15

15 -> 16

16 -> 17

18 -> 19

19 -> 20

20 -> 21

6 -> 7

7 -> 8

8 -> 9

2 -> 3

3 -> 4

4 -> 5

Body Joint Trajectories

Screen Shot 2021-06-07 at 2.26.45 PM.png
Screen Shot 2021-06-07 at 2.27.03 PM.png
Screen Shot 2021-06-07 at 2.35.52 PM.png
Screen Shot 2021-06-07 at 2.35.13 PM.png

1. Flip the data tree

The data to create a body joint trajectory should be the body joint's position at different moment. Therefore the data for one body joint trajectory should be a list of 240 points, each representing the body joint's position at each of the 240 frame. For 22 body joints, there should be 22 lists of 240 points. By flipping the data tree of 240 branches of 22 points with the "flip matrix" tool, we get a 22 branches of 240 joints, which is exactly what we need for the body joint trajectories.

2. Points to Curve

Each list of 240 points can be connected to get a polyline. The 22 branches creates 22 polylines, representing the 22 body joint trajectories.

3. Smoothen Curves and Create Pipes

The polylines can be too serrated. I divided the polylines into fewer points and fit the points with curves to smoothen the trajectories.

Connection Between Trajectories

Screen Shot 2021-06-07 at 2.45.07 PM.png
Screen Shot 2021-06-07 at 2.45.16 PM.png
Screen Shot 2021-06-07 at 2.45.25 PM.png
Screen Shot 2021-06-07 at 2.45.29 PM.png

1. Select two body joint trajectories using two "list item" tool to select two body joint trajectories. The polyline results should be "flattened" before feeding into the "list item" module.

2. Connect the sample points on the trajectories with "line" tool.

Use the Tool to Design (1)

Screen Shot 2021-06-07 at 3.17.23 PM.png
Screen Shot 2021-06-07 at 3.14.12 PM.png
Screen Shot 2021-06-07 at 3.17.37 PM.png
Screen Shot 2021-06-07 at 3.17.30 PM.png
Screen Shot 2021-06-07 at 3.18.07 PM.png
Screen Shot 2021-06-07 at 3.22.32 PM.png

Replace the current motion data with data of more complex motion.

Design 1: Motion surface

The dancing motion has interesting arm movements. A interesting design can be made by selecting only the body joint trajectories of the left arm (joint 14,15,16,17) and create surfaces between them.

Downloads

Use the Tool to Design (2)

Screen Shot 2021-06-07 at 3.28.44 PM.png
Screen Shot 2021-06-07 at 3.29.08 PM.png
Screen Shot 2021-06-07 at 3.32.30 PM.png
Screen Shot 2021-06-07 at 3.32.59 PM.png

Design 2: Motion sculpture

Inspired by the support structure required to print, I decided to use the skeleton as the support for the motion trajectories. This design incorporates both human skeletons and motion curves.

Particularly in this example, I chose human skeletons every 30 frames and two motion curves shaped by the left hand joint(17) and the right knee joint(7).

Print

Screen Shot 2021-05-29 at 12.58.46 PM.png
Screen Shot 2021-06-05 at 9.07.25 PM.png
IMG_4040.jpeg
IMG_4013.jpeg
IMG_3865.jpg
IMG_3501.jpg

For all prints I uses "tree support" which works pretty well and very easy to remove.

I also tried placing support blocker to reduce the support required to print.