<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.2 20190208//EN" "http://jats.nlm.nih.gov/publishing/1.2/JATS-journalpublishing1.dtd"><article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" article-type="other" dtd-version="1.2" xml:lang="en">
    <front>
        <journal-meta>
            <journal-id journal-id-type="pmc">F1000Research</journal-id>
            <journal-title-group>
                <journal-title>F1000Research</journal-title>
            </journal-title-group>
            <issn pub-type="epub">2046-1402</issn>
            <publisher>
                <publisher-name>F1000 Research Limited</publisher-name>
                <publisher-loc>London, UK</publisher-loc>
            </publisher>
        </journal-meta>
        <article-meta>
            <article-id pub-id-type="doi">10.12688/f1000research.138349.1</article-id>
            <article-categories>
                <subj-group subj-group-type="heading">
                    <subject>Software Tool Article</subject>
                </subj-group>
                <subj-group>
                    <subject>Articles</subject>
                </subj-group>
            </article-categories>
            <title-group>
                <article-title>MotionRender: A simple Python implementation of video motion visualization for 3D motion capture data</article-title>
                <fn-group content-type="pub-status">
                    <fn>
                        <p>[version 1; peer review: 1 approved]</p>
                    </fn>
                </fn-group>
            </title-group>
            <contrib-group>
                <contrib contrib-type="author" corresp="yes">
                    <name>
                        <surname>Harter</surname>
                        <given-names>Derek</given-names>
                    </name>
                    <role content-type="http://credit.niso.org/">Methodology</role>
                    <role content-type="http://credit.niso.org/">Project Administration</role>
                    <role content-type="http://credit.niso.org/">Software</role>
                    <role content-type="http://credit.niso.org/">Writing &#x2013; Original Draft Preparation</role>
                    <uri content-type="orcid">https://orcid.org/0000-0002-3582-1082</uri>
                    <xref ref-type="corresp" rid="c1">a</xref>
                    <xref ref-type="aff" rid="a1">1</xref>
                </contrib>
                <contrib contrib-type="author" corresp="no">
                    <name>
                        <surname>Lu</surname>
                        <given-names>Shulan</given-names>
                    </name>
                    <role content-type="http://credit.niso.org/">Funding Acquisition</role>
                    <role content-type="http://credit.niso.org/">Project Administration</role>
                    <role content-type="http://credit.niso.org/">Supervision</role>
                    <role content-type="http://credit.niso.org/">Writing &#x2013; Review &amp; Editing</role>
                    <xref ref-type="aff" rid="a2">2</xref>
                </contrib>
                <aff id="a1">
                    <label>1</label>Computer Science, Texas A&amp;M University-Commerce, Commerce, Texas, 75428, USA</aff>
                <aff id="a2">
                    <label>2</label>Psychology, Texas A&amp;M University-Commerce, Commerce, Texas, 75428, USA</aff>
            </contrib-group>
            <author-notes>
                <corresp id="c1">
                    <label>a</label>
                    <email xlink:href="mailto:derek.harter@tamuc.edu">derek.harter@tamuc.edu</email>
                </corresp>
                <fn fn-type="conflict">
                    <p>No competing interests were disclosed.</p>
                </fn>
            </author-notes>
            <pub-date pub-type="epub">
                <day>8</day>
                <month>1</month>
                <year>2024</year>
            </pub-date>
            <pub-date pub-type="collection">
                <year>2024</year>
            </pub-date>
            <volume>13</volume>
            <elocation-id>43</elocation-id>
            <history>
                <date date-type="accepted">
                    <day>21</day>
                    <month>8</month>
                    <year>2023</year>
                </date>
            </history>
            <permissions>
                <copyright-statement>Copyright: &#x00a9; 2024 Harter D and Lu S</copyright-statement>
                <copyright-year>2024</copyright-year>
                <license xlink:href="https://creativecommons.org/licenses/by/4.0/">
                    <license-p>This is an open access article distributed under the terms of the Creative Commons Attribution Licence, which permits unrestricted use, distribution, and reproduction in any medium, provided the original work is properly cited.</license-p>
                </license>
            </permissions>
            <self-uri content-type="pdf" xlink:href="https://f1000research.com/articles/13-43/pdf"/>
            <abstract>
                <p>We describe a Python library project for generating animations of simple 3D motion capture data points. The motion capture method is agnostic with respect to this visualizaiton tool, expecting a time series of time stamped coordinates captured in a 3-dimensional space. One of the advantages of this tool is the simple data format design. This tool was developed originally for a Kinect system implementing skeleton tracking of 15 joint positions, where each data point consists of an accurate time of capture (time stamp), and 3 accurate coordinate (x, y, z) positions of each of the 15 joints at each time step. In addition to the motion capture time series, all that is needed is a joint graph file describing the relationship of the joint edges to one another. This library can be extended to visualize and create animations of motion capture data that can be reformulated using this basic structure of a time series of time stamped 3D coordinates and a joint graph description file. This library should be useful as is, or with easy modification, for many such visualization requirements of similar motion capture data.</p>
            </abstract>
            <kwd-group kwd-group-type="author">
                <kwd>motion tracking</kwd>
                <kwd>skeleton tracking</kwd>
                <kwd>scientific visualization</kwd>
            </kwd-group>
            <funding-group>
                <award-group id="fund-1" xlink:href="http://dx.doi.org/10.13039/100006754">
                    <funding-source>Army Research Laboratory</funding-source>
                    <award-id>W911NF-21-2-0153</award-id>
                </award-group>
                <funding-statement>This research was supported by Army Research Lab (ARL) grant \# W911NF-21-2-0153 awarded to Shulan Lu and Derek Harter at Texas A\&amp;M University - Commerce.</funding-statement>
                <funding-statement>
                    <italic>The funders had no role in study design, data collection and analysis, decision to publish, or preparation of the manuscript.</italic>
                </funding-statement>
            </funding-group>
        </article-meta>
    </front>
    <body>
        <sec id="sec1" sec-type="intro">
            <title>Introduction</title>
            <p>Motion capture devices range from simple comsumer grade devices, like the Kinect camera-based depth sensors
                <sup>
                    <xref ref-type="bibr" rid="ref1">1</xref>
                </sup>
                <sup>,</sup>
                <sup>
                    <xref ref-type="bibr" rid="ref2">2</xref>
                </sup> to more serious motion capture systems
                <sup>
                    <xref ref-type="bibr" rid="ref3">3</xref>
                </sup>
                <sup>,</sup>
                <sup>
                    <xref ref-type="bibr" rid="ref4">4</xref>
                </sup> with fine spatial and fast temporal resolutions used for generating mocap video rendering.</p>
            <p>Creating animated visualization in the base Python 3.X scientific python stack is certainly much simpler than it has been in the past, but still requires many specialized steps to achieve the task of creating an animation that can be saved as a movie for presentation. The standard Matplotlib animation library documentation
                <sup>
                    <xref ref-type="bibr" rid="ref5">5</xref>
                </sup> contains several examples of generated animations, but only 1 of animating a 3D set of data.
                <sup>
                    <xref ref-type="bibr" rid="ref6">6</xref>
                </sup> The basic technique to use an instance of 
                <monospace>matplotlib.animation</monospace> to generate a sequence of frames from a set of 3D points is clear from the documentation, but can certainly be difficult to generalize for much more complex data than showing the basic example.</p>
            <p>3D motion capture data are a very useful type of data that needs to be visualized to analyze its significance. The goal of the 
                <monospace>Motionrender</monospace> library is to simplify the task of creating animated visualizations of such 3D time series data. The library presented here can be generalized to work with a time series of N 3D points in space to create an animation of subsequent frames of the captured points evolving over time. The only additional general information needed is a matrix of the relationship of the N points in space that should be connected as being related points in the resulting animation, known as a joint graph or joint edge graph by the library.</p>
            <p>We used motion capture from a very basic Kinect skeleton tracking experiment, using the NiTE 2.0 library
                <sup>
                    <xref ref-type="bibr" rid="ref7">7</xref>
                </sup>
                <sup>,</sup>
                <sup>
                    <xref ref-type="bibr" rid="ref8">8</xref>
                </sup> which includes skeleton tracking capture in the development of this visualizaiton library. The NiTE library is available from Nuitrack and provides an API to more easily motion track skeleton position points of a user from a standard Kinect device. This is one of several API libraries available for the Kinect device to allow one to develop skeleton tracking applications.</p>
            <p>However the general format, described in methods, can be extended to many kinds of motion capture devices where a timestamp and a set of 3D point positions can be obtained for the captured object in motion. In the example implementation discussed, we have 
                <inline-formula>
                    <mml:math display="inline">
                        <mml:mi>N</mml:mi>
                        <mml:mo>=</mml:mo>
                        <mml:mn>15</mml:mn>
                    </mml:math>
                </inline-formula> joint positions (e.g. head, neck, left shoulder, etc.) captured by the motion Kinect depth sensing cameras. An example of a rendered frame of the motion capture animation is shown in 
                <xref ref-type="fig" rid="f1">Figure 1</xref>. Sample videos of the resulting animation are available in the repository for this project, referenced below.</p>
            <fig fig-type="figure" id="f1" orientation="portrait" position="float">
                <label>Figure 1. </label>
                <caption>
                    <title>Example of a rendered frame of 3D motion capture joint positions.</title>
                </caption>
                <graphic id="gr1" orientation="portrait" position="float" xlink:href="https://f1000research-files.f1000.com/manuscripts/151539/f4acb117-1ebb-4893-9e87-15a969c327f6_figure1.gif"/>
            </fig>
        </sec>
        <sec id="sec2" sec-type="methods">
            <title>Methods</title>
            <p>The model is available from 
                <ext-link ext-link-type="uri" xlink:href="http://github">GitHub</ext-link> and is archived with 
                <ext-link ext-link-type="uri" xlink:href="http://zenodo">Zenodo</ext-link>.
                <sup>
                    <xref ref-type="bibr" rid="ref10">10</xref>
                </sup>
            </p>
            <sec id="sec3">
                <title>Implementation</title>
                <p>The version of the 
                    <monospace>MotionRender</monospace> library described here was developed on a Python 3.X scientific tool stack environment. It has dependencies on the 
                    <ext-link ext-link-type="uri" xlink:href="http://pandas">pandas</ext-link> and 
                    <ext-link ext-link-type="uri" xlink:href="http://matplotlib">matplotlib</ext-link> python libraries. In addtion, for back end rendering, the 
                    <ext-link ext-link-type="uri" xlink:href="http://ffmpeg">ffmpeg</ext-link> tool (free and open source) or similar tool is needed.</p>
                <p>We have 15 joint positions in the example subject motion captured data sets used in developing the library. Each joint position is captured approximately 30 times per second by the Kinect sensor programmed with the NiTE 2.0 skeleton tracking library software. So while the library was generated specifically with 15 3D motion capture points, the general format of the input data needed to render a 3D animation is
                    <preformat orientation="portrait" position="float" preformat-type="computer code" xml:space="preserve">

                        <monospace>timeStamp, joint0X, joint0Y, joint0Z,</monospace>
