diff --git a/docs/documentation.aux b/docs/documentation.aux
index 12e5c425edcabbc50270c348f0c4ac2a83e7ff7f..88ff1e7adcf5df50f2dee5b0efc5c5f7e73dc99c 100644
--- a/docs/documentation.aux
+++ b/docs/documentation.aux
@@ -35,28 +35,36 @@
 \@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Follow-the-Leader (FTL)}{2}{subsection.2.3}\protected@file@percent }
 \@writefile{toc}{\contentsline {section}{\numberline {3}Position Based Simulation}{2}{section.3}\protected@file@percent }
 \@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Algorithm Overview}{2}{subsection.3.1}\protected@file@percent }
+\newlabel{section:algorithmOverview}{{3.1}{2}{Algorithm Overview}{subsection.3.1}{}}
+\citation{MullerPBD}
+\citation{MullerPBD}
 \citation{MullerPBD}
 \@writefile{loa}{\contentsline {algocf}{\numberline {1}{\ignorespaces pseudo code for the PBD simulation\relax }}{3}{algocf.1}\protected@file@percent }
 \newlabel{alg:pbd}{{1}{3}{Algorithm Overview}{algocf.1}{}}
 \@writefile{toc}{\contentsline {subsection}{\numberline {3.2}The Solver}{3}{subsection.3.2}\protected@file@percent }
 \newlabel{sec:solver}{{3.2}{3}{The Solver}{subsection.3.2}{}}
 \citation{MullerPBD}
-\citation{PixarVolumetricHair}
-\citation{FTLHair}
+\citation{UmenhofferSimulation}
 \@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Distance Constraint}{4}{subsection.3.3}\protected@file@percent }
+\newlabel{section:DistanceConstraint}{{3.3}{4}{Distance Constraint}{subsection.3.3}{}}
 \newlabel{eq:distance_constraint}{{1}{4}{Distance Constraint}{equation.3.1}{}}
 \@writefile{toc}{\contentsline {subsection}{\numberline {3.4}Bending Constraint}{4}{subsection.3.4}\protected@file@percent }
+\newlabel{section:bendingConstraint}{{3.4}{4}{Bending Constraint}{subsection.3.4}{}}
 \@writefile{toc}{\contentsline {subsection}{\numberline {3.5}Collision Constraint}{4}{subsection.3.5}\protected@file@percent }
-\@writefile{toc}{\contentsline {section}{\numberline {4}Implementation}{4}{section.4}\protected@file@percent }
-\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Data:}{4}{subsection.4.1}\protected@file@percent }
-\@writefile{toc}{\contentsline {section}{\numberline {5}Putting Hair on the Head}{4}{section.5}\protected@file@percent }
-\@writefile{toc}{\contentsline {section}{\numberline {6}Results}{4}{section.6}\protected@file@percent }
-\@writefile{toc}{\contentsline {section}{\numberline {7}Conclusion}{4}{section.7}\protected@file@percent }
-\newlabel{sec:conclusion}{{7}{4}{Conclusion}{section.7}{}}
-\@writefile{toc}{\contentsline {section}{\numberline {8}Future Work}{4}{section.8}\protected@file@percent }
-\newlabel{sec:future_work}{{8}{4}{Future Work}{section.8}{}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {8.1}Hair-hair collisions}{4}{subsection.8.1}\protected@file@percent }
-\newlabel{subsec:future_work_collision}{{8.1}{4}{Hair-hair collisions}{subsection.8.1}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.6}Position Constraint}{4}{subsection.3.6}\protected@file@percent }
+\citation{PixarVolumetricHair}
+\citation{FTLHair}
+\@writefile{toc}{\contentsline {section}{\numberline {4}Implementation}{5}{section.4}\protected@file@percent }
+\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Datastructures}{5}{subsection.4.1}\protected@file@percent }
+\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}Constraints}{5}{subsection.4.2}\protected@file@percent }
+\@writefile{toc}{\contentsline {subsection}{\numberline {4.3}Putting the Hair in the Hair Simulation}{5}{subsection.4.3}\protected@file@percent }
+\@writefile{toc}{\contentsline {section}{\numberline {5}Results}{5}{section.5}\protected@file@percent }
+\@writefile{toc}{\contentsline {section}{\numberline {6}Conclusion}{5}{section.6}\protected@file@percent }
+\newlabel{sec:conclusion}{{6}{5}{Conclusion}{section.6}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {7}Future Work}{5}{section.7}\protected@file@percent }
+\newlabel{sec:future_work}{{7}{5}{Future Work}{section.7}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {7.1}Hair-hair Collisions}{5}{subsection.7.1}\protected@file@percent }
+\newlabel{subsec:future_work_collision}{{7.1}{5}{Hair-hair Collisions}{subsection.7.1}{}}
 \citation{RappRealTime}
 \citation{UmenhofferSimulation}
 \bibstyle{ACM-Reference-Format}
@@ -67,21 +75,27 @@
 \bibcite{PixarVolumetricHair}{{4}{2006}{{Petrovic et~al\mbox  {.}}}{{Petrovic, Henne, and Pixar}}}
 \bibcite{RappRealTime}{{5}{2014}{{Rapp}}{{Rapp}}}
 \bibcite{UmenhofferSimulation}{{6}{2016}{{Umenhoffer et~al\mbox  {.}}}{{Umenhoffer, Marschal, and Suti}}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {8.2}Refinement and proper customizability of the propagation of hair strands on the head object.}{5}{subsection.8.2}\protected@file@percent }
-\@writefile{toc}{\contentsline {subsection}{\numberline {8.3}Better customizability}{5}{subsection.8.3}\protected@file@percent }
-\@writefile{toc}{\contentsline {subsection}{\numberline {8.4}Sequence for randomizing hair positions}{5}{subsection.8.4}\protected@file@percent }
-\@writefile{toc}{\contentsline {subsection}{\numberline {8.5}Rendering}{5}{subsection.8.5}\protected@file@percent }
-\@writefile{toc}{\contentsline {subsection}{\numberline {8.6}Moving to the GPU}{5}{subsection.8.6}\protected@file@percent }
-\@writefile{toc}{\contentsline {section}{Acknowledgments}{5}{section*.8}\protected@file@percent }
-\@writefile{toc}{\contentsline {section}{References}{5}{section*.10}\protected@file@percent }
-\@writefile{toc}{\contentsline {section}{\numberline {A}Supplementary development}{5}{appendix.A}\protected@file@percent }
-\@writefile{toc}{\contentsline {subsection}{\numberline {A.1}OBJ Reader}{5}{subsection.A.1}\protected@file@percent }
-\@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces Supported OBJ Data Types\relax }}{5}{table.caption.11}\protected@file@percent }
-\newlabel{tab:objdatatypes}{{1}{5}{Supported OBJ Data Types\relax }{table.caption.11}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {7.2}Bending Constraint Improvements}{6}{subsection.7.2}\protected@file@percent }
+\@writefile{toc}{\contentsline {subsection}{\numberline {7.3}More and better customization}{6}{subsection.7.3}\protected@file@percent }
+\newlabel{section:futureCustomization}{{7.3}{6}{More and better customization}{subsection.7.3}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {7.4}Better customizability}{6}{subsection.7.4}\protected@file@percent }
+\@writefile{toc}{\contentsline {subsection}{\numberline {7.5}Sequence for randomizing hair positions}{6}{subsection.7.5}\protected@file@percent }
+\newlabel{section:futureHalton}{{7.5}{6}{Sequence for randomizing hair positions}{subsection.7.5}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {7.6}Rendering}{6}{subsection.7.6}\protected@file@percent }
+\@writefile{toc}{\contentsline {subsection}{\numberline {7.7}Moving to the GPU}{6}{subsection.7.7}\protected@file@percent }
+\@writefile{toc}{\contentsline {section}{Acknowledgments}{6}{section*.8}\protected@file@percent }
+\@writefile{toc}{\contentsline {section}{References}{6}{section*.10}\protected@file@percent }
+\@writefile{toc}{\contentsline {section}{\numberline {A}Constraint Projection}{6}{appendix.A}\protected@file@percent }
+\newlabel{appendix:ConstraintProjection}{{A}{6}{Constraint Projection}{appendix.A}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {B}Supplementary development}{6}{appendix.B}\protected@file@percent }
+\@writefile{toc}{\contentsline {subsection}{\numberline {B.1}OBJ Reader}{6}{subsection.B.1}\protected@file@percent }
+\newlabel{section:appendixOBJ}{{B.1}{6}{OBJ Reader}{subsection.B.1}{}}
 \newlabel{tocindent-1}{0pt}
 \newlabel{tocindent0}{0pt}
 \newlabel{tocindent1}{6.95pt}