&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2002;
                        <monospace>joint1X, joint1Y, joint1Z,</monospace>
&#x2003;
                        <monospace>&#x2026;,</monospace>
&#x2003;
                        <monospace>jointNX, jointNY, jointNZ</monospace>
                    </preformat>
                </p>
                <p>as a standard comma separated value (csv) data file, where 
                    <inline-formula>
                        <mml:math display="inline">
                            <mml:mi>N</mml:mi>
                        </mml:math>
                    </inline-formula> can be specified when rendering a motion capture animation of how many joint/position points are in the input. The only other information needed by the library is a joint connection graph of the points if we want to visualize the relationship of the rendered points to one another while being animated. Again using the Kinect 15 joint position data, we specify a joint graph for the software like this:
                    <preformat orientation="portrait" position="float" preformat-type="computer code" xml:space="preserve">

                        <monospace># the relationship of the joint points to assigned numeric position.</monospace>

                        <monospace># the numeric id corresponds to the expected position in the input file</monospace>

                        <monospace>joint_names = [</monospace>
&#x2003;&#x2002;
                        <monospace>&#x2018;Head&#x2019;, &#x2018;Neck&#x2019;, &#x2018;Torso&#x2019;, &#x2003;&#x2003;&#x2003;&#x2002;&#x2002;&#x2002;&#x2002;&#x2002;# 0 1 2</monospace>
&#x2003;&#x2002;
                        <monospace>&#x2018;LeftShoulder&#x2019;, &#x2018;RightShoulder&#x2019;,&#x2003;# 3 4</monospace>
&#x2003;&#x2002;
                        <monospace>&#x2018;LeftElbow&#x2019;, &#x2018;RightElbow&#x2019;, &#x2003;&#x2003;&#x2003;&#x2003;# 5 6</monospace>
&#x2003;&#x2002;
                        <monospace>&#x2018;LeftHand&#x2019;, &#x2018;RightHand&#x2019;, &#x2003;&#x2003;&#x2003;&#x2003;&#x2003;# 7 8</monospace>
&#x2003;&#x2002;
                        <monospace>&#x2018;LeftHip&#x2019;, &#x2018;RightHip&#x2019;, &#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;# 9 10</monospace>
&#x2003;&#x2002;
                        <monospace>&#x2018;LeftKnee&#x2019;, &#x2018;RightKnee&#x2019;, &#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2002;# 11 12</monospace>
&#x2003;&#x2002;
                        <monospace>&#x2018;LeftFoot&#x2019;, &#x2018;RightFoot&#x2019;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;# 13 14</monospace>

                        <monospace>]</monospace>

                        <monospace># joint position graph for visualizing relationship between joints</monospace>

                        <monospace>joint_graph = [</monospace>
&#x2003;&#x2002;
                        <monospace>(0, 1), (1, 3), (1, 4), &#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;# head to neck, neck to shoulders</monospace>
&#x2003;&#x2002;
                        <monospace>(3, 5), (4, 6), &#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2002;# shoulders to elbows</monospace>
&#x2003;&#x2002;
                        <monospace>(5, 7), (6, 8), &#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2002;# elbows to hands</monospace>
&#x2003;&#x2002;
                        <monospace>(3, 2), (4, 2), (9, 2), (10, 2),&#x2003;&#x2003;# shoulders and hips to torso</monospace>
&#x2003;&#x2002;
                        <monospace>(3, 9), (4, 10), (9, 10), &#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;# shoulders to hips, connect hips</monospace>
&#x2003;&#x2002;
                        <monospace>(9, 11), (10, 12), &#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;# hips to knees</monospace>
&#x2003;&#x2002;
                        <monospace>(11, 13), (12, 14), &#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2002;# knees to feet</monospace>

                        <monospace>]</monospace>
                    </preformat>
                </p>
                <p>The user specifies the joint connection graph as a second input to the library for operation. The symbolic names of the joints must match the names in the time stamped motion capture time series of points. For example, the full Kinect connection graph of the 15 captured joints is specified as:
                    <preformat orientation="portrait" position="float" preformat-type="computer code" xml:space="preserve">

                        <monospace>head neck</monospace>

                        <monospace>neck leftShoulder</monospace>

                        <monospace>neck rightShoulder</monospace>

                        <monospace>leftShoulder leftElbow</monospace>

                        <monospace>rightShoulder rightElbow</monospace>

                        <monospace>leftElbow leftHand</monospace>

                        <monospace>rightElbow rightHand</monospace>

                        <monospace>leftShoulder torso</monospace>

                        <monospace>rightShoulder torso</monospace>

                        <monospace>leftHip torso</monospace>

                        <monospace>rightHip torso</monospace>

                        <monospace>leftShoulder leftHip</monospace>

                        <monospace>rightShoulder rightHip</monospace>

                        <monospace>leftHip rightHip</monospace>

                        <monospace>leftHip leftKnee</monospace>

                        <monospace>rightHip rightKnee</monospace>

                        <monospace>leftKnee leftFoot</monospace>

                        <monospace>rightKnee rightFoot</monospace>
                    </preformat>
                </p>
            </sec>
            <sec id="sec4">
                <title>Operation</title>
                <p>
                    <monospace>MotionRender</monospace> requires 
                    <monospace>matplotlib</monospace> and 
                    <monospace>pandas</monospace> libraries for its operation.
                    <preformat orientation="portrait" position="float" preformat-type="computer code" xml:space="preserve">

                        <monospace>$&#x2003;sudo&#x2003;pip&#x2003;install&#x2003;matplotlib&#x2003;pandas</monospace>
                    </preformat>
                </p>
                <p>In addition the 
                    <monospace>ffmpeg</monospace> library is used as a back end frame renderer for creating video files.
                    <preformat orientation="portrait" position="float" preformat-type="computer code" xml:space="preserve">

                        <monospace>$&#x2003;sudo&#x2003;apt&#x2003;install&#x2003;ffmpeg</monospace>
                    </preformat>
                </p>
                <p>Install the 
                    <monospace>MotionRender</monospace> library from standard PyPi python library.
                    <preformat orientation="portrait" position="float" preformat-type="computer code" xml:space="preserve">

                        <monospace>$&#x2003;pip&#x2003;install&#x2003;motionrender</monospace>
                    </preformat>
                </p>
                <p>The library expects a standard csv file of values, where the first column is a time stamp. Subsequent columns are the data for motion capture point 0 (x, y, z), motion capture point 1, etc. So given 15 motion capture points, this library expects and array with 46 columns, where the first column is a time stamp, and the subsequent columns are the 3D positions for all points captured. This could be loaded from a csv file, or generated from some other source.</p>
                <p>The second parameter corresponds to the joint graph shown above. This is expected to be a space separated file of edge relations defined between the joint position names. The joint position names for the time series capture data should match the joint position names in the joint graph. The library currently contains to main API functions that may be used. The 
                    <monospace>render_frame()</monospace> member funtction of the main 
                    <monospace>MotionRender</monospace> class renders single frames from the motion capture data. While the 
                    <monospace>render_animation()</monospace> function renders video files. Actually the default behavior of both of these methods is to return 
                    <monospace>figure</monospace> and 
                    <monospace>animation</monospace> object instances respectively. However, the user can supply a file name to these API calls and the figure/video will then be saved in the specified file. Following is a quick example of using the library interactively to read in motion capture data, and render it as figures and videos.
                    <preformat orientation="portrait" position="float" preformat-type="computer code" xml:space="preserve">

                        <monospace>$ pip install motionrender</monospace>

                        <monospace>Collecting motionrender</monospace>
&#x2003;&#x2003;
                        <monospace>Downloading motionrender-1.0.0-py3-none-any.whl (18 kB)</monospace>

                        <monospace>Installing collected packages: motionrender</monospace>

                        <monospace>Successfully installed motionrender-1.0.0</monospace>
                    </preformat>
                    <preformat orientation="portrait" position="float" preformat-type="computer code" xml:space="preserve">

                        <monospace>$ python</monospace>

                        <monospace>Python 3.9.7 (default, Sep 16 2021, 13:09:58)</monospace>

                        <monospace>[GCC 7.5.0] :: Anaconda, Inc. on linux</monospace>

                        <monospace>Type "help", "copyright", "credits" or "license" for more information.</monospace>

                        <monospace>&gt;&gt;&gt; from motionrender import MotionRender</monospace>

                        <monospace>&gt;&gt;&gt; mr = MotionRender("data/standing-subject.csv", "data/standing-joint-graph.csv")</monospace>

                        <monospace>&gt;&gt;&gt; fig = mr.render_frame(1636576712852000, figure_name="standing-subject.png")</monospace>

                        <monospace>&gt;&gt;&gt; anim = mr.render_animation(movie_name="standing-subject.mov") processing frame: 0 processing frame: 500</monospace>
                    </preformat>
                </p>
                <p>Additional files are included in the main directory of the example project, that includes the data file use cases shown here. The test files contain additional examples of configuring rendering options of the library. You can invoke them in the example project as:
                    <preformat orientation="portrait" position="float" preformat-type="computer code" xml:space="preserve">

                        <monospace>$&#x2003;python&#x2003;test-plot.py</monospace>

                        <monospace>$&#x2003;python&#x2003;test-render.py</monospace>
                    </preformat>
                </p>
                <p>In addition there is also a jupyter notebook present in the example project named 
                    <monospace>test.ipynb</monospace> that shows further how the library can be used interactively.</p>
            </sec>
        </sec>
        <sec id="sec5">
            <title>Use Cases</title>
            <p>As a use case, we use the 
                <monospace>MotionRender</monospace> library and generate animations of a set of Kinect motion capture data. This data was used in the analysis of
                <sup>
                    <xref ref-type="bibr" rid="ref9">9</xref>
                </sup> research paper. This data and the software workflow to render participants in the experiments can be found in the source code repository listed below. Two samples of the kinect motion capture data, from a sitting and standing participant respectively, can be found in the example project. These files give further examples of the data format expected by the input files for the library.</p>
        </sec>
        <sec id="sec6">
            <title>Limitations</title>
            <p>This library relies on current version of Python and matplotlib animation library. Data is expected in the needed format, which may not always be simple to massage into depending on the motion capture device output. A rendering background tool, such as 
                <monospace>ffmpeg</monospace> must also be installed and accessable to 
                <monospace>matplotlib</monospace>.</p>
        </sec>
        <sec id="sec7" sec-type="conclusions">
            <title>Conclusions</title>
            <p>The 
                <monospace>MotionRender</monospace> library documented here provides a small tool that may be of use to those with motion capture data, or similar data sets that consist of a time series of points captured at intervals. The tool uses a simple data format, needing a flat file of captured points and another file defining the point graph relationships for rendering. The python 
                <monospace>matplotlib</monospace> animation facilities are a bit hard to use. It is hoped this library would fill a gap and allow for easier rendering of motion capture data.</p>
        </sec>
        <sec id="sec8">
            <title>Software availability</title>
            <p>
                <list list-type="bullet">
                    <list-item>
                        <label>&#x2022;</label>
                        <p>Software available from: 
                            <ext-link ext-link-type="uri" xlink:href="https://test.pypi.org/project/motionrender/1.0.0/">https://test.pypi.org/project/motionrender/1.0.0/</ext-link>
                        </p>
                    </list-item>
                    <list-item>
                        <label>&#x2022;</label>
                        <p>Source code available from: 
                            <ext-link ext-link-type="uri" xlink:href="https://github.com/DerekHarter/motionrender-example">https://github.com/DerekHarter/motionrender-example</ext-link>
                        </p>
                    </list-item>
                    <list-item>
                        <label>&#x2022;</label>
                        <p>Archived source code at the time of publication: 
                            <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.5281/zenodo.8172972">https://doi.org/10.5281/zenodo.8172972</ext-link>.
                            <sup>
                                <xref ref-type="bibr" rid="ref10">10</xref>
                            </sup>
                        </p>
                    </list-item>
                    <list-item>
                        <label>&#x2022;</label>
                        <p>The development repository for this library, if you are interested in the code internals, can be found here: 
                            <ext-link ext-link-type="uri" xlink:href="https://github.com/DerekHarter/motionrender">https://github.com/DerekHarter/motionrender</ext-link>
                        </p>
                    </list-item>
                    <list-item>
                        <label>&#x2022;</label>
                        <p>License: 
                            <ext-link ext-link-type="uri" xlink:href="http://gpl-3">GPL-3</ext-link>
                        </p>
                    </list-item>
                </list>
            </p>
        </sec>
    </body>
    <back>
        <sec id="sec11" sec-type="data-availability">
            <title>Data availability</title>
            <sec id="sec12">
                <title>Underlying data</title>
                <p>The underlying data has been deposited in:</p>
                <p>Zenodo: Motion Render Example Project, 
                    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.5281/zenodo.8172972">https://doi.org/10.5281/zenodo.8172972</ext-link>.
                    <sup>

                        <xref ref-type="bibr" rid="ref10">10</xref>