-\newlabel{tocindent2}{13.79999pt}
+\newlabel{tocindent2}{12.72998pt}
 \newlabel{tocindent3}{0pt}
-\@writefile{toc}{\contentsline {subsection}{\numberline {A.2}Recording the simulation on-the-fly}{6}{subsection.A.2}\protected@file@percent }
-\newlabel{TotPages}{{6}{6}{}{page.6}{}}
+\@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces Supported OBJ Data Types\relax }}{7}{table.caption.11}\protected@file@percent }
+\newlabel{tab:objdatatypes}{{1}{7}{Supported OBJ Data Types\relax }{table.caption.11}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {B.2}Recording the simulation on-the-fly}{7}{subsection.B.2}\protected@file@percent }
+\newlabel{TotPages}{{7}{7}{}{page.7}{}}
diff --git a/docs/documentation.log b/docs/documentation.log
index 81b3d63222ff2ae8cb74bd6e9021e25a713c8ca9..436d784f16f00a57e0090bf3555f69244ef6e655 100644
--- a/docs/documentation.log
+++ b/docs/documentation.log
@@ -1,4 +1,4 @@
-This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) (preloaded format=pdflatex 2020.12.8)  9 DEC 2020 17:41
+This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) (preloaded format=pdflatex 2020.12.8)  9 DEC 2020 22:42
 entering extended mode
  restricted \write18 enabled.
  %&-line parsing enabled.
@@ -740,8 +740,8 @@ LaTeX Info: Redefining \smaller on input line 151.
 \algocf@algoframe=\box59
 \algocf@algobox=\box60
 )
-Package hyperref Info: Option `colorlinks' set `true' on input line 25.
-Package hyperref Info: Option `pdfdisplaydoctitle' set `true' on input line 25.
+Package hyperref Info: Option `colorlinks' set `true' on input line 27.
+Package hyperref Info: Option `pdfdisplaydoctitle' set `true' on input line 27.
 
 \c@theorem=\count303
 
@@ -759,107 +759,107 @@ File: l3backend-pdfmode.def 2020-02-03 L3 backend support: PDF mode
 (./documentation.aux)
 \openout1 = `documentation.aux'.
 
-LaTeX Font Info:    Checking defaults for OML/nxlmi/m/it on input line 25.
+LaTeX Font Info:    Checking defaults for OML/nxlmi/m/it on input line 27.
 LaTeX Font Info:    Trying to load font information for OML+nxlmi on input line
- 25.
+ 27.
 
 (/usr/share/texlive/texmf-dist/tex/latex/newtx/omlnxlmi.fd
 File: omlnxlmi.fd 2013/11/19 Fontinst v1.933 font definitions for OML/nxlmi.
 )
-LaTeX Font Info:    ... okay on input line 25.
-LaTeX Font Info:    Checking defaults for OMS/cmsy/m/n on input line 25.
-LaTeX Font Info:    ... okay on input line 25.
-LaTeX Font Info:    Checking defaults for OT1/cmr/m/n on input line 25.
-LaTeX Font Info:    ... okay on input line 25.
-LaTeX Font Info:    Checking defaults for T1/cmr/m/n on input line 25.
-LaTeX Font Info:    ... okay on input line 25.
-LaTeX Font Info:    Checking defaults for TS1/cmr/m/n on input line 25.
-LaTeX Font Info:    ... okay on input line 25.
-LaTeX Font Info:    Checking defaults for OMX/cmex/m/n on input line 25.
-LaTeX Font Info:    ... okay on input line 25.
-LaTeX Font Info:    Checking defaults for U/ntxexa/m/n on input line 25.
+LaTeX Font Info:    ... okay on input line 27.
+LaTeX Font Info:    Checking defaults for OMS/cmsy/m/n on input line 27.
+LaTeX Font Info:    ... okay on input line 27.
+LaTeX Font Info:    Checking defaults for OT1/cmr/m/n on input line 27.
+LaTeX Font Info:    ... okay on input line 27.
+LaTeX Font Info:    Checking defaults for T1/cmr/m/n on input line 27.
+LaTeX Font Info:    ... okay on input line 27.
+LaTeX Font Info:    Checking defaults for TS1/cmr/m/n on input line 27.
+LaTeX Font Info:    ... okay on input line 27.
+LaTeX Font Info:    Checking defaults for OMX/cmex/m/n on input line 27.
+LaTeX Font Info:    ... okay on input line 27.
+LaTeX Font Info:    Checking defaults for U/ntxexa/m/n on input line 27.
 LaTeX Font Info:    Trying to load font information for U+ntxexa on input line 
-25.
+27.
 
 (/usr/share/texlive/texmf-dist/tex/latex/newtx/untxexa.fd
 File: untxexa.fd 2012/04/16 Fontinst v1.933 font definitions for U/ntxexa.
 )
-LaTeX Font Info:    ... okay on input line 25.
-LaTeX Font Info:    Checking defaults for PD1/pdf/m/n on input line 25.
-LaTeX Font Info:    ... okay on input line 25.
-LaTeX Font Info:    Checking defaults for PU/pdf/m/n on input line 25.
-LaTeX Font Info:    ... okay on input line 25.
-LaTeX Font Info:    Checking defaults for LMS/ntxsy/m/n on input line 25.
+LaTeX Font Info:    ... okay on input line 27.
+LaTeX Font Info:    Checking defaults for PD1/pdf/m/n on input line 27.
+LaTeX Font Info:    ... okay on input line 27.
+LaTeX Font Info:    Checking defaults for PU/pdf/m/n on input line 27.
+LaTeX Font Info:    ... okay on input line 27.
+LaTeX Font Info:    Checking defaults for LMS/ntxsy/m/n on input line 27.
 LaTeX Font Info:    Trying to load font information for LMS+ntxsy on input line
- 25.
+ 27.
 
 (/usr/share/texlive/texmf-dist/tex/latex/newtx/lmsntxsy.fd
 File: lmsntxsy.fd 2016/07/02 Fontinst v1.933 font definitions for LMS/ntxsy.
 )
-LaTeX Font Info:    ... okay on input line 25.
-LaTeX Font Info:    Checking defaults for LMX/ntxexx/m/n on input line 25.
+LaTeX Font Info:    ... okay on input line 27.
+LaTeX Font Info:    Checking defaults for LMX/ntxexx/m/n on input line 27.
 LaTeX Font Info:    Trying to load font information for LMX+ntxexx on input lin
-e 25.
+e 27.
 
 (/usr/share/texlive/texmf-dist/tex/latex/newtx/lmxntxexx.fd
 File: lmxntxexx.fd 2016/07/03 Fontinst v1.933 font definitions for LMX/ntxexx.
 )
-LaTeX Font Info:    ... okay on input line 25.
+LaTeX Font Info:    ... okay on input line 27.
 LaTeX Font Info:    Font shape `T1/LinuxLibertineT-TLF/m/n' will be
-(Font)              scaled to size 8.0pt on input line 25.
+(Font)              scaled to size 8.0pt on input line 27.
 LaTeX Font Info:    Trying to load font information for OT1+LinuxLibertineT-TLF
- on input line 25.
+ on input line 27.
 
 (/usr/share/texlive/texmf-dist/tex/latex/libertine/OT1LinuxLibertineT-TLF.fd
 File: OT1LinuxLibertineT-TLF.fd 2017/03/20 (autoinst) Font definitions for OT1/
 LinuxLibertineT-TLF.
 )
 LaTeX Font Info:    Font shape `OT1/LinuxLibertineT-TLF/m/n' will be
-(Font)              scaled to size 8.0pt on input line 25.
+(Font)              scaled to size 8.0pt on input line 27.
 <<ot1.cmap>>
 LaTeX Font Info:    Font shape `OT1/LinuxLibertineT-TLF/m/n' will be