</sup>
                </p>
                <p>This project contains the following underlying data:
                    <list list-type="bullet">
                        <list-item>
                            <label>&#x2010;</label>
                            <p>[data/sitting-joint-graph.csv] Joint graph definition for sitting subject.</p>
                        </list-item>
                        <list-item>
                            <label>&#x2010;</label>
                            <p>[data/sitting-subject.csv] Example motion capture data for sitting subject.</p>
                        </list-item>
                        <list-item>
                            <label>&#x2010;</label>
                            <p>[data/standing-joint-graph.csv] Joint graph definition for standing subject.</p>
                        </list-item>
                        <list-item>
                            <label>&#x2010;</label>
                            <p>[data/standing-subject.csv] Example motion capture data for standing subject.</p>
                        </list-item>
                    </list>
                </p>
                <p>Data are available under the terms of the 
                    <ext-link ext-link-type="uri" xlink:href="https://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International license</ext-link> (CC-BY 4.0).</p>
            </sec>
        </sec>
        <ack>
            <title>Acknowledgements</title>
            <p>Thanks to Jonathan Z. Bakdash and Laura R. Marusich from Army Research Lab (ARL) for input and feedback on this codebase.</p>
        </ack>
        <ref-list>
            <title>References</title>
            <ref id="ref1">
                <label>1</label>
                <mixed-citation publication-type="journal">
                    <person-group person-group-type="author">

                        <name name-style="western">
                            <surname>Pfister</surname>
                            <given-names>A</given-names>
                        </name>

                        <name name-style="western">
                            <surname>West</surname>
                            <given-names>AM</given-names>
                        </name>

                        <name name-style="western">
                            <surname>Bronner</surname>
                            <given-names>S</given-names>
                        </name>

                        <etal/>
</person-group>:
                    <article-title>Comparative abilities of microsoft kinect and vicon 3d motion capture for gait analysis.</article-title>
                    <source>

                        <italic toggle="yes">J. Med. Eng. Technol.</italic>
</source>
                    <year>2014</year>;<volume>38</volume>(<issue>5</issue>):<fpage>274</fpage>&#x2013;<lpage>280</lpage>.
                    <pub-id pub-id-type="pmid">24878252</pub-id>
                    <pub-id pub-id-type="doi">10.3109/03091902.2014.909540</pub-id>
                </mixed-citation>
            </ref>
            <ref id="ref2">
                <label>2</label>
                <mixed-citation publication-type="journal">
                    <person-group person-group-type="author">

                        <name name-style="western">
                            <surname>Napoli</surname>
                            <given-names>A</given-names>
                        </name>

                        <name name-style="western">
                            <surname>Glass</surname>
                            <given-names>S</given-names>
                        </name>

                        <name name-style="western">
                            <surname>Ward</surname>
                            <given-names>C</given-names>
                        </name>

                        <etal/>
</person-group>:
                    <article-title>Performance analysis of a generalized motion capture system using microsoft kinect 2.0.</article-title>
                    <source>

                        <italic toggle="yes">Biomed. Signal Process Control.</italic>