-(Font)              scaled to size 6.2pt on input line 25.
+(Font)              scaled to size 6.2pt on input line 27.
 LaTeX Font Info:    Font shape `OT1/LinuxLibertineT-TLF/m/n' will be
-(Font)              scaled to size 5.5pt on input line 25.
+(Font)              scaled to size 5.5pt on input line 27.
 <<oml.cmap>>
-LaTeX Font Info:    Trying to load font information for U+msa on input line 25.
+LaTeX Font Info:    Trying to load font information for U+msa on input line 27.
 
 
 (/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd
 File: umsa.fd 2013/01/14 v3.01 AMS symbols A
 )
-LaTeX Font Info:    Trying to load font information for U+msb on input line 25.
+LaTeX Font Info:    Trying to load font information for U+msb on input line 27.
 
 
 (/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd
 File: umsb.fd 2013/01/14 v3.01 AMS symbols B
 )
 LaTeX Font Info:    Trying to load font information for U+ntxmia on input line 
-25.
+27.
 
 (/usr/share/texlive/texmf-dist/tex/latex/newtx/untxmia.fd
 File: untxmia.fd 2018/04/14 Fontinst v1.933 font definitions for U/ntxmia.
 )
 LaTeX Font Info:    Trying to load font information for U+ntxsym on input line 
-25.
+27.
 
 (/usr/share/texlive/texmf-dist/tex/latex/newtx/untxsym.fd
 File: untxsym.fd 2015/03/20 Fontinst v1.933 font definitions for U/ntxsym.
 )
 LaTeX Font Info:    Trying to load font information for U+ntxsyc on input line 
-25.
+27.
 
 (/usr/share/texlive/texmf-dist/tex/latex/newtx/untxsyc.fd
 File: untxsyc.fd 2012/04/12 Fontinst v1.933 font definitions for U/ntxsyc.
 )
-LaTeX Info: Redefining \microtypecontext on input line 25.
+LaTeX Info: Redefining \microtypecontext on input line 27.
 Package microtype Info: Generating PDF output.
 Package microtype Info: Character protrusion enabled (level 2).
 Package microtype Info: Using default protrusion set `alltext'.
 Package microtype Info: Automatic font expansion enabled (level 2),
 (microtype)             stretch: 20, shrink: 20, step: 1, non-selected.
 Package microtype Info: Using default expansion set `basictext'.
-LaTeX Info: Redefining \showhyphens on input line 25.
+LaTeX Info: Redefining \showhyphens on input line 27.
 Package microtype Info: No adjustment of tracking.
 Package microtype Info: No adjustment of interword spacing.
 Package microtype Info: No adjustment of character kerning.
@@ -870,7 +870,7 @@ Package microtype Info: Loading generic protrusion settings for font family
 
 ABD: EveryShipout initializing macros
 \AtBeginShipoutBox=\box62
-Package hyperref Info: Link coloring ON on input line 25.
+Package hyperref Info: Link coloring ON on input line 27.
 
 (/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
 Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section
@@ -880,9 +880,9 @@ Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO)
 )
 \c@section@level=\count305
 )
-LaTeX Info: Redefining \ref on input line 25.
-LaTeX Info: Redefining \pageref on input line 25.
-LaTeX Info: Redefining \nameref on input line 25.
+LaTeX Info: Redefining \ref on input line 27.
+LaTeX Info: Redefining \pageref on input line 27.
+LaTeX Info: Redefining \nameref on input line 27.
 
 (./documentation.out) (./documentation.out)
 \@outlinefile=\write4
@@ -963,38 +963,38 @@ Package caption Info: End \AtBeginDocument code.
 
 Excluding 'CCSXML' comment.
 LaTeX Font Info:    Font shape `T1/LinuxLibertineT-TLF/m/n' will be
-(Font)              scaled to size 20.74pt on input line 113.
+(Font)              scaled to size 20.74pt on input line 120.
 LaTeX Font Info:    Font shape `T1/LinuxLibertineT-TLF/b/n' will be
-(Font)              scaled to size 20.74pt on input line 113.
+(Font)              scaled to size 20.74pt on input line 120.
 LaTeX Font Info:    Font shape `T1/LinuxLibertineT-TLF/b/n' will be
-(Font)              scaled to size 10.0pt on input line 113.
+(Font)              scaled to size 10.0pt on input line 120.
 LaTeX Font Info:    Font shape `T1/LinuxLibertineT-TLF/b/n' will be
-(Font)              scaled to size 14.4pt on input line 113.
+(Font)              scaled to size 14.4pt on input line 120.
 LaTeX Font Info:    Font shape `T1/LinuxLibertineT-TLF/m/n' will be
-(Font)              scaled to size 14.4pt on input line 113.
+(Font)              scaled to size 14.4pt on input line 120.
 LaTeX Font Info:    Font shape `T1/LinuxLibertineT-TLF/m/n' will be
-(Font)              scaled to size 12.0pt on input line 113.
+(Font)              scaled to size 12.0pt on input line 120.
 LaTeX Font Info:    Trying to load font information for T1+LinuxBiolinumT-TLF o
-n input line 113.
+n input line 120.
 
 (/usr/share/texlive/texmf-dist/tex/latex/libertine/T1LinuxBiolinumT-TLF.fd
 File: T1LinuxBiolinumT-TLF.fd 2017/03/20 (autoinst) Font definitions for T1/Lin
 uxBiolinumT-TLF.
 )
 LaTeX Font Info:    Font shape `T1/LinuxBiolinumT-TLF/m/n' will be
-(Font)              scaled to size 10.0pt on input line 113.
+(Font)              scaled to size 10.0pt on input line 120.
 Package microtype Info: Loading generic protrusion settings for font family
 (microtype)             `LinuxBiolinumT-TLF' (encoding: T1).
 (microtype)             For optimal results, create family-specific settings.
 (microtype)             See the microtype manual for details.
 LaTeX Font Info:    Font shape `OT1/LinuxLibertineT-TLF/m/n' will be
-(Font)              scaled to size 10.0pt on input line 113.
+(Font)              scaled to size 10.0pt on input line 120.
 Package microtype Info: Loading generic protrusion settings for font family
 (microtype)             `LinuxLibertineT-TLF' (encoding: OT1).
 (microtype)             For optimal results, create family-specific settings.
 (microtype)             See the microtype manual for details.
 LaTeX Font Info:    Font shape `OT1/LinuxLibertineT-TLF/m/n' will be