</source>
                    <year>2017</year>;<volume>38</volume>:<fpage>265</fpage>&#x2013;<lpage>280</lpage>.
                    <pub-id pub-id-type="doi">10.1016/j.bspc.2017.06.006</pub-id>
                </mixed-citation>
            </ref>
            <ref id="ref3">
                <label>3</label>
                <mixed-citation publication-type="journal">
                    <person-group person-group-type="author">

                        <name name-style="western">
                            <surname>Bregler</surname>
                            <given-names>C</given-names>
                        </name>
</person-group>:
                    <article-title>Motion capture technology for entertainment [in the spotlight].</article-title>
                    <source>

                        <italic toggle="yes">IEEE Signal Process. Mag.</italic>
</source>
                    <year>2007</year>;<volume>24</volume>(<issue>6</issue>):<fpage>158</fpage>&#x2013;<lpage>160</lpage>.
                    <pub-id pub-id-type="doi">10.1109/MSP.2007.906023</pub-id>
                </mixed-citation>
            </ref>
            <ref id="ref4">
                <label>4</label>
                <mixed-citation publication-type="journal">
                    <person-group person-group-type="author">

                        <name name-style="western">
                            <surname>Menolotto</surname>
                            <given-names>M</given-names>
                        </name>

                        <name name-style="western">
                            <surname>Komaris</surname>
                            <given-names>D-S</given-names>
                        </name>

                        <name name-style="western">
                            <surname>Tedesco</surname>
                            <given-names>S</given-names>
                        </name>

                        <etal/>
</person-group>:
                    <article-title>Motion capture technology in industrial applications: A systematic review.</article-title>
                    <source>

                        <italic toggle="yes">Sensors.</italic>
</source>
                    <year>2020</year>;<volume>20</volume>(<issue>19</issue>):<fpage>5687</fpage>.
                    <pub-id pub-id-type="pmid">33028042</pub-id>
                    <pub-id pub-id-type="doi">10.3390/s20195687</pub-id>
                    <pub-id pub-id-type="pmcid">PMC7583783</pub-id>
                </mixed-citation>
            </ref>
            <ref id="ref5">
                <label>5</label>
                <mixed-citation publication-type="other">
                    <collab>Matplotlib 3.6.0 Stable Release Documentation</collab>:
                    <article-title>Matplotlib.animation library.</article-title>
                    <year>2022</year>.
                    <ext-link ext-link-type="uri" xlink:href="https://matplotlib.org/3.6.0/api/animation_api.html">Reference Source</ext-link>
                </mixed-citation>
            </ref>
            <ref id="ref6">
                <label>6</label>
                <mixed-citation publication-type="other">
                    <collab>Matplotlib 3.6.0 Stable Release Documentation</collab>:
                    <article-title>Animated 3d random walk.</article-title>
                    <year>2022</year>.
                    <ext-link ext-link-type="uri" xlink:href="https://matplotlib.org/3.6.0/gallery/animation/random_walk.html">Reference Source</ext-link>
                </mixed-citation>
            </ref>
            <ref id="ref7">
                <label>7</label>
                <mixed-citation publication-type="other">
                    <collab>PrimeSense</collab>:
                    <article-title>Nite 2.0 library documentation.</article-title>
                    <year>2022</year>.
                    <ext-link ext-link-type="uri" xlink:href="https://documentation.help/NiTE-2.0/documentation.pdf">Reference Source</ext-link>
                </mixed-citation>
            </ref>
            <ref id="ref8">
                <label>8</label>
                <mixed-citation publication-type="other">
                    <collab>Nuitrack</collab>:
                    <article-title>Nuitrack sdk: 3d body (skeletal) tracking middleware.</article-title>
                    <year>2022</year>.
                    <ext-link ext-link-type="uri" xlink:href="https://nuitrack.com/">Reference Source</ext-link>
                </mixed-citation>
            </ref>
            <ref id="ref9">
                <label>9</label>
                <mixed-citation publication-type="journal">
                    <person-group person-group-type="author">

                        <name name-style="western">
                            <surname>Caron</surname>
                            <given-names>EE</given-names>
                        </name>

                        <name name-style="western">
                            <surname>Marusich</surname>
                            <given-names>LR</given-names>
                        </name>

                        <name name-style="western">
                            <surname>Bakdash</surname>
                            <given-names>JZ</given-names>
                        </name>

                        <etal/>
</person-group>:
                    <article-title>The influence of posture on attention.</article-title>
                    <source>

                        <italic toggle="yes">Exp. Psychol.</italic>