-(Font)              scaled to size 7.3pt on input line 113.
+(Font)              scaled to size 7.3pt on input line 120.
 
 (/usr/share/texlive/texmf-dist/tex/latex/microtype/mt-msa.cfg
 File: mt-msa.cfg 2006/02/04 v1.1 microtype config. file: AMS symbols (a) (RS)
@@ -1002,53 +1002,56 @@ File: mt-msa.cfg 2006/02/04 v1.1 microtype config. file: AMS symbols (a) (RS)
 (/usr/share/texlive/texmf-dist/tex/latex/microtype/mt-msb.cfg
 File: mt-msb.cfg 2005/06/01 v1.0 microtype config. file: AMS symbols (b) (RS)
 )
-<teaser.png, id=123, 602.25pt x 401.5pt>
+<teaser.png, id=139, 602.25pt x 401.5pt>
 File: teaser.png Graphic file (type png)
 <use teaser.png>
-Package pdftex.def Info: teaser.png  used on input line 113.
+Package pdftex.def Info: teaser.png  used on input line 120.
 (pdftex.def)             Requested size: 505.89pt x 337.27606pt.
 LaTeX Font Info:    Font shape `T1/LinuxLibertineT-TLF/b/n' will be
-(Font)              scaled to size 12.0pt on input line 113.
+(Font)              scaled to size 12.0pt on input line 120.
 LaTeX Font Info:    Font shape `T1/LinuxLibertineT-TLF/m/n' will be
-(Font)              scaled to size 7.3pt on input line 113.
+(Font)              scaled to size 7.3pt on input line 120.
 LaTeX Font Info:    Font shape `T1/LinuxLibertineT-TLF/m/n' will be
-(Font)              scaled to size 6.2pt on input line 113.
+(Font)              scaled to size 6.2pt on input line 120.
 LaTeX Font Info:    Font shape `T1/LinuxBiolinumT-TLF/m/n' will be
-(Font)              scaled to size 8.0pt on input line 113.
+(Font)              scaled to size 8.0pt on input line 120.
 LaTeX Font Info:    Font shape `T1/LinuxLibertineT-TLF/b/it' will be
-(Font)              scaled to size 10.0pt on input line 113.
+(Font)              scaled to size 10.0pt on input line 120.
 LaTeX Font Info:    Trying to load font information for TS1+LinuxLibertineT-TLF
- on input line 113.
+ on input line 120.
 
 (/usr/share/texlive/texmf-dist/tex/latex/libertine/TS1LinuxLibertineT-TLF.fd
 File: TS1LinuxLibertineT-TLF.fd 2017/03/20 (autoinst) Font definitions for TS1/
 LinuxLibertineT-TLF.
 )
 LaTeX Font Info:    Font shape `TS1/LinuxLibertineT-TLF/m/n' will be
-(Font)              scaled to size 10.0pt on input line 113.
+(Font)              scaled to size 10.0pt on input line 120.
 Package microtype Info: Loading generic protrusion settings for font family
 (microtype)             `LinuxLibertineT-TLF' (encoding: TS1).
 (microtype)             For optimal results, create family-specific settings.
 (microtype)             See the microtype manual for details.
 LaTeX Font Info:    Font shape `T1/LinuxLibertineT-TLF/m/it' will be
-(Font)              scaled to size 10.0pt on input line 113.
+(Font)              scaled to size 10.0pt on input line 120.
 
-Overfull \hbox (5.12202pt too wide) in paragraph at lines 113--113
+Overfull \hbox (5.12202pt too wide) in paragraph at lines 120--120
  []\T1/LinuxLibertineT-TLF/b/it/10 Keywords: \T1/LinuxLibertineT-TLF/m/n/10 (-2
 0) hair sim-u-la-tion, po-si-tion based dy-nam-ics, OpenGL 
  []
 
-[1.1{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}
+
+Underfull \vbox (badness 10000) has occurred while \output is active []
+
+ [1.1{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}
 
  <./teaser.png>]
 LaTeX Font Info:    Font shape `OT1/LinuxLibertineT-TLF/sb/n' will be
-(Font)              scaled to size 10.0pt on input line 215.
+(Font)              scaled to size 10.0pt on input line 222.
 LaTeX Font Info:    Font shape `OT1/LinuxLibertineT-TLF/sb/n' will be
-(Font)              scaled to size 7.3pt on input line 215.
+(Font)              scaled to size 7.3pt on input line 222.
 LaTeX Font Info:    Font shape `OT1/LinuxLibertineT-TLF/sb/n' will be
-(Font)              scaled to size 5.5pt on input line 215.
+(Font)              scaled to size 5.5pt on input line 222.
 
-Overfull \hbox (14.9743pt too wide) in paragraph at lines 217--222
+Overfull \hbox (14.9743pt too wide) in paragraph at lines 224--229
 \T1/LinuxLibertineT-TLF/m/n/10 (-20) tion $\OML/nxlmi/m/it/10 C[] \OT1/LinuxLib
 ertineT-TLF/m/n/10 (-20) : \U/ntxsym/m/n/10 R[] \LMS/ntxsy/m/n/10 7! \U/ntxsym/
 m/n/10 R$\T1/LinuxLibertineT-TLF/m/n/10 (-20) . It op-er-ates on a set of in-di
@@ -1057,7 +1060,7 @@ xlmi/m/it/10 ; i[] \LMS/ntxsy/m/n/10 2
  []
 
 
-Overfull \hbox (20.05922pt too wide) in paragraph at lines 223--228
+Overfull \hbox (20.05922pt too wide) in paragraph at lines 230--235
 []\T1/LinuxLibertineT-TLF/m/n/10 (-20) Constraint $\OML/nxlmi/m/it/10 c$ \T1/Li
 nuxLibertineT-TLF/m/n/10 (-20) with type \T1/LinuxLibertineT-TLF/m/it/10 (-20) 
 equal-ity \T1/LinuxLibertineT-TLF/m/n/10 (-20) is sat-is-fied if $\OML/nxlmi/m/
@@ -1066,54 +1069,49 @@ it/10 C[]\LMS/ntxsy/m/n/10 
  []
 
 
-Overfull \hbox (12.99283pt too wide) in paragraph at lines 223--228
+Overfull \hbox (12.99283pt too wide) in paragraph at lines 230--235
 \OT1/LinuxLibertineT-TLF/m/n/10 (-20) 0$\T1/LinuxLibertineT-TLF/m/n/10 (-20) . 
 If its type is \T1/LinuxLibertineT-TLF/m/it/10 (-20) in-equal-ity\T1/LinuxLiber
 tineT-TLF/m/n/10 (-20) , then it is sat-is-fied if $\OML/nxlmi/m/it/10 C[]\LMS/
 ntxsy/m/n/10 �[][]\OML/nxlmi/m/it/10 ; [] ; [][]\LMS/ntxsy/m/n/10 � ^^U
  []
 
-
-Underfull \vbox (badness 10000) has occurred while \output is active []
-
- [2.2]
 LaTeX Font Info:    Trying to load font information for T1+zi4 on input line 25
-3.
-
+9.
 (/usr/share/texlive/texmf-dist/tex/latex/inconsolata/t1zi4.fd
 File: t1zi4.fd 2018/01/14 T1/zi4 (Inconsolata)
 )
 LaTeX Font Info:    Font shape `T1/zi4/m/n' will be
-(Font)              scaled to size 10.0pt on input line 253.
+(Font)              scaled to size 10.0pt on input line 259.
 Package microtype Info: Loading generic protrusion settings for font family
 (microtype)             `zi4' (encoding: T1).
 (microtype)             For optimal results, create family-specific settings.
 (microtype)             See the microtype manual for details.
 LaTeX Font Info:    Font shape `T1/zi4/m/n' will be
-(Font)              scaled to size 7.0pt on input line 253.
+(Font)              scaled to size 7.0pt on input line 259.
 
-Overfull \hbox (18.40462pt too wide) in paragraph at lines 279--279
+Overfull \hbox (18.40462pt too wide) in paragraph at lines 285--285
 [][]|[]\T1/zi4/m/n/10 projectConstraints($\OML/nxlmi/m/it/10 C[]; [] ; C[]; par
 ticles$\T1/zi4/m/n/10 ) 
  []
 
 LaTeX Font Info:    Font shape `T1/LinuxLibertineT-TLF/m/n' will be
-(Font)              scaled to size 7.0pt on input line 279.
+(Font)              scaled to size 7.0pt on input line 285.
 LaTeX Font Info:    Font shape `T1/zi4/m/n' will be
-(Font)              scaled to size 8.0pt on input line 284.
-
+(Font)              scaled to size 8.0pt on input line 290.
+[2.2]
 Underfull \vbox (badness 10000) has occurred while \output is active []
 
  [3.3]
-[4.4] Processing 'acks' comment.
-\openout3 = `comment.cut'.
-
- Comment 'acks' writing to comment.cut.
-Straight input of comment.cut. (./comment.cut)
+[4.4]
 Underfull \vbox (badness 10000) has occurred while \output is active []
 
+ [5.5]
+Processing 'acks' comment.
+\openout3 = `comment.cut'.
 
-(./documentation.bbl
+ Comment 'acks' writing to comment.cut.
+Straight input of comment.cut. (./comment.cut) (./documentation.bbl
 LaTeX Font Info:    Font shape `T1/LinuxLibertineT-TLF/m/it' will be
 (Font)              scaled to size 8.0pt on input line 49.
 LaTeX Info: Redefining \tempurl on input line 75.
@@ -1126,36 +1124,40 @@ Underfull \hbox (badness 10000) in paragraph at lines 111--118
 / MarkusRapp -[] MasterThesis -[]
  []
 
-) [5.5]
-Overfull \hbox (11.38634pt too wide) in paragraph at lines 616--619
+) [6.6]
+Overfull \hbox (11.38634pt too wide) in paragraph at lines 737--740
 \T1/LinuxLibertineT-TLF/m/n/10 (-20) at 24 FPS, with the nam-ing con-ven-tion r
 en-derXXXX[.bmp/.png],
  []
 
 
-Overfull \hbox (3.58836pt too wide) in paragraph at lines 621--625
+Overfull \hbox (3.58836pt too wide) in paragraph at lines 742--746
 \T1/zi4/m/n/10 make_video.sh \T1/LinuxLibertineT-TLF/m/n/10 (-20) script to as-
 sem-ble the \T1/zi4/m/n/10 output.mp4 \T1/LinuxLibertineT-TLF/m/n/10 (-20) and 
 delete
  []
 
-[6.6]
-Package atveryend Info: Empty hook `BeforeClearDocument' on input line 627.
-Package atveryend Info: Empty hook `AfterLastShipout' on input line 627.
+
+Overfull \vbox (2.03061pt too high) has occurred while \output is active []
+
+
+[7.7]
+Package atveryend Info: Empty hook `BeforeClearDocument' on input line 748.
+Package atveryend Info: Empty hook `AfterLastShipout' on input line 748.
  (./documentation.aux)
-Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 627.
-Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 627.
+Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 748.
+Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 748.
 Package rerunfilecheck Info: File `documentation.out' has not changed.
-(rerunfilecheck)             Checksum: 5358B6976FE170B963D3406982B99A3E;5151.
+(rerunfilecheck)             Checksum: 76188F874CEF96D76FCC9FE7767FEB40;5679.
  ) 
 Here is how much of TeX's memory you used:
- 20377 strings out of 481239
- 308691 string characters out of 5920377
- 618628 words of memory out of 5000000
- 34670 multiletter control sequences out of 15000+600000
- 697072 words of font info for 334 fonts, out of 8000000 for 9000
+ 20390 strings out of 481239
+ 308938 string characters out of 5920377
+ 619798 words of memory out of 5000000
+ 34681 multiletter control sequences out of 15000+600000
+ 696799 words of font info for 332 fonts, out of 8000000 for 9000
  1302 hyphenation exceptions out of 8191
- 63i,19n,100p,804b,588s stack positions out of 5000i,500n,10000p,200000b,80000s
+ 63i,18n,100p,804b,584s stack positions out of 5000i,500n,10000p,200000b,80000s
 {/usr/share/texlive/texmf-dist/fonts/enc/dvips/libertine/lbtn_fygcup.enc}{/us
 r/share/texlive/texmf-dist/fonts/enc/dvips/inconsolata/i4-t1-4.enc}{/usr/share/
 texlive/texmf-dist/fonts/enc/dvips/libertine/lbtn_oexx6f.enc}{/usr/share/texliv
@@ -1180,10 +1182,10 @@ bertineTI.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/libertine/LinLi
 bertineTZ.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/newtx/txmiaX.pf
 b></usr/share/texlive/texmf-dist/fonts/type1/public/txfonts/txsyb.pfb></usr/sha
 re/texlive/texmf-dist/fonts/type1/public/newtx/txsys.pfb>
-Output written on documentation.pdf (6 pages, 579210 bytes).
+Output written on documentation.pdf (7 pages, 591369 bytes).
 PDF statistics:
- 368 PDF objects out of 1000 (max. 8388607)
- 317 compressed objects within 4 object streams
- 85 named destinations out of 1000 (max. 500000)
- 41726 words of extra memory for PDF output out of 42996 (max. 10000000)
+ 412 PDF objects out of 1000 (max. 8388607)
+ 360 compressed objects within 4 object streams
+ 90 named destinations out of 1000 (max. 500000)
+ 41758 words of extra memory for PDF output out of 42996 (max. 10000000)
 
diff --git a/docs/documentation.out b/docs/documentation.out
index 9b47192e5991a75b01afb3a59a973eb4f82016a8..d650ec07465e11fdbc5c0eec5c51c003f26fc83e 100644
--- a/docs/documentation.out
+++ b/docs/documentation.out
@@ -10,20 +10,24 @@
 \BOOKMARK [2][-]{subsection.3.3}{\376\377\0003\000.\0003\000\040\000D\000i\000s\000t\000a\000n\000c\000e\000\040\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t}{section.3}% 10
 \BOOKMARK [2][-]{subsection.3.4}{\376\377\0003\000.\0004\000\040\000B\000e\000n\000d\000i\000n\000g\000\040\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t}{section.3}% 11
 \BOOKMARK [2][-]{subsection.3.5}{\376\377\0003\000.\0005\000\040\000C\000o\000l\000l\000i\000s\000i\000o\000n\000\040\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t}{section.3}% 12
-\BOOKMARK [1][-]{section.4}{\376\377\0004\000\040\000I\000m\000p\000l\000e\000m\000e\000n\000t\000a\000t\000i\000o\000n}{}% 13
-\BOOKMARK [2][-]{subsection.4.1}{\376\377\0004\000.\0001\000\040\000D\000a\000t\000a\000:}{section.4}% 14
-\BOOKMARK [1][-]{section.5}{\376\377\0005\000\040\000P\000u\000t\000t\000i\000n\000g\000\040\000H\000a\000i\000r\000\040\000o\000n\000\040\000t\000h\000e\000\040\000H\000e\000a\000d}{}% 15
-\BOOKMARK [1][-]{section.6}{\376\377\0006\000\040\000R\000e\000s\000u\000l\000t\000s}{}% 16
-\BOOKMARK [1][-]{section.7}{\376\377\0007\000\040\000C\000o\000n\000c\000l\000u\000s\000i\000o\000n}{}% 17
-\BOOKMARK [1][-]{section.8}{\376\377\0008\000\040\000F\000u\000t\000u\000r\000e\000\040\000W\000o\000r\000k}{}% 18
-\BOOKMARK [2][-]{subsection.8.1}{\376\377\0008\000.\0001\000\040\000H\000a\000i\000r\000-\000h\000a\000i\000r\000\040\000c\000o\000l\000l\000i\000s\000i\000o\000n\000s}{section.8}% 19
-\BOOKMARK [2][-]{subsection.8.2}{\376\377\0008\000.\0002\000\040\000R\000e\000f\000i\000n\000e\000m\000e\000n\000t\000\040\000a\000n\000d\000\040\000p\000r\000o\000p\000e\000r\000\040\000c\000u\000s\000t\000o\000m\000i\000z\000a\000b\000i\000l\000i\000t\000y\000\040\000o\000f\000\040\000t\000h\000e\000\040\000p\000r\000o\000p\000a\000g\000a\000t\000i\000o\000n\000\040\000o\000f\000\040\000h\000a\000i\000r\000\040\000s\000t\000r\000a\000n\000d\000s\000\040\000o\000n\000\040\000t\000h\000e\000\040\000h\000e\000a\000d\000\040\000o\000b\000j\000e\000c\000t\000.}{section.8}% 20
-\BOOKMARK [2][-]{subsection.8.3}{\376\377\0008\000.\0003\000\040\000B\000e\000t\000t\000e\000r\000\040\000c\000u\000s\000t\000o\000m\000i\000z\000a\000b\000i\000l\000i\000t\000y}{section.8}% 21
-\BOOKMARK [2][-]{subsection.8.4}{\376\377\0008\000.\0004\000\040\000S\000e\000q\000u\000e\000n\000c\000e\000\040\000f\000o\000r\000\040\000r\000a\000n\000d\000o\000m\000i\000z\000i\000n\000g\000\040\000h\000a\000i\000r\000\040\000p\000o\000s\000i\000t\000i\000o\000n\000s}{section.8}% 22
-\BOOKMARK [2][-]{subsection.8.5}{\376\377\0008\000.\0005\000\040\000R\000e\000n\000d\000e\000r\000i\000n\000g}{section.8}% 23
-\BOOKMARK [2][-]{subsection.8.6}{\376\377\0008\000.\0006\000\040\000M\000o\000v\000i\000n\000g\000\040\000t\000o\000\040\000t\000h\000e\000\040\000G\000P\000U}{section.8}% 24
-\BOOKMARK [1][-]{section*.8}{\376\377\000A\000c\000k\000n\000o\000w\000l\000e\000d\000g\000m\000e\000n\000t\000s}{}% 25
-\BOOKMARK [1][-]{section*.10}{\376\377\000R\000e\000f\000e\000r\000e\000n\000c\000e\000s}{}% 26
-\BOOKMARK [1][-]{appendix.A}{\376\377\000A\000\040\000S\000u\000p\000p\000l\000e\000m\000e\000n\000t\000a\000r\000y\000\040\000d\000e\000v\000e\000l\000o\000p\000m\000e\000n\000t}{}% 27
-\BOOKMARK [2][-]{subsection.A.1}{\376\377\000A\000.\0001\000\040\000O\000B\000J\000\040\000R\000e\000a\000d\000e\000r}{appendix.A}% 28
-\BOOKMARK [2][-]{subsection.A.2}{\376\377\000A\000.\0002\000\040\000R\000e\000c\000o\000r\000d\000i\000n\000g\000\040\000t\000h\000e\000\040\000s\000i\000m\000u\000l\000a\000t\000i\000o\000n\000\040\000o\000n\000-\000t\000h\000e\000-\000f\000l\000y}{appendix.A}% 29
+\BOOKMARK [2][-]{subsection.3.6}{\376\377\0003\000.\0006\000\040\000P\000o\000s\000i\000t\000i\000o\000n\000\040\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t}{section.3}% 13
+\BOOKMARK [1][-]{section.4}{\376\377\0004\000\040\000I\000m\000p\000l\000e\000m\000e\000n\000t\000a\000t\000i\000o\000n}{}% 14
+\BOOKMARK [2][-]{subsection.4.1}{\376\377\0004\000.\0001\000\040\000D\000a\000t\000a\000s\000t\000r\000u\000c\000t\000u\000r\000e\000s}{section.4}% 15
+\BOOKMARK [2][-]{subsection.4.2}{\376\377\0004\000.\0002\000\040\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t\000s}{section.4}% 16
+\BOOKMARK [2][-]{subsection.4.3}{\376\377\0004\000.\0003\000\040\000P\000u\000t\000t\000i\000n\000g\000\040\000t\000h\000e\000\040\000H\000a\000i\000r\000\040\000i\000n\000\040\000t\000h\000e\000\040\000H\000a\000i\000r\000\040\000S\000i\000m\000u\000l\000a\000t\000i\000o\000n}{section.4}% 17
+\BOOKMARK [1][-]{section.5}{\376\377\0005\000\040\000R\000e\000s\000u\000l\000t\000s}{}% 18
+\BOOKMARK [1][-]{section.6}{\376\377\0006\000\040\000C\000o\000n\000c\000l\000u\000s\000i\000o\000n}{}% 19
+\BOOKMARK [1][-]{section.7}{\376\377\0007\000\040\000F\000u\000t\000u\000r\000e\000\040\000W\000o\000r\000k}{}% 20
+\BOOKMARK [2][-]{subsection.7.1}{\376\377\0007\000.\0001\000\040\000H\000a\000i\000r\000-\000h\000a\000i\000r\000\040\000C\000o\000l\000l\000i\000s\000i\000o\000n\000s}{section.7}% 21
+\BOOKMARK [2][-]{subsection.7.2}{\376\377\0007\000.\0002\000\040\000B\000e\000n\000d\000i\000n\000g\000\040\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t\000\040\000I\000m\000p\000r\000o\000v\000e\000m\000e\000n\000t\000s}{section.7}% 22
+\BOOKMARK [2][-]{subsection.7.3}{\376\377\0007\000.\0003\000\040\000M\000o\000r\000e\000\040\000a\000n\000d\000\040\000b\000e\000t\000t\000e\000r\000\040\000c\000u\000s\000t\000o\000m\000i\000z\000a\000t\000i\000o\000n}{section.7}% 23
+\BOOKMARK [2][-]{subsection.7.4}{\376\377\0007\000.\0004\000\040\000B\000e\000t\000t\000e\000r\000\040\000c\000u\000s\000t\000o\000m\000i\000z\000a\000b\000i\000l\000i\000t\000y}{section.7}% 24
+\BOOKMARK [2][-]{subsection.7.5}{\376\377\0007\000.\0005\000\040\000S\000e\000q\000u\000e\000n\000c\000e\000\040\000f\000o\000r\000\040\000r\000a\000n\000d\000o\000m\000i\000z\000i\000n\000g\000\040\000h\000a\000i\000r\000\040\000p\000o\000s\000i\000t\000i\000o\000n\000s}{section.7}% 25
+\BOOKMARK [2][-]{subsection.7.6}{\376\377\0007\000.\0006\000\040\000R\000e\000n\000d\000e\000r\000i\000n\000g}{section.7}% 26
+\BOOKMARK [2][-]{subsection.7.7}{\376\377\0007\000.\0007\000\040\000M\000o\000v\000i\000n\000g\000\040\000t\000o\000\040\000t\000h\000e\000\040\000G\000P\000U}{section.7}% 27
+\BOOKMARK [1][-]{section*.8}{\376\377\000A\000c\000k\000n\000o\000w\000l\000e\000d\000g\000m\000e\000n\000t\000s}{}% 28
+\BOOKMARK [1][-]{section*.10}{\376\377\000R\000e\000f\000e\000r\000e\000n\000c\000e\000s}{}% 29
+\BOOKMARK [1][-]{appendix.A}{\376\377\000A\000\040\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t\000\040\000P\000r\000o\000j\000e\000c\000t\000i\000o\000n}{}% 30
+\BOOKMARK [1][-]{appendix.B}{\376\377\000B\000\040\000S\000u\000p\000p\000l\000e\000m\000e\000n\000t\000a\000r\000y\000\040\000d\000e\000v\000e\000l\000o\000p\000m\000e\000n\000t}{}% 31
+\BOOKMARK [2][-]{subsection.B.1}{\376\377\000B\000.\0001\000\040\000O\000B\000J\000\040\000R\000e\000a\000d\000e\000r}{appendix.B}% 32
+\BOOKMARK [2][-]{subsection.B.2}{\376\377\000B\000.\0002\000\040\000R\000e\000c\000o\000r\000d\000i\000n\000g\000\040\000t\000h\000e\000\040\000s\000i\000m\000u\000l\000a\000t\000i\000o\000n\000\040\000o\000n\000-\000t\000h\000e\000-\000f\000l\000y}{appendix.B}% 33
diff --git a/docs/documentation.pdf b/docs/documentation.pdf
index c4604a345db26609965dc476ab63e3229d1ff029..6000b9ac7760cec229859bd9ae37cbe76b3c4e1b 100644
Binary files a/docs/documentation.pdf and b/docs/documentation.pdf differ
diff --git a/docs/documentation.tex b/docs/documentation.tex
index 271ed4f23d911f76f0a3149632bca7c84e9e6941..8a404440efeac33b1f0977c12e85cf7fcd872a7b 100644
--- a/docs/documentation.tex
+++ b/docs/documentation.tex
@@ -17,19 +17,23 @@
 \newcommand{\specialcell}[2][t]{%
   \begin{tabular}[#1]{@{}l@{}}#2\end{tabular}}
 
-  \usepackage[ruled, linesnumbered]{algorithm2e}
+\usepackage[ruled, linesnumbered]{algorithm2e}
 % \usepackage{algorithmic}
-  \renewcommand{\b}{\boldsymbol}
+\renewcommand{\b}{\boldsymbol}
+
+\setlength{\parskip}{0.2em}
 
 %% end of the preamble, start of the body of the document source.
 \begin{document}
+% don't allow lines to overflow their columns
+% \sloppy
 
 % \renewcommand{\@algocf@capt@plain}{top} % formerly {bottom}
 %%
 %% The "title" command has an optional parameter,
 %% allowing the author to define a "short title" to be used in page headers.
 \title[Hair Simulation]{Simulation of Curly Hair}
-\subtitle{5th semester Project Laboratory report}
+\subtitle{5th Semester Project Laboratory Report}
 
 %%
 %% The "author" command and its associated commands are used to define
@@ -41,19 +45,22 @@
 % \authornote{BSc student}
 \email{borcsok.barnabas@simonyi.bme.hu}
 \affiliation{%
-  \institution{Budapest University of Technology and Economics}
+  \institution{}%Budapest University of Technology and Economics}
   \city{}
   \country{}
 }
 
-\author{Dr. Szécsi László}
+\author{Dr. László Szécsi}
 \email{Advisor}
 \affiliation{%
-    \institution{Budapest University of Technology and Economics}
+    % \institution{Budapest University of Technology and Economics}
+    % \city{}
+    % \country{}
+    % \department[0]{Computer Graphics Group}
+    % \department[1]{Department of Control Engineering and Information Technology}
+    \institution{}
     \city{}
     \country{}
-    \department[0]{Computer Graphics Group}
-    \department[1]{Department of Control Engineering and Information Technology}
 }
 
 
@@ -209,7 +216,7 @@ implementation to eliminate the stretching in the presence of greater forces.
 \section{Position Based Simulation}
 
 \subsection{Algorithm Overview}
-
+\label{section:algorithmOverview}
 We model an $S$ hair strand as a chain of $N$ particles and a set of $M$
 constraints. Each particle $p \in [1,\ldots,N]$ has three atributes: mass ($m_p$), position
 ($\boldsymbol{x_p}$) and velocity ($\boldsymbol{v_p}$). 
@@ -228,7 +235,6 @@ strength of the constraint in a range from zero to one.
 
 Given these notations, the algorithm works in the following way:
 
-\TODO{decide about syntax: array of particles (OOP) or array of v, x and m?}
 \begin{algorithm}
     \caption{pseudo code for the PBD simulation}\label{alg:pbd}
 
@@ -317,8 +323,8 @@ used. In our case, simply applying a $k_s$ damping coefficient with value
 between $98\%$ to $99.9\%$ seemed to be a good enough solution.
 
 The initial constraints $C_1, \ldots, C_M$ are fixed throughout the simulation.
-In addition to these initial constraints, line \lineRef{13} generates additional
-$M_coll$ collisition constrants. These change from time step to time step. The
+In addition to these initial constraints, line \lineRefSingle{13} generates additional
+$M_{coll}$ collisition constrants. These change from time step to time step. The
 projection step in line \lineRefSingle{16} considers both the fixed and the
 collision constraints. Our implementation does not yet utilize this opportunity
 to dynamicaly generate collision constraints. This is one of the possible future
@@ -345,13 +351,29 @@ speeds up convergence significantly, because pressure waves can propagate
 throught the chain of particles in a single solver step, and effect which is
 dependent on the order in which constraints are solved. 
 
-In our hair simulation case, we solve the distance constraints putting the hair
-particles at the desired distance from each other starting at the scalp, and
-moving outwards from there.
-
-\TODO{do constraint projection appendix}
-
-\subsection{Distance Constraint}
+In our hair simulation case, we solve the distance constraints by putting the
+hair particles at the desired distance from each other starting at the scalp,
+and moving outwards from there.
+
+For projecting the constraints, we utilize the method proposed by
+\citet{MullerPBD}. The details of computing the desired delta positions are
+explained in the Appendix \ref{appendix:ConstraintProjection}
+\nameref{appendix:ConstraintProjection}. An example derivation is given in
+Section \ref{section:DistanceConstraint} \nameref{section:DistanceConstraint}.
+
+There are several ways of incorporating the stiffness parameter. The simplest
+-- and the way we chose to utilize -- is simply multiplying the $\Delta \b{p}$
+correction by the $k \in [0 \ldots 1]$ stiffness paramter. For multiple
+iteration loops of the solver, the effect of $k$ becomes non-linear. The
+reamining error after $n_s$ solver iterations is $\Delta \b{p}(1-k)^{n_s}$.
+\citet{MullerPBD} proposes to multiply the corrections not by $k$ directly, but
+by $k' = 1 - (1-k)^{1/n_s}$. With this transformation, the error becomes $\Delta
+\b{p}(1-k')^{n_s} = \Delta\b{p}(1-k)$, and thus linearly dependent on $k$ and
+independent of $n_s$. The resulting stiffness is still dependent on the time
+step of the simulation. Real time environments typically use fixed time steps in
+which case this dependency is not problematic.
+
+\subsection{Distance Constraint} \label{section:DistanceConstraint}
 One of the most basic constraint is the Distance Constraint, forcing two given
 particles $d$ distance apart. It is an \emph{equality} type constraint, meaning
 that it is satisfied if $C_{distance} = 0$.
@@ -359,26 +381,29 @@ that it is satisfied if $C_{distance} = 0$.
 \begin{equation} \label{eq:distance_constraint}
 C_{distance}(\b{p_1},\b{p_2}) = \lvert \b{p_1} - \b{p_2} \rvert - d
 \end{equation}
-
-Looking for $\Delta \b{p_1}$ and $\Delta \b{p_2}$ corrections such that 
-
+We are looking for $\Delta \b{p_1}$ and $\Delta \b{p_2}$ corrections such that 
 $$
-C_{distance}(\b{p_1}+\Delta \b{p_1}, \b{p_2}+\Delta \b{p_2}) = 0
+C_{distance}(\b{p_1}+\Delta \b{p_1}, \b{p_2}+\Delta \b{p_2}) = 0.
 $$
 
-, we follow the method proposed by \citet{MullerPBD} (see appendix \TODO{reference
-appendix}). The derivatives with respect to the points are 
+In finding the desired delta values to satisfy the constraint, we follow the
+method proposed by \citet{MullerPBD} \emph{(see Appendix
+ \nameref{appendix:ConstraintProjection})}.
 
+The derivatives with respect to the positions are
 \begin{align*}
     \nabla_{\b{p_1}} C_{distance}(\b{p_1}, \b{p_2}) &= \b{n} \\\\
     \nabla_{\b{p_2}} C_{distance}(\b{p_1}, \b{p_2}) &= -\b{n} \\\\
-    \b{n} = \frac{\b{p_1}-\b{p_2}}{\lvert \b{p_1}-\b{p_2} \rvert}
+    \b{n} = \frac{\b{p_1}-\b{p_2}}{\lvert \b{p_1}-\b{p_2} \rvert}.
 \end{align*}
-
 This makes the scaling factor 
-$s = \frac{\lvert \b{p_1} - \b{p_2}\rvert - d}{w_1 + w_2}$, and the final corrections
-are:
-
+\begin{align*}
+    s &= \frac{C(\b{p_1},\b{p_2})}
+{w_1 \lvert \nabla_{p_1}C(\b{p_1}, \b{p_2})\rvert ^ 2 + w_2 \lvert
+\nabla_{p_2}C(\b{p_1}, \b{p_2})\rvert ^ 2}\\\\
+    &= \frac{\lvert \b{p_1} - \b{p_2}\rvert - d}{w_1 + w_2}.
+\end{align*}
+The final corrections are:
 \begin{align*}
     \Delta \b{p_1} &= - \frac{w_1}{w_1 + w_2}
     (\lvert \b{p_1} - \b{p_2} \rvert - d) 
@@ -389,27 +414,46 @@ are:
     \frac{\b{p_1} - \b{p_2}}{\lvert \b{p_1} - \b{p_2} \rvert}
 \end{align*}
 
-\TODO{Add figure illustrating these calculations}
-
 Since the type of the Distance Constraint is \emph{equality}, the projection is
 straight forward: we move both by $\b{p_1}$ and $\b{p_2}$ by $\Delta \b{p_1}$ and
 $\Delta \b{p_2}$ respectively.
 
-\subsection{Bending Constraint}
-
+\subsection{Bending Constraint} \label{section:bendingConstraint}
+\citet{UmenhofferSimulation} uses the PBD technique to simulate cloth materials.
+They utilize the bending constraint to define the bending resistance of the
+material, giving it an extra stiffness. Their goal with the Bending Constraint
+is to keep an initial angle between adjacent triangles formed by particles. They
+offer the $C(p_1,p_2,p_3,p_4) = arccos(n_1 \cdot n_2) - \phi _0$ constraint,
+where $n_1$ and $n_2$ are the normal vectors of the triangles, and $p_2 - p_1$
+forms the common side of the two triangles. The $\phi _0$ angle is measured
+between the normals of the two triangles.
+
+At first, we thought about implementing something similar for our project, but
+then simplified the ``Bending Constraint'' for our use-case to essentially
+ distance constraints $C_{distance}(p_{i-1}, p_{i+i})~for~i\in[1 \ldots
+n_{particles}-1]$ of the same hair strand with the $d$ distance paramter of the
+being lower than the $d$ parameter of other $C_distance$ constraints keeping the
+particles a given $l_{seg}$ distance apart from each other, and assigning
+a lower $k_{bending}$ stiffness parameter.
+
+This idea could be further developed when considering other $(p_j,p_k)$ pairs
+and different distances between them.
+
+\TODO{add figure demonstrating the different bending constraint}
 
 \subsection{Collision Constraint}
-Collision constraint can appear and disappear in each simulation step
-(in \lineRef{12}{14} of Algorithm \ref{alg:pbd}). For a moving particle $\b{p}$
-and points $\b{q_1}, \b{q_2}, \b{q_3}$ forming a triangle with normal $\b{n}$,
-the collision constraint is
+One huge advantage of the position based approach is how simply collision
+handling can be realized. In each simulation step $M_{coll}$ collision
+constraints are generated in the \lineRef{12}{14} lines of Algorithm
+\ref{alg:pbd}. For a moving particle $\b{p}$ and points $\b{q_1}, \b{q_2},
+\b{q_3}$ forming a triangle with normal $\b{n}$, the collision constraint is
 
 $$
-C(\b{p}, \b{q_1}, \b{q_2}, \b{q_3}) = (\b{p}-\b{q_1})\cdot \b{n} \geq 0
+C_{collision}(\b{p}, \b{q_1}, \b{q_2}, \b{q_3}) = (\b{p}-\b{q_1})\cdot \b{n} \geq 0
 $$
 
-, where we check whether $\b{p}$ lies on the desirable side of the given
-surface, by requiring that the magnitude of the vector from an arbitrary point
+, where we check whether $\b{p}$ lies on the desired side of the given
+surface. We require that the magnitude of the vector from an arbitrary point
 on the surface to $\b{p}$ projected onto the normal vector be greater than 0 by
 utilizing the dot product operation.
 \TODO{is this explanation too much?}
@@ -423,12 +467,32 @@ $$
 This formula moves the particle along the triangle normal exactly to the
 triangle's surface. 
 
+\subsection{Position Constraint}
+Maybe the most straight-forward constraint is the Position Constraint, given as:
+\begin{align*}
+    C_{collision}(\b{p}) &= \lvert \b{p} - \b{p_{goal}} \rvert = 0
+    \\
+    \Delta \b{p} &= \b{p_{goal}} - \b{p}
+\end{align*}
+
+Moving the $\b{p}$ particle to the $\b{p_{goal}}$ position.
+
+We utilize the Position Constraint for keeping the first particle in each strand
+on the surface of the head.
+
+
 \section{Implementation}
-After introducing the general position based dynamics simulation method, we will
-dive into the specifics we settled with for our implementation for simulating
-hair.
+After introducing the general position based dynamics simulation method, we dive
+into the specifics we settled on for our hair simulation.
+
+The code is available at \url{http://git.sch.bme.hu/bobarna/brave-2}.
+
+\subsection{Datastructures}
 
-\subsection{Data:}
+The properties of particles introduced in chapter
+\ref{section:algorithmOverview}
+\nameref{section:algorithmOverview} got an additional color property. This is
+decision was made so hair with a gradient color could be simulated.
 
 \begin{verbatim}
     class Particle {
@@ -440,14 +504,49 @@ hair.
     }
 \end{verbatim}
 
-\section{Putting Hair on the Head}
+The strands are stored as a vector of vector of Particles. It is practical to
+keep related data packed right after each other in the memory for improving the
+performance of operations and function calls.
+
+
+\subsection{Constraints}
+A \texttt{Constraint} class with an abstract \texttt{solve()} method was
+implemented, storing each derived constraint class \emph{(e.g.
+PositionConstraint, BendingConstraint)} in a heterogen
+collection and calling each overriden \texttt{solve()} method when projecting
+the constraints in the iteration loop (line \lineRefSingle{16} of Algorithm
+\ref{alg:pbd}).
+
+This implementation proved to be not fast enough, lagging even with low particle
+counts. We could not discover the cause of this increased computing time, and
+decided to settle on another solution. Instead of the above mentioned, we
+store only the parameters that constraints operate on, and the simulation calls
+the relevant solve functions with these stored parameters.
+
 
+\subsection{Putting the Hair in the Hair Simulation}
+The $PBDSimulation$ class handles the simulation and rendering of the hair. It
+takes a $HeadObject$ and propagates hairstrands starting from its surface. Each
+strands first particle is fixed in place with a $PositionConstraint$, not
+letting it move away from the scalp.
+
+The geometry of the $HeadObject$ is read from an \texttt{OBJ} file. (\emph{See
+the Appendix \ref{section:appendixOBJ} \nameref{section:appendixOBJ}}.)
+
+The hair strands are propagated throughout the surface of the $HeadObject$ by
+proposing random $(\b{u}, \b{v}) \in [0 \ldots 1] \times [0 \ldots 1]$
+coordinates and settling on them if they satisfy requirements for the position
+of the hair -- like the corresponding face in world coordinates has an upward
+pointing normal vector. This propagation of strands on the surface of the head
+could be improved, as pointed out in sections
+\nameref{section:futureCustomization} and \nameref{section:futureHalton}.
+ 
 
 \section{Results}
 The implementation is available at \url{git.sch.bme.hu/bobarna/brave-2}. The
 program is able to handle up to around 500 individual hair strands, each
 consisting of around 30 particles in real time. With the implemented OBJ reader,
-it is possible to achieve diverse visual results in no time. The 
+it is possible to achieve diverse visual results in no time.
 
 An example result shown in figure \TODO{include figure}, and can be seen in the
 supplementary videos \TODO{Google Drive (?) link with the videos}.
@@ -472,7 +571,7 @@ of time was dedicated in the early stages of the project to investigate and
 explore the subject area. This left only a sub-optimal time for implementing all
 desired aspects of the simulation.
 
-\subsection{Hair-hair collisions}
+\subsection{Hair-hair Collisions}
 \label{subsec:future_work_collision}
 As it is computationally extensive to simulate each particle colliding with all
 of the other particles, a particle density field could be used. One such method
@@ -482,11 +581,27 @@ utilized in the \citet{FTLHair} paper for handling hair-hair collisions.
 Such a method could be used to dynamically generate collision constraints in
 line \lineRefSingle{13} of Algorithm~\ref{alg:pbd}.
 
-\subsection{Refinement and proper customizability of the propagation of hair
-strands on the head object.} 
+\subsection{Bending Constraint Improvements}
+As already mentioned in Section \ref{section:bendingConstraint}
+\nameref{section:bendingConstraint}, a huge improvement could be made by
+improving the bending constraint either by further exploring the possibilities
+of defining different distance constraints between pairs of particles.
+
+An alternative route could be to explore the possibility of a different type of
+bending constraint, for example by keeping a given angle between chunks of
+subsequent particles.
+
+\subsection{More and better customization} 
+\label{section:futureCustomization}
 A drawable texture map is considered for the ability to tell the simulation
 where to put the hair strands on the surface of the head.
 
+The \texttt{OBJ} reader could also be further developed into reading material,
+texture and/or color data for the objects.
+
+A common interface for importing and exporting different hairstyles could be
+developed.
+
 \subsection{Better customizability}
 In the current implementation there is no way to properly customize the look and
 feel of the hair without accessing the source code. A possible improvement could
@@ -496,6 +611,7 @@ much better control of the hair. Other properties, such as length of the hair
 segments and color of the hair could be set as well.
 
 \subsection{Sequence for randomizing hair positions}
+\label{section:futureHalton}
 In the current implementation, a standard C++ random number generator is
 utilized. Utilizing a low-discrepancy number sequence such as the Halton
 sequence for randomizing hair strand positions would be an improvement.
@@ -512,7 +628,7 @@ parts of the (OpenGL) rendering pipeline that could be utilized.
 \subsection{Moving to the GPU}
 The current implementation runs solely on the CPU. A big leap forward would be
 the utilization of the GPU. Compute shaders for computations are considered. The
-paper by \citet{UmenhofferSimulation} discusses a parametrization of the
+paper by \citet{UmenhofferSimulation} discusses a parallelization of the
 different constraint solves, although as they work on the same dataset, some
 computation problems are present during the parellelization of the
 problem.
@@ -542,16 +658,21 @@ method and properties.
 %% If your work has an appendix, this is the place to put it.
 \appendix
 
+\section{Constraint Projection} \label{appendix:ConstraintProjection}
+asd
+
+
 \section{Supplementary development}
 
 \subsection{OBJ Reader}
+\label{section:appendixOBJ}
 
 An OBJ reader utility was implemented as part of the project. As the OBJ file
 format \footnote{\url{http://paulbourke.net/dataformats/obj/}} describes a wide range
-of properties for objects. The present OBJ reader handles only the subset of
-these describtion options needed for the project. Lines containing other type of
-object descriptions were ignored, resulting in a successful file read if
-possible.
+of properties for objects, our OBJ reader handles only the subset of
+these description options -- those that are needed for the project. Not
+supported line types were simply ignored, still resulting in
+a successful file read if possible.
 
 \begin{table}[htb]
     \caption{Supported OBJ Data Types}