</source>
                    <year>2022</year>;<volume>69</volume>(<issue>6</issue>):<fpage>295</fpage>&#x2013;<lpage>307</lpage>.
                    <pub-id pub-id-type="pmid">36809160</pub-id>
                    <pub-id pub-id-type="doi">10.1027/1618-3169/a000567</pub-id>
                    <pub-id pub-id-type="pmcid">PMC10102972</pub-id>
                </mixed-citation>
            </ref>
            <ref id="ref10">
                <label>10</label>
                <mixed-citation publication-type="data">
                    <person-group person-group-type="author">

                        <name name-style="western">
                            <surname>Harter</surname>
                            <given-names>D</given-names>
                        </name>
</person-group>:
                    <data-title>DerekHarter/motionrender-example: Release 1.0.0 (v1.0.0).</data-title>[Dataset]
                    <source>

                        <italic toggle="yes">Zenodo.</italic>
</source>
                    <year>2023</year>.
                    <pub-id pub-id-type="doi">10.5281/zenodo.8172972</pub-id>
                </mixed-citation>
            </ref>
        </ref-list>
    </back>
    <sub-article article-type="reviewer-report" id="report277962">
        <front-stub>
            <article-id pub-id-type="doi">10.5256/f1000research.151539.r277962</article-id>
            <title-group>
                <article-title>Reviewer response for version 1</article-title>
            </title-group>
            <contrib-group>
                <contrib contrib-type="author">
                    <name>
                        <surname>Jolly</surname>
                        <given-names>Eshin</given-names>
                    </name>
                    <xref ref-type="aff" rid="r277962a1">1</xref>
                    <role>Referee</role>
                    <uri content-type="orcid">https://orcid.org/0000-0002-6144-5789</uri>
                </contrib>
                <aff id="r277962a1">
                    <label>1</label>Dartmouth College, Hanover, USA</aff>
            </contrib-group>
            <author-notes>
                <fn fn-type="conflict">
                    <p>
                        <bold>Competing interests: </bold>No competing interests were disclosed.</p>
                </fn>
            </author-notes>
            <pub-date pub-type="epub">
                <day>5</day>
                <month>6</month>
                <year>2024</year>
            </pub-date>
            <permissions>
                <copyright-statement>Copyright: &#x00a9; 2024 Jolly E</copyright-statement>
                <copyright-year>2024</copyright-year>
                <license xlink:href="https://creativecommons.org/licenses/by/4.0/">
                    <license-p>This is an open access peer review report distributed under the terms of the Creative Commons Attribution Licence, which permits unrestricted use, distribution, and reproduction in any medium, provided the original work is properly cited.</license-p>
                </license>
            </permissions>
            <related-article ext-link-type="doi" id="relatedArticleReport277962" related-article-type="peer-reviewed-article" xlink:href="10.12688/f1000research.138349.1"/>
            <custom-meta-group>
                <custom-meta>
                    <meta-name>recommendation</meta-name>
                    <meta-value>approve</meta-value>
                </custom-meta>
            </custom-meta-group>
        </front-stub>
        <body>
            <p>Motionrender seems like a great bespoke tool for visualizing 3D motion capture data. I can confirm this after successfully downloading the package, running the test-suite, and running the example code. I just had a few minor suggestions that might aid in wider adoption if the authors desire:&#x00a0;</p>
            <p> - Adding matplotlib and pandas as dependency to the project &#x2013; I&#x2019;ve opened a pull-request on github to help facilitate this</p>
            <p> - Adding a documentation-site auto-generated from docstrings e.g. using sphinx or mkdocs in python</p>
            <p> - Until a docs site is made I would recommend including the example in the paper, on the README page of the repo as an illustrative example</p>
            <p>Are the conclusions about the tool and its performance adequately supported by the findings presented in the article?</p>
            <p>Yes</p>
            <p>Is the rationale for developing the new software tool clearly explained?</p>
            <p>Yes</p>
            <p>Is the description of the software tool technically sound?</p>
            <p>Yes</p>
            <p>Are sufficient details of the code, methods and analysis (if applicable) provided to allow replication of the software development and its use by others?</p>
            <p>Yes</p>
            <p>Is sufficient information provided to allow interpretation of the expected output datasets and any results generated using the tool?</p>
            <p>Yes</p>
            <p>Reviewer Expertise:</p>
            <p>computational social neuroscience</p>
            <p>I confirm that I have read this submission and believe that I have an appropriate level of expertise to confirm that it is of an acceptable scientific standard.</p>
        </body>
    </sub-article>
</article>
